You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by li...@apache.org on 2026/04/25 15:38:45 UTC

(hbase) branch branch-2.6 updated: HBASE-30067 Upgrade hbase-server to use junit5 Part10 (#8121) (#8136)

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

liuxiaocs7 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 f28d09e80ca HBASE-30067 Upgrade hbase-server to use junit5 Part10 (#8121) (#8136)
f28d09e80ca is described below

commit f28d09e80caa12987b95e024b39507a0124a39ef
Author: Xiao Liu <li...@apache.org>
AuthorDate: Sat Apr 25 23:38:39 2026 +0800

    HBASE-30067 Upgrade hbase-server to use junit5 Part10 (#8121) (#8136)
    
    Signed-off-by: Duo Zhang <zh...@apache.org>
    
    (cherry picked from commit 73f8114c1aff64023a2cf7fc85c23b0d3f0b27ee)
    (cherry picked from commit d46b11ed2f02287596c77f50a2d8c058a5a12e76)
---
 .../apache/hadoop/hbase/rsgroup/RSGroupUtil.java   |   1 -
 ...leRSGroups.java => EnableRSGroupsTestBase.java} |  29 ++---
 .../hadoop/hbase/rsgroup/TestRSGroupConfig.java    |  36 ++----
 .../hbase/rsgroup/TestRSGroupMappingScript.java    |  32 +++--
 .../hadoop/hbase/rsgroup/TestRSGroupsAdmin1.java   |  79 +++++-------
 .../hadoop/hbase/rsgroup/TestRSGroupsAdmin2.java   |  77 ++++++------
 .../hadoop/hbase/rsgroup/TestRSGroupsBalance.java  |  39 +++---
 .../hadoop/hbase/rsgroup/TestRSGroupsBase.java     |  24 ++--
 .../hadoop/hbase/rsgroup/TestRSGroupsBasics.java   |  44 +++----
 .../hadoop/hbase/rsgroup/TestRSGroupsFallback.java |  35 +++---
 .../hadoop/hbase/rsgroup/TestRSGroupsKillRS.java   |  37 +++---
 .../hbase/rsgroup/TestRSGroupsOfflineMode.java     |  39 +++---
 .../hadoop/hbase/rsgroup/TestRSGroupsWithACL.java  |  25 ++--
 .../rsgroup/TestTableDescriptorWithRSGroup.java    |  99 +++++++--------
 .../rsgroup/TestUpdateRSGroupConfiguration.java    |  41 +++---
 ...leRpcServer.java => AbstractTestRpcServer.java} |  58 ++-------
 .../apache/hadoop/hbase/ipc/TestBufferChain.java   |  27 ++--
 .../apache/hadoop/hbase/ipc/TestCallRunner.java    |  56 ++++-----
 .../hadoop/hbase/ipc/TestFifoRpcScheduler.java     |  19 ++-
 .../apache/hadoop/hbase/ipc/TestHBaseClient.java   |  49 ++++----
 .../hbase/ipc/TestMasterFifoRpcScheduler.java      |  28 ++---
 .../hbase/ipc/TestMultipleServerPrincipalsIPC.java |  70 +++++------
 .../hbase/ipc/TestNettyChannelWritability.java     |  21 ++--
 .../hbase/ipc/TestNettyIPCCloseConnection.java     |  25 ++--
 .../hadoop/hbase/ipc/TestNettyRpcServer.java       |  77 ++++++------
 .../apache/hadoop/hbase/ipc/TestProtoBufRpc.java   |  56 ++++-----
 .../hadoop/hbase/ipc/TestRWQueueRpcExecutor.java   |  41 +++---
 .../hadoop/hbase/ipc/TestRpcClientLeaks.java       |  43 +++----
 .../hadoop/hbase/ipc/TestRpcHandlerException.java  |  39 +++---
 .../apache/hadoop/hbase/ipc/TestRpcMetrics.java    |  15 +--
 .../ipc/TestRpcServerSlowConnectionSetup.java      |  48 ++++---
 .../hbase/ipc/TestRpcServerTraceLogging.java       |  22 ++--
 .../hbase/ipc/TestRpcSkipInitialSaslHandshake.java |  29 ++---
 .../hadoop/hbase/ipc/TestSecureNettyRpcServer.java |  40 +++---
 .../hbase/ipc/TestSecureSimpleRpcServer.java       |  46 +++----
 .../hbase/ipc/TestSecurityRpcSentBytesMetrics.java |  27 ++--
 .../apache/hadoop/hbase/ipc/TestServerCall.java    |  35 +++---
 .../hadoop/hbase/ipc/TestSimpleRpcScheduler.java   |  52 ++++----
 .../hadoop/hbase/ipc/TestSimpleRpcServer.java      |  82 +++---------
 .../org/apache/hadoop/hbase/mob/MobTestUtil.java   |  18 +--
 .../apache/hadoop/hbase/mob/TestCachedMobFile.java |  35 ++----
 .../hbase/mob/TestDefaultMobStoreFlusher.java      |  65 +++++-----
 .../hbase/mob/TestExpiredMobFileCleaner.java       |  40 +++---
 .../hbase/mob/TestExpiredMobFileCleanerChore.java  |  53 ++++----
 .../hadoop/hbase/mob/TestMobCompactionOptMode.java |  11 +-
 .../mob/TestMobCompactionOptRegionBatchMode.java   |  23 ++--
 .../TestMobCompactionRegularRegionBatchMode.java   |  23 ++--
 .../hbase/mob/TestMobCompactionWithDefaults.java   | 100 +++++++--------
 .../hbase/mob/TestMobCompactionWithException.java  |  48 ++++---
 .../hadoop/hbase/mob/TestMobDataBlockEncoding.java |  20 ++-
 .../org/apache/hadoop/hbase/mob/TestMobFile.java   |  31 ++---
 .../apache/hadoop/hbase/mob/TestMobFileCache.java  |  24 ++--
 .../hadoop/hbase/mob/TestMobFileCleanupUtil.java   |  25 ++--
 .../apache/hadoop/hbase/mob/TestMobFileLink.java   |  31 ++---
 .../apache/hadoop/hbase/mob/TestMobFileName.java   |  24 ++--
 .../hadoop/hbase/mob/TestMobStoreCompaction.java   | 140 ++++++++++-----------
 .../hadoop/hbase/mob/TestMobStoreScanner.java      |  88 ++++++-------
 .../org/apache/hadoop/hbase/mob/TestMobUtils.java  |  21 ++--
 .../hbase/mob/TestMobWithByteBuffAllocator.java    |  28 ++---
 .../hbase/mob/TestRSMobFileCleanerChore.java       |  25 ++--
 .../hbase/namespace/TestNamespaceAuditor.java      | 110 ++++++++--------
 61 files changed, 1121 insertions(+), 1504 deletions(-)

diff --git a/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupUtil.java b/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupUtil.java
index 4e4d88fe23d..442529c0927 100644
--- a/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupUtil.java
+++ b/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupUtil.java
@@ -35,5 +35,4 @@ public final class RSGroupUtil {
     }
     return false;
   }
-
 }
diff --git a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestEnableRSGroups.java b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/EnableRSGroupsTestBase.java
similarity index 81%
rename from hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestEnableRSGroups.java
rename to hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/EnableRSGroupsTestBase.java
index c17efb74b73..0d73e01460c 100644
--- a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestEnableRSGroups.java
+++ b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/EnableRSGroupsTestBase.java
@@ -18,46 +18,34 @@
 package org.apache.hadoop.hbase.rsgroup;
 
 import static java.lang.Thread.sleep;
-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.HBaseTestingUtility;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;
-import org.apache.hadoop.hbase.testclassification.MediumTests;
 import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
-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.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-/**
- * Test enable RSGroup
- */
-@Category({ MediumTests.class })
-public class TestEnableRSGroups {
-
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestEnableRSGroups.class);
+public abstract class EnableRSGroupsTestBase {
 
-  protected static final Logger LOG = LoggerFactory.getLogger(TestEnableRSGroups.class);
+  protected static final Logger LOG = LoggerFactory.getLogger(EnableRSGroupsTestBase.class);
 
   private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
 
-  @BeforeClass
+  @BeforeAll
   public static void setUp() throws Exception {
     final Configuration conf = TEST_UTIL.getConfiguration();
     conf.setBoolean(CoprocessorHost.COPROCESSORS_ENABLED_CONF_KEY, true);
     TEST_UTIL.startMiniCluster(5);
   }
 
-  @AfterClass
+  @AfterAll
   public static void tearDown() throws Exception {
     LOG.info("to stop miniCluster");
     TEST_UTIL.shutdownMiniCluster();
@@ -91,5 +79,4 @@ public class TestEnableRSGroups {
 
     assertTrue(loadBalancer.isOnline());
   }
-
 }
diff --git a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupConfig.java b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupConfig.java
index c066002427a..6c735b92cb9 100644
--- a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupConfig.java
+++ b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupConfig.java
@@ -17,44 +17,34 @@
  */
 package org.apache.hadoop.hbase.rsgroup;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.constraint.ConstraintException;
 import org.apache.hadoop.hbase.testclassification.MediumTests;
-import org.junit.AfterClass;
-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.Tag;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInfo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@Category(MediumTests.class)
+@Tag(MediumTests.TAG)
 public class TestRSGroupConfig extends TestRSGroupsBase {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestRSGroupConfig.class);
-
-  @Rule
-  public TestName name = new TestName();
-
   protected static final Logger LOG = LoggerFactory.getLogger(TestRSGroupConfig.class);
 
-  @BeforeClass
+  @BeforeAll
   public static void setUpBeforeClass() throws Exception {
     TestRSGroupsBase.setUpTestBeforeClass();
   }
 
-  @AfterClass
+  @AfterAll
   public static void tearDownAfterClass() throws Exception {
     TestRSGroupsBase.tearDownAfterClass();
   }
@@ -65,8 +55,8 @@ public class TestRSGroupConfig extends TestRSGroupsBase {
   }
 
   @Test
-  public void testSetNonDefaultGroupConfiguration() throws IOException {
-    String group = getGroupName(name.getMethodName());
+  public void testSetNonDefaultGroupConfiguration(TestInfo testInfo) throws IOException {
+    String group = getGroupName(testInfo.getTestMethod().get().getName());
     rsGroupAdmin.addRSGroup(group);
     testSetConfiguration(group);
     rsGroupAdmin.removeRSGroup(group);
diff --git a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupMappingScript.java b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupMappingScript.java
index 8a72b9a594f..9c229ca526b 100644
--- a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupMappingScript.java
+++ b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupMappingScript.java
@@ -17,45 +17,41 @@
  */
 package org.apache.hadoop.hbase.rsgroup;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.FileReader;
 import java.io.IOException;
 import java.io.PrintWriter;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.rsgroup.RSGroupInfoManagerImpl.RSGroupMappingScript;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
-import org.junit.After;
-import org.junit.Assert;
-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.AfterEach;
+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;
 
-@Category({ SmallTests.class })
+@Tag(SmallTests.TAG)
 public class TestRSGroupMappingScript {
 
   private static final Logger LOG = LoggerFactory.getLogger(TestRSGroupMappingScript.class);
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestRSGroupMappingScript.class);
   private static final HBaseTestingUtility UTIL = new HBaseTestingUtility();
   private File script;
 
-  @BeforeClass
+  @BeforeAll
   public static void setupScript() throws Exception {
     String currentDir = new File("").getAbsolutePath();
     UTIL.getConfiguration().set(RSGroupMappingScript.RS_GROUP_MAPPING_SCRIPT,
       currentDir + "/rsgroup_table_mapping.sh");
   }
 
-  @Before
+  @BeforeEach
   public void setup() throws Exception {
     script = new File(UTIL.getConfiguration().get(RSGroupMappingScript.RS_GROUP_MAPPING_SCRIPT));
     if (!script.createNewFile()) {
@@ -97,19 +93,19 @@ public class TestRSGroupMappingScript {
     TableName testNamespace = TableName.valueOf("test", "should_be_in_test");
     String rsgroup =
       script.getRSGroup(testNamespace.getNamespaceAsString(), testNamespace.getQualifierAsString());
-    Assert.assertEquals("test", rsgroup);
+    assertEquals("test", rsgroup);
 
     TableName otherName = TableName.valueOf("whatever", "oh_foo_should_be_in_other");
     rsgroup = script.getRSGroup(otherName.getNamespaceAsString(), otherName.getQualifierAsString());
-    Assert.assertEquals("other", rsgroup);
+    assertEquals("other", rsgroup);
 
     TableName defaultName = TableName.valueOf("nono", "should_be_in_default");
     rsgroup =
       script.getRSGroup(defaultName.getNamespaceAsString(), defaultName.getQualifierAsString());
-    Assert.assertEquals("default", rsgroup);
+    assertEquals("default", rsgroup);
   }
 
-  @After
+  @AfterEach
   public void teardown() throws Exception {
     if (script.exists()) {
       script.delete();
diff --git a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsAdmin1.java b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsAdmin1.java
index 6bfe9578604..8e6a141a518 100644
--- a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsAdmin1.java
+++ b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsAdmin1.java
@@ -17,12 +17,12 @@
  */
 package org.apache.hadoop.hbase.rsgroup;
 
-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.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 
 import java.io.IOException;
 import java.util.Iterator;
@@ -30,7 +30,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.SortedSet;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.NamespaceDescriptor;
 import org.apache.hadoop.hbase.ServerName;
 import org.apache.hadoop.hbase.TableExistsException;
@@ -49,44 +48,39 @@ import org.apache.hadoop.hbase.net.Address;
 import org.apache.hadoop.hbase.quotas.QuotaUtil;
 import org.apache.hadoop.hbase.testclassification.MediumTests;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Assert;
-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.AfterEach;
+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.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.hbase.thirdparty.com.google.common.collect.Sets;
 
-@Category({ MediumTests.class })
+@Tag(MediumTests.TAG)
 public class TestRSGroupsAdmin1 extends TestRSGroupsBase {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestRSGroupsAdmin1.class);
-
   protected static final Logger LOG = LoggerFactory.getLogger(TestRSGroupsAdmin1.class);
 
-  @BeforeClass
+  @BeforeAll
   public static void setUp() throws Exception {
     setUpTestBeforeClass();
   }
 
-  @AfterClass
+  @AfterAll
   public static void tearDown() throws Exception {
     tearDownAfterClass();
   }
 
-  @Before
-  public void beforeMethod() throws Exception {
-    setUpBeforeMethod();
+  @BeforeEach
+  public void beforeMethod(TestInfo testInfo) throws Exception {
+    setUpBeforeMethod(testInfo);
   }
 
-  @After
+  @AfterEach
   public void afterMethod() throws Exception {
     tearDownAfterMethod();
   }
@@ -224,7 +218,7 @@ public class TestRSGroupsAdmin1 extends TestRSGroupsBase {
     rsGroupAdmin.moveServers(barGroup.getServers(), RSGroupInfo.DEFAULT_GROUP);
     rsGroupAdmin.removeRSGroup(barGroup.getName());
 
-    Assert.assertEquals(initNumGroups, rsGroupAdmin.listRSGroups().size());
+    assertEquals(initNumGroups, rsGroupAdmin.listRSGroups().size());
   }
 
   @Test
@@ -263,11 +257,9 @@ public class TestRSGroupsAdmin1 extends TestRSGroupsBase {
     rsGroupAdmin.moveTables(Sets.newHashSet(tableNameA, tableNameB), newGroup.getName());
 
     // verify group change
-    Assert.assertEquals(newGroup.getName(),
-      rsGroupAdmin.getRSGroupInfoOfTable(tableNameA).getName());
+    assertEquals(newGroup.getName(), rsGroupAdmin.getRSGroupInfoOfTable(tableNameA).getName());
 
-    Assert.assertEquals(newGroup.getName(),
-      rsGroupAdmin.getRSGroupInfoOfTable(tableNameB).getName());
+    assertEquals(newGroup.getName(), rsGroupAdmin.getRSGroupInfoOfTable(tableNameB).getName());
 
     // verify tables' not exist in old group
     Set<TableName> DefaultTables =
@@ -308,8 +300,7 @@ public class TestRSGroupsAdmin1 extends TestRSGroupsBase {
     rsGroupAdmin.moveTables(Sets.newHashSet(tableName), newGroup.getName());
 
     // verify group change
-    Assert.assertEquals(newGroup.getName(),
-      rsGroupAdmin.getRSGroupInfoOfTable(tableName).getName());
+    assertEquals(newGroup.getName(), rsGroupAdmin.getRSGroupInfoOfTable(tableName).getName());
 
     TEST_UTIL.waitFor(WAIT_TIMEOUT, new Waiter.Predicate<Exception>() {
       @Override
@@ -330,13 +321,12 @@ public class TestRSGroupsAdmin1 extends TestRSGroupsBase {
     // test truncate
     admin.disableTable(tableName);
     admin.truncateTable(tableName, true);
-    Assert.assertEquals(1, rsGroupAdmin.getRSGroupInfo(newGroup.getName()).getTables().size());
-    Assert.assertEquals(tableName,
-      rsGroupAdmin.getRSGroupInfo(newGroup.getName()).getTables().first());
+    assertEquals(1, rsGroupAdmin.getRSGroupInfo(newGroup.getName()).getTables().size());
+    assertEquals(tableName, rsGroupAdmin.getRSGroupInfo(newGroup.getName()).getTables().first());
 
     // verify removed table is removed from group
     TEST_UTIL.deleteTable(tableName);
-    Assert.assertEquals(0, rsGroupAdmin.getRSGroupInfo(newGroup.getName()).getTables().size());
+    assertEquals(0, rsGroupAdmin.getRSGroupInfo(newGroup.getName()).getTables().size());
 
     assertTrue(observer.preMoveTablesCalled);
     assertTrue(observer.postMoveTablesCalled);
@@ -371,8 +361,7 @@ public class TestRSGroupsAdmin1 extends TestRSGroupsBase {
     rsGroupAdmin.moveTables(Sets.newHashSet(tableName), newGroup.getName());
 
     // verify group change
-    Assert.assertEquals(newGroup.getName(),
-      rsGroupAdmin.getRSGroupInfoOfTable(tableName).getName());
+    assertEquals(newGroup.getName(), rsGroupAdmin.getRSGroupInfoOfTable(tableName).getName());
   }
 
   @Test
@@ -427,13 +416,13 @@ public class TestRSGroupsAdmin1 extends TestRSGroupsBase {
 
     try {
       admin.createTable(tableDescTwo, Bytes.toBytes("AAA"), Bytes.toBytes("ZZZ"), 6);
-      Assert.fail("Creation table should fail because of quota violation.");
+      fail("Creation table should fail because of quota violation.");
     } catch (Exception exp) {
       assertTrue(exp instanceof IOException);
       constraintViolated = true;
     } finally {
-      assertTrue("Constraint not violated for table " + tableDescTwo.getTableName(),
-        constraintViolated);
+      assertTrue(constraintViolated,
+        "Constraint not violated for table " + tableDescTwo.getTableName());
     }
     List<RSGroupInfo> rsGroupInfoList = rsGroupAdmin.listRSGroups();
     boolean foundTable2 = false;
@@ -446,8 +435,8 @@ public class TestRSGroupsAdmin1 extends TestRSGroupsBase {
         foundTable1 = true;
       }
     }
-    assertFalse("Found table2 in rsgroup list.", foundTable2);
-    assertTrue("Did not find table1 in rsgroup list", foundTable1);
+    assertFalse(foundTable2, "Found table2 in rsgroup list.");
+    assertTrue(foundTable1, "Did not find table1 in rsgroup list");
 
     TEST_UTIL.deleteTable(tableDescOne.getTableName());
     admin.deleteNamespace(nspDesc.getName());
@@ -480,7 +469,7 @@ public class TestRSGroupsAdmin1 extends TestRSGroupsBase {
     });
     SortedSet<TableName> tables =
       rsGroupAdmin.getRSGroupInfo(RSGroupInfo.DEFAULT_GROUP).getTables();
-    assertTrue("Table 't1' must be in 'default' rsgroup", tables.contains(tn1));
+    assertTrue(tables.contains(tn1), "Table 't1' must be in 'default' rsgroup");
 
     // Cleanup
     TEST_UTIL.deleteTable(tn1);
diff --git a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsAdmin2.java b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsAdmin2.java
index d0cc014d82d..73951f2e922 100644
--- a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsAdmin2.java
+++ b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsAdmin2.java
@@ -18,10 +18,10 @@
 package org.apache.hadoop.hbase.rsgroup;
 
 import static org.apache.hadoop.hbase.util.Threads.sleep;
-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 java.io.IOException;
 import java.util.ArrayList;
@@ -32,7 +32,6 @@ import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicBoolean;
 import org.apache.hadoop.hbase.ClusterMetrics.Option;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.ServerName;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.Waiter;
@@ -44,44 +43,39 @@ import org.apache.hadoop.hbase.net.Address;
 import org.apache.hadoop.hbase.testclassification.LargeTests;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Assert;
-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.AfterEach;
+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.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.hbase.thirdparty.com.google.common.collect.Sets;
 
-@Category({ LargeTests.class })
+@Tag(LargeTests.TAG)
 public class TestRSGroupsAdmin2 extends TestRSGroupsBase {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestRSGroupsAdmin2.class);
-
   protected static final Logger LOG = LoggerFactory.getLogger(TestRSGroupsAdmin2.class);
 
-  @BeforeClass
+  @BeforeAll
   public static void setUp() throws Exception {
     setUpTestBeforeClass();
   }
 
-  @AfterClass
+  @AfterAll
   public static void tearDown() throws Exception {
     tearDownAfterClass();
   }
 
-  @Before
-  public void beforeMethod() throws Exception {
-    setUpBeforeMethod();
+  @BeforeEach
+  public void beforeMethod(TestInfo testInfo) throws Exception {
+    setUpBeforeMethod(testInfo);
   }
 
-  @After
+  @AfterEach
   public void afterMethod() throws Exception {
     tearDownAfterMethod();
   }
@@ -159,7 +153,7 @@ public class TestRSGroupsAdmin2 extends TestRSGroupsBase {
     RSGroupInfo appInfo = addGroup(getGroupName(name.getMethodName()), 1);
     RSGroupInfo adminInfo = addGroup(getGroupName(name.getMethodName()), 1);
     RSGroupInfo dInfo = rsGroupAdmin.getRSGroupInfo(RSGroupInfo.DEFAULT_GROUP);
-    Assert.assertEquals(initNumGroups + 2, rsGroupAdmin.listRSGroups().size());
+    assertEquals(initNumGroups + 2, rsGroupAdmin.listRSGroups().size());
     assertEquals(1, adminInfo.getServers().size());
     assertEquals(1, appInfo.getServers().size());
     assertEquals(getNumServers() - 2, dInfo.getServers().size());
@@ -167,7 +161,7 @@ public class TestRSGroupsAdmin2 extends TestRSGroupsBase {
     rsGroupAdmin.removeRSGroup(appInfo.getName());
     rsGroupAdmin.moveServers(adminInfo.getServers(), RSGroupInfo.DEFAULT_GROUP);
     rsGroupAdmin.removeRSGroup(adminInfo.getName());
-    Assert.assertEquals(rsGroupAdmin.listRSGroups().size(), initNumGroups);
+    assertEquals(rsGroupAdmin.listRSGroups().size(), initNumGroups);
   }
 
   @Test
@@ -188,7 +182,7 @@ public class TestRSGroupsAdmin2 extends TestRSGroupsBase {
     } catch (IOException ex) {
       String exp = "Server foo:9999 is either offline or it does not exist.";
       String msg = "Expected '" + exp + "' in exception message: ";
-      assertTrue(msg + " " + ex.getMessage(), ex.getMessage().contains(exp));
+      assertTrue(ex.getMessage().contains(exp), msg + " " + ex.getMessage());
     }
 
     // test success case
@@ -217,10 +211,10 @@ public class TestRSGroupsAdmin2 extends TestRSGroupsBase {
     // test group removal
     LOG.info("Remove group " + barGroup.getName());
     rsGroupAdmin.removeRSGroup(barGroup.getName());
-    Assert.assertEquals(null, rsGroupAdmin.getRSGroupInfo(barGroup.getName()));
+    assertEquals(null, rsGroupAdmin.getRSGroupInfo(barGroup.getName()));
     LOG.info("Remove group " + fooGroup.getName());
     rsGroupAdmin.removeRSGroup(fooGroup.getName());
-    Assert.assertEquals(null, rsGroupAdmin.getRSGroupInfo(fooGroup.getName()));
+    assertEquals(null, rsGroupAdmin.getRSGroupInfo(fooGroup.getName()));
   }
 
   @Test
@@ -238,7 +232,7 @@ public class TestRSGroupsAdmin2 extends TestRSGroupsBase {
       String exp =
         "Server " + targetServer.getAddress() + " is an online server, not allowed to remove.";
       String msg = "Expected '" + exp + "' in exception message: ";
-      assertTrue(msg + " " + ex.getMessage(), ex.getMessage().contains(exp));
+      assertTrue(ex.getMessage().contains(exp), msg + " " + ex.getMessage());
     }
     assertTrue(newGroup.getServers().contains(targetServer.getAddress()));
 
@@ -269,7 +263,7 @@ public class TestRSGroupsAdmin2 extends TestRSGroupsBase {
       String exp = "Server " + targetServer.getAddress() + " is on the dead servers list,"
         + " Maybe it will come back again, not allowed to remove.";
       String msg = "Expected '" + exp + "' in exception message: ";
-      assertTrue(msg + " " + ex.getMessage(), ex.getMessage().contains(exp));
+      assertTrue(ex.getMessage().contains(exp), msg + " " + ex.getMessage());
     }
     assertTrue(newGroup.getServers().contains(targetServer.getAddress()));
 
@@ -338,7 +332,7 @@ public class TestRSGroupsAdmin2 extends TestRSGroupsBase {
     } catch (IOException ex) {
       String exp = "Server foo:9999 is either offline or it does not exist.";
       String msg = "Expected '" + exp + "' in exception message: ";
-      assertTrue(msg + " " + ex.getMessage(), ex.getMessage().contains(exp));
+      assertTrue(ex.getMessage().contains(exp), msg + " " + ex.getMessage());
     }
 
     // test move when src = dst
@@ -346,14 +340,14 @@ public class TestRSGroupsAdmin2 extends TestRSGroupsBase {
       Sets.newHashSet(tableName), RSGroupInfo.DEFAULT_GROUP);
 
     // verify default group info
-    Assert.assertEquals(oldDefaultGroupServerSize,
+    assertEquals(oldDefaultGroupServerSize,
       rsGroupAdmin.getRSGroupInfo(RSGroupInfo.DEFAULT_GROUP).getServers().size());
-    Assert.assertEquals(oldDefaultGroupTableSize,
+    assertEquals(oldDefaultGroupTableSize,
       rsGroupAdmin.getRSGroupInfo(RSGroupInfo.DEFAULT_GROUP).getTables().size());
 
     // verify new group info
-    Assert.assertEquals(1, rsGroupAdmin.getRSGroupInfo(newGroup.getName()).getServers().size());
-    Assert.assertEquals(0, rsGroupAdmin.getRSGroupInfo(newGroup.getName()).getTables().size());
+    assertEquals(1, rsGroupAdmin.getRSGroupInfo(newGroup.getName()).getServers().size());
+    assertEquals(0, rsGroupAdmin.getRSGroupInfo(newGroup.getName()).getTables().size());
 
     // get all region to move targetServer
     List<String> regionList = getTableRegionMap().get(tableName);
@@ -375,7 +369,7 @@ public class TestRSGroupsAdmin2 extends TestRSGroupsBase {
     });
 
     // verify that all region move to targetServer
-    Assert.assertEquals(5, getTableServerRegionMap().get(tableName).get(targetServer).size());
+    assertEquals(5, getTableServerRegionMap().get(tableName).get(targetServer).size());
 
     // move targetServer and table to newGroup
     LOG.info("moving server and table to newGroup");
@@ -383,8 +377,7 @@ public class TestRSGroupsAdmin2 extends TestRSGroupsBase {
       Sets.newHashSet(tableName), newGroup.getName());
 
     // verify group change
-    Assert.assertEquals(newGroup.getName(),
-      rsGroupAdmin.getRSGroupInfoOfTable(tableName).getName());
+    assertEquals(newGroup.getName(), rsGroupAdmin.getRSGroupInfoOfTable(tableName).getName());
 
     // verify servers' not exist in old group
     Set<Address> defaultServers =
@@ -405,7 +398,7 @@ public class TestRSGroupsAdmin2 extends TestRSGroupsBase {
     assertTrue(newGroupTables.contains(tableName));
 
     // verify that all region still assgin on targetServer
-    Assert.assertEquals(5, getTableServerRegionMap().get(tableName).get(targetServer).size());
+    assertEquals(5, getTableServerRegionMap().get(tableName).get(targetServer).size());
 
     assertTrue(observer.preMoveServersAndTables);
     assertTrue(observer.postMoveServersAndTables);
@@ -455,7 +448,7 @@ public class TestRSGroupsAdmin2 extends TestRSGroupsBase {
     // test group removal
     LOG.info("Remove group " + fooGroup.getName());
     rsGroupAdmin.removeRSGroup(fooGroup.getName());
-    Assert.assertEquals(null, rsGroupAdmin.getRSGroupInfo(fooGroup.getName()));
+    assertEquals(null, rsGroupAdmin.getRSGroupInfo(fooGroup.getName()));
   }
 
   @Test
@@ -673,7 +666,7 @@ public class TestRSGroupsAdmin2 extends TestRSGroupsBase {
     // This test case is meant to be used for verifying the performance quickly by a developer.
     // Moving 100 regions takes much less than 15000 ms. Given 15000 ms so test cases passes
     // on all environment.
-    assertTrue(msg, timeTaken < 15000);
+    assertTrue(timeTaken < 15000, msg);
     LOG.info("Time taken to move a table with 100 region is {} ms", timeTaken);
   }
 }
diff --git a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsBalance.java b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsBalance.java
index c2a7ac92d3e..d156d198d60 100644
--- a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsBalance.java
+++ b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsBalance.java
@@ -17,13 +17,12 @@
  */
 package org.apache.hadoop.hbase.rsgroup;
 
-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.List;
 import java.util.Map;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.NamespaceDescriptor;
 import org.apache.hadoop.hbase.ServerName;
@@ -39,43 +38,39 @@ import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
 import org.apache.hadoop.hbase.master.HMaster;
 import org.apache.hadoop.hbase.testclassification.MediumTests;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.junit.After;
-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.AfterEach;
+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.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.hbase.thirdparty.com.google.common.collect.Sets;
 
-@Category({ MediumTests.class })
+@Tag(MediumTests.TAG)
 public class TestRSGroupsBalance extends TestRSGroupsBase {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestRSGroupsBalance.class);
-
   protected static final Logger LOG = LoggerFactory.getLogger(TestRSGroupsBalance.class);
 
-  @BeforeClass
+  @BeforeAll
   public static void setUp() throws Exception {
     setUpTestBeforeClass();
   }
 
-  @AfterClass
+  @AfterAll
   public static void tearDown() throws Exception {
     tearDownAfterClass();
   }
 
-  @Before
-  public void beforeMethod() throws Exception {
-    setUpBeforeMethod();
+  @BeforeEach
+  public void beforeMethod(TestInfo testInfo) throws Exception {
+    setUpBeforeMethod(testInfo);
   }
 
-  @After
+  @AfterEach
   public void afterMethod() throws Exception {
     tearDownAfterMethod();
   }
diff --git a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsBase.java b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsBase.java
index ee8d30448af..54946f303bb 100644
--- a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsBase.java
+++ b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsBase.java
@@ -17,7 +17,7 @@
  */
 package org.apache.hadoop.hbase.rsgroup;
 
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -57,8 +57,7 @@ import org.apache.hadoop.hbase.master.MasterCoprocessorHost;
 import org.apache.hadoop.hbase.master.ServerManager;
 import org.apache.hadoop.hbase.master.snapshot.SnapshotManager;
 import org.apache.hadoop.hbase.net.Address;
-import org.junit.Rule;
-import org.junit.rules.TestName;
+import org.junit.jupiter.api.TestInfo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -87,9 +86,20 @@ public abstract class TestRSGroupsBase extends AbstractTestUpdateConfiguration {
   public final static int NUM_SLAVES_BASE = 4; // number of slaves for the smallest cluster
   public static int NUM_DEAD_SERVERS = 0;
 
+  protected static final class MethodName {
+    private String methodName;
+
+    public String getMethodName() {
+      return methodName;
+    }
+
+    void setMethodName(String methodName) {
+      this.methodName = methodName;
+    }
+  }
+
   // Per test variables
-  @Rule
-  public TestName name = new TestName();
+  protected final MethodName name = new MethodName();
   protected TableName tableName;
 
   public static void setUpTestBeforeClass() throws Exception {
@@ -131,7 +141,8 @@ public abstract class TestRSGroupsBase extends AbstractTestUpdateConfiguration {
     TEST_UTIL.shutdownMiniCluster();
   }
 
-  public void setUpBeforeMethod() throws Exception {
+  public void setUpBeforeMethod(TestInfo testInfo) throws Exception {
+    name.setMethodName(testInfo.getTestMethod().get().getName());
     LOG.info(name.getMethodName());
     tableName = TableName.valueOf(tablePrefix + "_" + name.getMethodName());
     if (!INIT) {
@@ -487,5 +498,4 @@ public abstract class TestRSGroupsBase extends AbstractTestUpdateConfiguration {
       postGetRSGroupInfoOfServerCalled = true;
     }
   }
-
 }
diff --git a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsBasics.java b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsBasics.java
index 028cd4e66b8..b30486cdc2d 100644
--- a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsBasics.java
+++ b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsBasics.java
@@ -17,17 +17,16 @@
  */
 package org.apache.hadoop.hbase.rsgroup;
 
-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 java.io.IOException;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.NamespaceDescriptor;
 import org.apache.hadoop.hbase.ServerName;
 import org.apache.hadoop.hbase.TableName;
@@ -40,44 +39,39 @@ import org.apache.hadoop.hbase.quotas.QuotaTableUtil;
 import org.apache.hadoop.hbase.quotas.QuotaUtil;
 import org.apache.hadoop.hbase.testclassification.MediumTests;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Assert;
-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.AfterEach;
+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.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.hbase.thirdparty.com.google.common.collect.Lists;
 
-@Category({ MediumTests.class })
+@Tag(MediumTests.TAG)
 public class TestRSGroupsBasics extends TestRSGroupsBase {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestRSGroupsBasics.class);
-
   protected static final Logger LOG = LoggerFactory.getLogger(TestRSGroupsBasics.class);
 
-  @BeforeClass
+  @BeforeAll
   public static void setUp() throws Exception {
     setUpTestBeforeClass();
   }
 
-  @AfterClass
+  @AfterAll
   public static void tearDown() throws Exception {
     tearDownAfterClass();
   }
 
-  @Before
-  public void beforeMethod() throws Exception {
-    setUpBeforeMethod();
+  @BeforeEach
+  public void beforeMethod(TestInfo testInfo) throws Exception {
+    setUpBeforeMethod(testInfo);
   }
 
-  @After
+  @AfterEach
   public void afterMethod() throws Exception {
     tearDownAfterMethod();
   }
@@ -133,7 +127,7 @@ public class TestRSGroupsBasics extends TestRSGroupsBase {
     });
     ServerName targetServer = getServerName(appInfo.getServers().iterator().next());
     // verify it was assigned to the right group
-    Assert.assertEquals(1, admin.getRegions(targetServer).size());
+    assertEquals(1, admin.getRegions(targetServer).size());
   }
 
   @Test
diff --git a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsFallback.java b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsFallback.java
index 12cc5df1cab..028ae5b6f1b 100644
--- a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsFallback.java
+++ b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsFallback.java
@@ -17,12 +17,11 @@
  */
 package org.apache.hadoop.hbase.rsgroup;
 
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 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.TableName;
 import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;
@@ -34,28 +33,24 @@ import org.apache.hadoop.hbase.procedure2.ProcedureTestingUtility;
 import org.apache.hadoop.hbase.testclassification.MediumTests;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.JVMClusterUtil;
-import org.junit.After;
-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.AfterEach;
+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.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@Category(MediumTests.class)
+@Tag(MediumTests.TAG)
 public class TestRSGroupsFallback extends TestRSGroupsBase {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestRSGroupsFallback.class);
-
   protected static final Logger LOG = LoggerFactory.getLogger(TestRSGroupsFallback.class);
 
   private static final String FALLBACK_GROUP = "fallback";
 
-  @BeforeClass
+  @BeforeAll
   public static void setUp() throws Exception {
     Configuration conf = TEST_UTIL.getConfiguration();
     conf.setBoolean(RSGroupBasedLoadBalancer.FALLBACK_GROUP_ENABLE_KEY, true);
@@ -64,17 +59,17 @@ public class TestRSGroupsFallback extends TestRSGroupsBase {
     master.balanceSwitch(true);
   }
 
-  @AfterClass
+  @AfterAll
   public static void tearDown() throws Exception {
     tearDownAfterClass();
   }
 
-  @Before
-  public void beforeMethod() throws Exception {
-    setUpBeforeMethod();
+  @BeforeEach
+  public void beforeMethod(TestInfo testInfo) throws Exception {
+    setUpBeforeMethod(testInfo);
   }
 
-  @After
+  @AfterEach
   public void afterMethod() throws Exception {
     tearDownAfterMethod();
   }
diff --git a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsKillRS.java b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsKillRS.java
index 3f82362a1ba..ac7253b3948 100644
--- a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsKillRS.java
+++ b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsKillRS.java
@@ -18,8 +18,8 @@
 package org.apache.hadoop.hbase.rsgroup;
 
 import static org.apache.hadoop.hbase.util.Threads.sleep;
-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.lang.reflect.Field;
 import java.util.ArrayList;
@@ -27,7 +27,6 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.NamespaceDescriptor;
 import org.apache.hadoop.hbase.ServerName;
@@ -46,28 +45,24 @@ import org.apache.hadoop.hbase.testclassification.LargeTests;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.JVMClusterUtil;
 import org.apache.hadoop.hbase.util.VersionInfo;
-import org.junit.After;
-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.AfterEach;
+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.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.hbase.thirdparty.com.google.common.collect.Sets;
 
-@Category(LargeTests.class)
+@Tag(LargeTests.TAG)
 public class TestRSGroupsKillRS extends TestRSGroupsBase {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestRSGroupsKillRS.class);
-
   protected static final Logger LOG = LoggerFactory.getLogger(TestRSGroupsKillRS.class);
 
-  @BeforeClass
+  @BeforeAll
   public static void setUp() throws Exception {
     // avoid all the handlers blocked when meta is offline, and regionServerReport can not be
     // processed which causes dead lock.
@@ -77,17 +72,17 @@ public class TestRSGroupsKillRS extends TestRSGroupsBase {
     setUpTestBeforeClass();
   }
 
-  @AfterClass
+  @AfterAll
   public static void tearDown() throws Exception {
     tearDownAfterClass();
   }
 
-  @Before
-  public void beforeMethod() throws Exception {
-    setUpBeforeMethod();
+  @BeforeEach
+  public void beforeMethod(TestInfo testInfo) throws Exception {
+    setUpBeforeMethod(testInfo);
   }
 
-  @After
+  @AfterEach
   public void afterMethod() throws Exception {
     tearDownAfterMethod();
   }
diff --git a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsOfflineMode.java b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsOfflineMode.java
index 0d1810101a3..5a161534341 100644
--- a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsOfflineMode.java
+++ b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsOfflineMode.java
@@ -17,10 +17,9 @@
  */
 package org.apache.hadoop.hbase.rsgroup;
 
-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 org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseCluster;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.HConstants;
@@ -36,14 +35,11 @@ import org.apache.hadoop.hbase.master.ServerManager;
 import org.apache.hadoop.hbase.regionserver.HRegionServer;
 import org.apache.hadoop.hbase.testclassification.MediumTests;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.junit.AfterClass;
-import org.junit.Assert;
-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.Tag;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInfo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -56,12 +52,8 @@ import org.apache.hbase.thirdparty.com.google.common.collect.Sets;
 // table isn't available. It then kills the active master and waits for backup master to come
 // online. In new master, RSGroupInfoManagerImpl gets the data from zk and waits for the expected
 // assignment with a timeout.
-@Category(MediumTests.class)
-public class TestRSGroupsOfflineMode {
-
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestRSGroupsOfflineMode.class);
+@Tag(MediumTests.TAG)
+public class TestRSGroupsOfflineMode extends TestRSGroupsBase {
 
   private static final Logger LOG = LoggerFactory.getLogger(TestRSGroupsOfflineMode.class);
   private static HMaster master;
@@ -70,10 +62,7 @@ public class TestRSGroupsOfflineMode {
   private static HBaseCluster cluster;
   private final static long WAIT_TIMEOUT = 60000 * 5;
 
-  @Rule
-  public TestName name = new TestName();
-
-  @BeforeClass
+  @BeforeAll
   public static void setUp() throws Exception {
     TEST_UTIL = new HBaseTestingUtility();
     TEST_UTIL.getConfiguration().set(HConstants.HBASE_MASTER_LOADBALANCER_CLASS,
@@ -99,15 +88,15 @@ public class TestRSGroupsOfflineMode {
     });
   }
 
-  @AfterClass
+  @AfterAll
   public static void tearDown() throws Exception {
     TEST_UTIL.shutdownMiniCluster();
   }
 
   @Test
-  public void testOffline() throws Exception, InterruptedException {
+  public void testOffline(TestInfo testInfo) throws Exception, InterruptedException {
     // Table should be after group table name so it gets assigned later.
-    final TableName failoverTable = TableName.valueOf(name.getMethodName());
+    final TableName failoverTable = TableName.valueOf(testInfo.getTestMethod().get().getName());
     TEST_UTIL.createTable(failoverTable, Bytes.toBytes("f"));
     final HRegionServer killRS = ((MiniHBaseCluster) cluster).getRegionServer(0);
     final HRegionServer groupRS = ((MiniHBaseCluster) cluster).getRegionServer(1);
@@ -185,7 +174,7 @@ public class TestRSGroupsOfflineMode {
         return failoverRS.getRegions(failoverTable).size() >= 1;
       }
     });
-    Assert.assertEquals(0, failoverRS.getRegions(RSGroupInfoManager.RSGROUP_TABLE_NAME).size());
+    assertEquals(0, failoverRS.getRegions(RSGroupInfoManager.RSGROUP_TABLE_NAME).size());
 
     // Need this for minicluster to shutdown cleanly.
     master.stopMaster();
diff --git a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.java b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.java
index 700d03c3cbf..cfb7f83ba85 100644
--- a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.java
+++ b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.java
@@ -18,11 +18,10 @@
 package org.apache.hadoop.hbase.rsgroup;
 
 import static org.apache.hadoop.hbase.AuthUtil.toGroupEntry;
-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 org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.TableName;
@@ -41,11 +40,10 @@ import org.apache.hadoop.hbase.security.access.SecureTestUtil;
 import org.apache.hadoop.hbase.testclassification.MediumTests;
 import org.apache.hadoop.hbase.testclassification.SecurityTests;
 import org.apache.hadoop.hbase.util.Bytes;
-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;
 
@@ -53,13 +51,10 @@ import org.slf4j.LoggerFactory;
  * Performs authorization checks for rsgroup operations, according to different levels of authorized
  * users.
  */
-@Category({ SecurityTests.class, MediumTests.class })
+@Tag(SecurityTests.TAG)
+@Tag(MediumTests.TAG)
 public class TestRSGroupsWithACL extends SecureTestUtil {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestRSGroupsWithACL.class);
-
   private static final Logger LOG = LoggerFactory.getLogger(TestRSGroupsWithACL.class);
   private static TableName TEST_TABLE = TableName.valueOf("testtable1");
   private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
@@ -95,7 +90,7 @@ public class TestRSGroupsWithACL extends SecureTestUtil {
 
   private static RSGroupAdminEndpoint rsGroupAdminEndpoint;
 
-  @BeforeClass
+  @BeforeAll
   public static void setupBeforeClass() throws Exception {
     // setup configuration
     conf = TEST_UTIL.getConfiguration();
@@ -194,7 +189,7 @@ public class TestRSGroupsWithACL extends SecureTestUtil {
       PermissionStorage.getNamespacePermissions(conf, TEST_TABLE.getNamespaceAsString()).size());
   }
 
-  @AfterClass
+  @AfterAll
   public static void tearDownAfterClass() throws Exception {
     cleanUp();
     TEST_UTIL.shutdownMiniCluster();
diff --git a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestTableDescriptorWithRSGroup.java b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestTableDescriptorWithRSGroup.java
index 38f04e3089f..41df01b4dc6 100644
--- a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestTableDescriptorWithRSGroup.java
+++ b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestTableDescriptorWithRSGroup.java
@@ -17,17 +17,16 @@
  */
 package org.apache.hadoop.hbase.rsgroup;
 
-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 java.io.IOException;
 import java.util.List;
 import java.util.Optional;
 import java.util.regex.Pattern;
 import org.apache.hadoop.hbase.DoNotRetryIOException;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.Waiter;
 import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;
@@ -38,40 +37,37 @@ import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
 import org.apache.hadoop.hbase.constraint.ConstraintException;
 import org.apache.hadoop.hbase.testclassification.LargeTests;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.junit.After;
-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.AfterEach;
+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.collect.Sets;
 
-@Category({ LargeTests.class })
+@Tag(LargeTests.TAG)
 public class TestTableDescriptorWithRSGroup extends TestRSGroupsBase {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestTableDescriptorWithRSGroup.class);
   private final byte[] familyNameBytes = Bytes.toBytes("f1");
 
-  @BeforeClass
+  @BeforeAll
   public static void setUp() throws Exception {
     setUpTestBeforeClass();
   }
 
-  @AfterClass
+  @AfterAll
   public static void tearDown() throws Exception {
     tearDownAfterClass();
   }
 
-  @Before
-  public void beforeMethod() throws Exception {
-    setUpBeforeMethod();
+  @BeforeEach
+  public void beforeMethod(TestInfo testInfo) throws Exception {
+    setUpBeforeMethod(testInfo);
   }
 
-  @After
+  @AfterEach
   public void afterMethod() throws Exception {
     tearDownAfterMethod();
   }
@@ -116,8 +112,8 @@ public class TestTableDescriptorWithRSGroup extends TestRSGroupsBase {
     });
     TableDescriptor descriptor = admin.getConnection().getTable(tableName).getDescriptor();
     Optional<String> regionServerGroup = descriptor.getRegionServerGroup();
-    assertTrue("RSGroup info is not updated into TableDescriptor when table is created.",
-      regionServerGroup.isPresent());
+    assertTrue(regionServerGroup.isPresent(),
+      "RSGroup info is not updated into TableDescriptor when table is created.");
     assertEquals(newGroup, regionServerGroup.get());
   }
 
@@ -130,8 +126,8 @@ public class TestTableDescriptorWithRSGroup extends TestRSGroupsBase {
     createTableWithRSGroupDetail(rsGroup1.getName());
     TableDescriptor descriptor = admin.getConnection().getTable(tableName).getDescriptor();
     Optional<String> regionServerGroup = descriptor.getRegionServerGroup();
-    assertTrue("RSGroup info is not updated into TableDescriptor when table created",
-      regionServerGroup.isPresent());
+    assertTrue(regionServerGroup.isPresent(),
+      "RSGroup info is not updated into TableDescriptor when table created");
     assertEquals(rsGroup1.getName(), regionServerGroup.get());
 
     // moveTables
@@ -139,8 +135,8 @@ public class TestTableDescriptorWithRSGroup extends TestRSGroupsBase {
     rsGroupAdmin.moveTables(Sets.newHashSet(tableName), rsGroup2.getName());
     descriptor = admin.getConnection().getTable(tableName).getDescriptor();
     regionServerGroup = descriptor.getRegionServerGroup();
-    assertTrue("RSGroup info is not updated into TableDescriptor when table moved",
-      regionServerGroup.isPresent());
+    assertTrue(regionServerGroup.isPresent(),
+      "RSGroup info is not updated into TableDescriptor when table moved");
     assertEquals(rsGroup2.getName(), regionServerGroup.get());
   }
 
@@ -153,8 +149,8 @@ public class TestTableDescriptorWithRSGroup extends TestRSGroupsBase {
     createTableWithRSGroupDetail(rsGroup1.getName());
     TableDescriptor descriptor = admin.getConnection().getTable(tableName).getDescriptor();
     Optional<String> regionServerGroup = descriptor.getRegionServerGroup();
-    assertTrue("RSGroup info is not updated into TableDescriptor when table created",
-      regionServerGroup.isPresent());
+    assertTrue(regionServerGroup.isPresent(),
+      "RSGroup info is not updated into TableDescriptor when table created");
     assertEquals(rsGroup1.getName(), regionServerGroup.get());
 
     // moveServersAndTables
@@ -163,8 +159,8 @@ public class TestTableDescriptorWithRSGroup extends TestRSGroupsBase {
 
     descriptor = admin.getConnection().getTable(tableName).getDescriptor();
     regionServerGroup = descriptor.getRegionServerGroup();
-    assertTrue("RSGroup info is not updated into TableDescriptor when table moved",
-      regionServerGroup.isPresent());
+    assertTrue(regionServerGroup.isPresent(),
+      "RSGroup info is not updated into TableDescriptor when table moved");
     assertEquals(RSGroupInfo.DEFAULT_GROUP, regionServerGroup.get());
 
   }
@@ -180,8 +176,8 @@ public class TestTableDescriptorWithRSGroup extends TestRSGroupsBase {
     rsGroupAdmin.renameRSGroup(oldGroup.getName(), newGroupName);
     TableDescriptor descriptor = admin.getConnection().getTable(tableName).getDescriptor();
     Optional<String> regionServerGroup = descriptor.getRegionServerGroup();
-    assertTrue("RSGroup info is not updated into TableDescriptor when rs group renamed",
-      regionServerGroup.isPresent());
+    assertTrue(regionServerGroup.isPresent(),
+      "RSGroup info is not updated into TableDescriptor when rs group renamed");
     assertEquals(newGroupName, regionServerGroup.get());
   }
 
@@ -216,8 +212,8 @@ public class TestTableDescriptorWithRSGroup extends TestRSGroupsBase {
     assertEquals(rsGroup1.getName(), rsGroupInfoOfTable.getName());
     TableDescriptor descriptor = admin.getConnection().getTable(clonedTable1).getDescriptor();
     Optional<String> regionServerGroup = descriptor.getRegionServerGroup();
-    assertTrue("RSGroup info is not updated into TableDescriptor when table is cloned.",
-      regionServerGroup.isPresent());
+    assertTrue(regionServerGroup.isPresent(),
+      "RSGroup info is not updated into TableDescriptor when table is cloned.");
     assertEquals(rsGroup1.getName(), regionServerGroup.get());
 
     // Delete table's original rs group, clone should fail.
@@ -244,8 +240,8 @@ public class TestTableDescriptorWithRSGroup extends TestRSGroupsBase {
     createTableWithRSGroupDetail(rsGroup1.getName());
     TableDescriptor descriptor = admin.getConnection().getTable(tableName).getDescriptor();
     Optional<String> regionServerGroup = descriptor.getRegionServerGroup();
-    assertTrue("RSGroup info is not updated into TableDescriptor when table created",
-      regionServerGroup.isPresent());
+    assertTrue(regionServerGroup.isPresent(),
+      "RSGroup info is not updated into TableDescriptor when table created");
     assertEquals(rsGroup1.getName(), regionServerGroup.get());
 
     final TableDescriptor newTableDescriptor =
@@ -272,8 +268,8 @@ public class TestTableDescriptorWithRSGroup extends TestRSGroupsBase {
     assertEquals(1, rsGroup2.getTables().size());
     descriptor = admin.getConnection().getTable(tableName).getDescriptor();
     regionServerGroup = descriptor.getRegionServerGroup();
-    assertTrue("RSGroup info is not updated into TableDescriptor when table is modified.",
-      regionServerGroup.isPresent());
+    assertTrue(regionServerGroup.isPresent(),
+      "RSGroup info is not updated into TableDescriptor when table is modified.");
     assertEquals("rsGroup2", regionServerGroup.get());
   }
 
@@ -298,8 +294,8 @@ public class TestTableDescriptorWithRSGroup extends TestRSGroupsBase {
         e.getCause().getMessage().contains("Table should have at least one column family"));
     }
     rsGroup2 = rsGroupAdmin.getRSGroupInfo(rsGroup2.getName());
-    assertEquals("Table must not have moved to RSGroup as table modify failed", 0,
-      rsGroup2.getTables().size());
+    assertEquals(0, rsGroup2.getTables().size(),
+      "Table must not have moved to RSGroup as table modify failed");
   }
 
   @Test
@@ -318,8 +314,8 @@ public class TestTableDescriptorWithRSGroup extends TestRSGroupsBase {
         e.getCause().getMessage().contains("Table should have at least one column family"));
     }
     rsGroup1 = rsGroupAdmin.getRSGroupInfo(rsGroup1.getName());
-    assertEquals("Table must not have moved to RSGroup as table create operation failed", 0,
-      rsGroup1.getTables().size());
+    assertEquals(0, rsGroup1.getTables().size(),
+      "Table must not have moved to RSGroup as table create operation failed");
   }
 
   @Test
@@ -346,21 +342,22 @@ public class TestTableDescriptorWithRSGroup extends TestRSGroupsBase {
     // create table with no rs group info
     createTable(table2, null);
     rsGroupAdmin.moveTables(Sets.newHashSet(tableName), rsGroup1.getName());
-    assertTrue("RSGroup info is not updated into TableDescriptor when table created",
-      admin.getConnection().getTable(tableName).getDescriptor().getRegionServerGroup().isPresent());
+    assertTrue(
+      admin.getConnection().getTable(tableName).getDescriptor().getRegionServerGroup().isPresent(),
+      "RSGroup info is not updated into TableDescriptor when table created");
     assertFalse(
+      admin.getConnection().getTable(table2).getDescriptor().getRegionServerGroup().isPresent(),
       "Table descriptor should not have been updated "
-        + "as rs group info was not stored in table descriptor.",
-      admin.getConnection().getTable(table2).getDescriptor().getRegionServerGroup().isPresent());
+        + "as rs group info was not stored in table descriptor.");
 
     final String rsGroup2 = "rsGroup2";
     rsGroupAdmin.renameRSGroup(rsGroup1.getName(), rsGroup2);
     assertEquals(rsGroup2,
       admin.getConnection().getTable(tableName).getDescriptor().getRegionServerGroup().get());
     assertFalse(
+      admin.getConnection().getTable(table2).getDescriptor().getRegionServerGroup().isPresent(),
       "Table descriptor should not have been updated "
-        + "as rs group info was not stored in table descriptor.",
-      admin.getConnection().getTable(table2).getDescriptor().getRegionServerGroup().isPresent());
+        + "as rs group info was not stored in table descriptor.");
   }
 
   @Test
@@ -377,7 +374,7 @@ public class TestTableDescriptorWithRSGroup extends TestRSGroupsBase {
     RSGroupInfo rsGroup2 = addGroup("rsGroup2", 1);
     rsGroupAdmin.moveTables(Sets.newHashSet(tableName, table2), rsGroup2.getName());
     rsGroup2 = rsGroupAdmin.getRSGroupInfo(rsGroup2.getName());
-    assertEquals("Table movement failed.", 2, rsGroup2.getTables().size());
+    assertEquals(2, rsGroup2.getTables().size(), "Table movement failed.");
   }
 
   private void createTable(TableName tName, String rsGroupName) throws Exception {
diff --git a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestUpdateRSGroupConfiguration.java b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestUpdateRSGroupConfiguration.java
index 27f8cbb7ece..7b09b6874a9 100644
--- a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestUpdateRSGroupConfiguration.java
+++ b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestUpdateRSGroupConfiguration.java
@@ -17,55 +17,50 @@
  */
 package org.apache.hadoop.hbase.rsgroup;
 
-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 org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.net.Address;
 import org.apache.hadoop.hbase.testclassification.MediumTests;
 import org.apache.hadoop.hbase.util.JVMClusterUtil;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeAll;
+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.junit.jupiter.api.TestInfo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.hbase.thirdparty.com.google.common.collect.Iterables;
 
-@Category({ MediumTests.class })
+@Tag(MediumTests.TAG)
 public class TestUpdateRSGroupConfiguration extends TestRSGroupsBase {
   protected static final Logger LOG = LoggerFactory.getLogger(TestUpdateRSGroupConfiguration.class);
-
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestUpdateRSGroupConfiguration.class);
   private static final String TEST_GROUP = "test";
   private static final String TEST2_GROUP = "test2";
 
-  @BeforeClass
+  @BeforeAll
   public static void setUp() throws Exception {
     setUpConfigurationFiles(TEST_UTIL);
     setUpTestBeforeClass();
     addResourceToRegionServerConfiguration(TEST_UTIL);
   }
 
-  @AfterClass
+  @AfterAll
   public static void tearDown() throws Exception {
     tearDownAfterClass();
   }
 
-  @Before
-  public void beforeMethod() throws Exception {
-    setUpBeforeMethod();
+  @BeforeEach
+  public void beforeMethod(TestInfo testInfo) throws Exception {
+    setUpBeforeMethod(testInfo);
   }
 
-  @After
+  @AfterEach
   public void afterMethod() throws Exception {
     tearDownAfterMethod();
   }
@@ -79,7 +74,7 @@ public class TestUpdateRSGroupConfiguration extends TestRSGroupsBase {
   // This test relies on a disallowed API change in RSGroupInfo and was also found to be
   // flaky. REVERTED from branch-2.5 and branch-2.
   @Test
-  @Ignore
+  @Disabled
   public void testCustomOnlineConfigChangeInRSGroup() throws Exception {
     RSGroupInfo testRSGroup = addGroup(TEST_GROUP, 1);
     RSGroupInfo test2RSGroup = addGroup(TEST2_GROUP, 1);
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestSimpleRpcServer.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/AbstractTestRpcServer.java
similarity index 63%
copy from hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestSimpleRpcServer.java
copy to hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/AbstractTestRpcServer.java
index 2bb50cb3d42..eed47e8951d 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestSimpleRpcServer.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/AbstractTestRpcServer.java
@@ -17,13 +17,11 @@
  */
 package org.apache.hadoop.hbase.ipc;
 
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.TableName;
-import org.apache.hadoop.hbase.TableNameTestRule;
 import org.apache.hadoop.hbase.client.Get;
 import org.apache.hadoop.hbase.client.Put;
 import org.apache.hadoop.hbase.client.Result;
@@ -31,23 +29,12 @@ import org.apache.hadoop.hbase.client.Table;
 import org.apache.hadoop.hbase.client.TableDescriptor;
 import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
 import org.apache.hadoop.hbase.regionserver.DisabledRegionSplitPolicy;
-import org.apache.hadoop.hbase.testclassification.MediumTests;
-import org.apache.hadoop.hbase.testclassification.RPCTests;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.LoadTestKVGenerator;
-import org.junit.AfterClass;
-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.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.TestInfo;
 
-@Category({ RPCTests.class, MediumTests.class })
-public class TestSimpleRpcServer {
-
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestSimpleRpcServer.class);
+public abstract class AbstractTestRpcServer {
 
   private static final byte[] FAMILY = Bytes.toBytes("f");
   private static final byte[] QUALIFIER = Bytes.toBytes("q");
@@ -56,31 +43,11 @@ public class TestSimpleRpcServer {
   private static final int MAX_LEN = 1000000;
   protected static final LoadTestKVGenerator GENERATOR = new LoadTestKVGenerator(MIN_LEN, MAX_LEN);
   protected static HBaseTestingUtility TEST_UTIL;
+  protected TableName tableName;
 
-  @Rule
-  public TableNameTestRule name = new TableNameTestRule();
-
-  @SuppressWarnings("deprecation")
-  @BeforeClass
-  public static void setupClass() throws Exception {
-    // A subclass may have already created TEST_UTIL and is now upcalling to us
-    if (TEST_UTIL == null) {
-      TEST_UTIL = new HBaseTestingUtility();
-    }
-    // Set RPC server impl to SimpleRpcServer
-    TEST_UTIL.getConfiguration().set(RpcServerFactory.CUSTOM_RPC_SERVER_IMPL_CONF_KEY,
-      SimpleRpcServer.class.getName());
-    TEST_UTIL.startMiniCluster();
-  }
-
-  @AfterClass
-  public static void tearDownClass() throws Exception {
-    TEST_UTIL.shutdownMiniCluster();
-  }
-
-  @Test
-  public void testSimpleRpcServer() throws Exception {
-    doTest(name.getTableName());
+  @BeforeEach
+  public void setUpTest(TestInfo testInfo) {
+    tableName = TableName.valueOf(testInfo.getTestMethod().get().getName());
   }
 
   protected void doTest(TableName tableName) throws Exception {
@@ -99,12 +66,11 @@ public class TestSimpleRpcServer {
       for (int i = 0; i < NUM_ROWS; i++) {
         final byte[] rowKey = Bytes.toBytes(LoadTestKVGenerator.md5PrefixedKey(i));
         final Result r = table.get(new Get(rowKey).addColumn(FAMILY, QUALIFIER));
-        assertNotNull("Result was empty", r);
+        assertNotNull(r, "Result was empty");
         final byte[] v = r.getValue(FAMILY, QUALIFIER);
-        assertNotNull("Result did not contain expected value", v);
-        assertTrue("Value was not verified", LoadTestKVGenerator.verify(v, rowKey, QUALIFIER));
+        assertNotNull(v, "Result did not contain expected value");
+        assertTrue(LoadTestKVGenerator.verify(v, rowKey, QUALIFIER), "Value was not verified");
       }
     }
   }
-
 }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestBufferChain.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestBufferChain.java
index c7142f34f63..978a3f106c0 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestBufferChain.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestBufferChain.java
@@ -17,47 +17,42 @@
  */
 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.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.channels.FileChannel;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.testclassification.RPCTests;
 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.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.base.Charsets;
 import org.apache.hbase.thirdparty.com.google.common.io.Files;
 
-@Category({ RPCTests.class, SmallTests.class })
+@Tag(RPCTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestBufferChain {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestBufferChain.class);
-
   private File tmpFile;
 
   private static final byte[][] HELLO_WORLD_CHUNKS =
     new byte[][] { "hello".getBytes(Charsets.UTF_8), " ".getBytes(Charsets.UTF_8),
       "world".getBytes(Charsets.UTF_8) };
 
-  @Before
+  @BeforeEach
   public void setup() throws IOException {
     tmpFile = File.createTempFile("TestBufferChain", "txt");
   }
 
-  @After
+  @AfterEach
   public void teardown() {
     tmpFile.delete();
   }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestCallRunner.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestCallRunner.java
index e809b408c65..f4672203132 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestCallRunner.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestCallRunner.java
@@ -27,12 +27,11 @@ import static org.hamcrest.Matchers.allOf;
 import static org.hamcrest.Matchers.hasItem;
 
 import io.opentelemetry.api.trace.StatusCode;
-import io.opentelemetry.sdk.testing.junit4.OpenTelemetryRule;
+import io.opentelemetry.sdk.testing.junit5.OpenTelemetryExtension;
 import java.net.InetSocketAddress;
 import java.util.concurrent.TimeUnit;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.CallDroppedException;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.MatcherPredicate;
 import org.apache.hadoop.hbase.Waiter;
@@ -41,31 +40,26 @@ import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandlerImpl;
 import org.apache.hadoop.hbase.testclassification.RPCTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.trace.TraceUtil;
-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.junit.jupiter.api.extension.RegisterExtension;
 import org.mockito.Mockito;
 
-@Category({ RPCTests.class, SmallTests.class })
+@Tag(RPCTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestCallRunner {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestCallRunner.class);
-
-  @Rule
-  public TestName testName = new TestName();
-
-  @Rule
-  public OpenTelemetryRule otelRule = OpenTelemetryRule.create();
+  @RegisterExtension
+  public static final OpenTelemetryExtension otelRule = OpenTelemetryExtension.create();
 
   private Configuration conf = null;
+  private String testMethodName;
 
-  @Before
-  public void before() {
+  @BeforeEach
+  public void before(TestInfo testInfo) {
+    testMethodName = testInfo.getTestMethod().get().getName();
     final HBaseTestingUtility util = new HBaseTestingUtility();
     conf = util.getConfiguration();
   }
@@ -83,13 +77,13 @@ public class TestCallRunner {
       CallRunner cr = new CallRunner(mockRpcServer, mockCall);
       cr.setStatus(new MonitoredRPCHandlerImpl("test"));
       cr.run();
-    }, testName.getMethodName());
+    }, testMethodName);
 
     Waiter.waitFor(conf, TimeUnit.SECONDS.toMillis(5), new MatcherPredicate<>(otelRule::getSpans,
-      hasItem(allOf(hasName(testName.getMethodName()), hasEnded()))));
+      hasItem(allOf(hasName(testMethodName), hasEnded()))));
 
-    assertThat(otelRule.getSpans(), hasItem(
-      allOf(hasName(testName.getMethodName()), hasStatusWithCode(StatusCode.OK), hasEnded())));
+    assertThat(otelRule.getSpans(),
+      hasItem(allOf(hasName(testMethodName), hasStatusWithCode(StatusCode.OK), hasEnded())));
   }
 
   @Test
@@ -103,7 +97,7 @@ public class TestCallRunner {
       CallRunner cr = new CallRunner(mockRpcServer, mockCall);
       cr.setStatus(new MonitoredRPCHandlerImpl("test"));
       cr.run();
-    }, testName.getMethodName());
+    }, testMethodName);
     Mockito.verify(mockCall, Mockito.times(1)).cleanup();
   }
 
@@ -118,14 +112,14 @@ public class TestCallRunner {
       CallRunner cr = new CallRunner(mockRpcServer, mockCall);
       cr.setStatus(new MonitoredRPCHandlerImpl("test"));
       cr.drop();
-    }, testName.getMethodName());
+    }, testMethodName);
     Mockito.verify(mockCall, Mockito.times(1)).cleanup();
 
     Waiter.waitFor(conf, TimeUnit.SECONDS.toMillis(5), new MatcherPredicate<>(otelRule::getSpans,
-      hasItem(allOf(hasName(testName.getMethodName()), hasEnded()))));
+      hasItem(allOf(hasName(testMethodName), hasEnded()))));
 
     assertThat(otelRule.getSpans(),
-      hasItem(allOf(hasName(testName.getMethodName()), hasStatusWithCode(StatusCode.OK),
+      hasItem(allOf(hasName(testMethodName), hasStatusWithCode(StatusCode.OK),
         hasEvents(hasItem(EventMatchers.hasName("Client disconnect detected"))), hasEnded())));
   }
 
@@ -144,15 +138,15 @@ public class TestCallRunner {
       CallRunner cr = new CallRunner(mockRpcServer, mockCall);
       cr.setStatus(new MonitoredRPCHandlerImpl("test"));
       cr.drop();
-    }, testName.getMethodName());
+    }, testMethodName);
     Mockito.verify(mockCall, Mockito.times(1)).cleanup();
     Mockito.verify(mockMetrics).exception(Mockito.any(CallDroppedException.class));
 
     Waiter.waitFor(conf, TimeUnit.SECONDS.toMillis(5), new MatcherPredicate<>(otelRule::getSpans,
-      hasItem(allOf(hasName(testName.getMethodName()), hasEnded()))));
+      hasItem(allOf(hasName(testMethodName), hasEnded()))));
 
     assertThat(otelRule.getSpans(),
-      hasItem(allOf(hasName(testName.getMethodName()), hasStatusWithCode(StatusCode.ERROR),
+      hasItem(allOf(hasName(testMethodName), hasStatusWithCode(StatusCode.ERROR),
         hasEvents(hasItem(allOf(EventMatchers.hasName("exception"),
           EventMatchers.hasAttributes(
             containsEntry("exception.type", CallDroppedException.class.getName()))))),
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestFifoRpcScheduler.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestFifoRpcScheduler.java
index 06b25f81ba9..69ecd821e7a 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestFifoRpcScheduler.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestFifoRpcScheduler.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.Mockito.doAnswer;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -29,27 +29,22 @@ import java.util.concurrent.ThreadPoolExecutor;
 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.monitoring.MonitoredRPCHandlerImpl;
 import org.apache.hadoop.hbase.testclassification.RPCTests;
 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;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@Category({ RPCTests.class, SmallTests.class })
+@Tag(RPCTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestFifoRpcScheduler {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestFifoRpcScheduler.class);
-
   private static final Logger LOG = LoggerFactory.getLogger(TestFifoRpcScheduler.class);
 
   private AtomicInteger callExecutionCount;
@@ -62,7 +57,7 @@ public class TestFifoRpcScheduler {
   };
   private Configuration conf;
 
-  @Before
+  @BeforeEach
   public void setUp() {
     conf = HBaseConfiguration.create();
     callExecutionCount = new AtomicInteger(0);
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestHBaseClient.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestHBaseClient.java
index 90e696c4591..a2a9da01f75 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestHBaseClient.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestHBaseClient.java
@@ -17,24 +17,21 @@
  */
 package org.apache.hadoop.hbase.ipc;
 
+import static org.junit.jupiter.api.Assertions.assertFalse;
+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.net.Address;
 import org.apache.hadoop.hbase.testclassification.RPCTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
 import org.apache.hadoop.hbase.util.ManualEnvironmentEdge;
-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({ RPCTests.class, SmallTests.class })
+@Tag(RPCTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestHBaseClient {
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestHBaseClient.class);
-
   @Test
   public void testFailedServer() {
     ManualEnvironmentEdge ee = new ManualEnvironmentEdge();
@@ -48,36 +45,36 @@ public class TestHBaseClient {
     Address ia3 = Address.fromParts("badtoo", 12);
     Address ia4 = Address.fromParts("badtoo", 13);
 
-    Assert.assertFalse(fs.isFailedServer(ia));
+    assertFalse(fs.isFailedServer(ia));
 
     fs.addToFailedServers(ia, testThrowable);
-    Assert.assertTrue(fs.isFailedServer(ia));
-    Assert.assertTrue(fs.isFailedServer(ia2));
+    assertTrue(fs.isFailedServer(ia));
+    assertTrue(fs.isFailedServer(ia2));
 
     ee.incValue(1);
-    Assert.assertTrue(fs.isFailedServer(ia));
-    Assert.assertTrue(fs.isFailedServer(ia2));
+    assertTrue(fs.isFailedServer(ia));
+    assertTrue(fs.isFailedServer(ia2));
 
     ee.incValue(RpcClient.FAILED_SERVER_EXPIRY_DEFAULT + 1);
-    Assert.assertFalse(fs.isFailedServer(ia));
-    Assert.assertFalse(fs.isFailedServer(ia2));
+    assertFalse(fs.isFailedServer(ia));
+    assertFalse(fs.isFailedServer(ia2));
 
     fs.addToFailedServers(ia, testThrowable);
     fs.addToFailedServers(ia3, testThrowable);
     fs.addToFailedServers(ia4, testThrowable);
 
-    Assert.assertTrue(fs.isFailedServer(ia));
-    Assert.assertTrue(fs.isFailedServer(ia2));
-    Assert.assertTrue(fs.isFailedServer(ia3));
-    Assert.assertTrue(fs.isFailedServer(ia4));
+    assertTrue(fs.isFailedServer(ia));
+    assertTrue(fs.isFailedServer(ia2));
+    assertTrue(fs.isFailedServer(ia3));
+    assertTrue(fs.isFailedServer(ia4));
 
     ee.incValue(RpcClient.FAILED_SERVER_EXPIRY_DEFAULT + 1);
-    Assert.assertFalse(fs.isFailedServer(ia));
-    Assert.assertFalse(fs.isFailedServer(ia2));
-    Assert.assertFalse(fs.isFailedServer(ia3));
-    Assert.assertFalse(fs.isFailedServer(ia4));
+    assertFalse(fs.isFailedServer(ia));
+    assertFalse(fs.isFailedServer(ia2));
+    assertFalse(fs.isFailedServer(ia3));
+    assertFalse(fs.isFailedServer(ia4));
 
     fs.addToFailedServers(ia3, testThrowable);
-    Assert.assertFalse(fs.isFailedServer(ia4));
+    assertFalse(fs.isFailedServer(ia4));
   }
 }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestMasterFifoRpcScheduler.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestMasterFifoRpcScheduler.java
index 14f218be553..fa8f146a22b 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestMasterFifoRpcScheduler.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestMasterFifoRpcScheduler.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 static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -26,7 +26,6 @@ import static org.mockito.Mockito.when;
 import java.util.Set;
 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.HBaseTestingUtility;
 import org.apache.hadoop.hbase.HConstants;
@@ -35,12 +34,10 @@ import org.apache.hadoop.hbase.master.MasterRpcServices;
 import org.apache.hadoop.hbase.regionserver.RSRpcServices;
 import org.apache.hadoop.hbase.testclassification.LargeTests;
 import org.apache.hadoop.hbase.testclassification.RPCTests;
-import org.junit.AfterClass;
-import org.junit.Assert;
-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.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
 import org.slf4j.Logger;
@@ -48,20 +45,17 @@ import org.slf4j.LoggerFactory;
 
 import org.apache.hadoop.hbase.shaded.protobuf.generated.RPCProtos;
 
-@Category({ RPCTests.class, LargeTests.class })
+@Tag(RPCTests.TAG)
+@Tag(LargeTests.TAG)
 public class TestMasterFifoRpcScheduler {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestMasterFifoRpcScheduler.class);
-
   private static final Logger LOG = LoggerFactory.getLogger(TestMasterFifoRpcScheduler.class);
 
   private static final String REGION_SERVER_REPORT = "RegionServerReport";
   private static final String OTHER = "Other";
   private static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
 
-  @BeforeClass
+  @BeforeAll
   public static void setupBeforeClass() throws Exception {
     Configuration conf = TEST_UTIL.getConfiguration();
     conf.set(RSRpcServices.MASTER_RPC_SCHEDULER_FACTORY_CLASS,
@@ -71,7 +65,7 @@ public class TestMasterFifoRpcScheduler {
     TEST_UTIL.startMiniCluster();
   }
 
-  @AfterClass
+  @AfterAll
   public static void tearDownAfterClass() throws Exception {
     TEST_UTIL.shutdownMiniCluster();
   }
@@ -81,7 +75,7 @@ public class TestMasterFifoRpcScheduler {
     HMaster master = TEST_UTIL.getHBaseCluster().getMaster();
     MasterRpcServices masterRpcServices = master.getMasterRpcServices();
     RpcScheduler masterRpcScheduler = masterRpcServices.getRpcScheduler();
-    Assert.assertTrue(masterRpcScheduler instanceof MasterFifoRpcScheduler);
+    assertTrue(masterRpcScheduler instanceof MasterFifoRpcScheduler);
   }
 
   @Test
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestMultipleServerPrincipalsIPC.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestMultipleServerPrincipalsIPC.java
index 71ebe5aa537..19d8d842f0a 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestMultipleServerPrincipalsIPC.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestMultipleServerPrincipalsIPC.java
@@ -21,8 +21,8 @@ import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.containsString;
 import static org.hamcrest.Matchers.either;
 import static org.hamcrest.Matchers.instanceOf;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 import java.io.File;
 import java.io.IOException;
@@ -32,10 +32,11 @@ import java.security.PrivilegedExceptionAction;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.stream.Stream;
 import javax.security.sasl.SaslException;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.CommonConfigurationKeys;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
+import org.apache.hadoop.hbase.HBaseParameterizedTestTemplate;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.ServerName;
@@ -47,17 +48,13 @@ import org.apache.hadoop.hbase.testclassification.SecurityTests;
 import org.apache.hadoop.ipc.RemoteException;
 import org.apache.hadoop.minikdc.MiniKdc;
 import org.apache.hadoop.security.UserGroupInformation;
-import org.junit.After;
-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.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameter;
-import org.junit.runners.Parameterized.Parameters;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeAll;
+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.common.collect.Iterables;
 import org.apache.hbase.thirdparty.com.google.common.collect.Lists;
@@ -74,14 +71,11 @@ import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestRpcServiceProto
  * <p>
  * Put here just because we need to visit some package private classes under this package.
  */
-@RunWith(Parameterized.class)
-@Category({ SecurityTests.class, MediumTests.class })
+@Tag(SecurityTests.TAG)
+@Tag(MediumTests.TAG)
+@HBaseParameterizedTestTemplate(name = "{index}: rpcServerImpl={0}, rpcClientImpl={1}")
 public class TestMultipleServerPrincipalsIPC {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestMultipleServerPrincipalsIPC.class);
-
   private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
 
   private static final File KEYTAB_FILE =
@@ -93,11 +87,8 @@ public class TestMultipleServerPrincipalsIPC {
   private static String SERVER_PRINCIPAL2;
   private static String CLIENT_PRINCIPAL;
 
-  @Parameter(0)
-  public Class<? extends RpcServer> rpcServerImpl;
-
-  @Parameter(1)
-  public Class<? extends RpcClient> rpcClientImpl;
+  private final Class<? extends RpcServer> rpcServerImpl;
+  private final Class<? extends RpcClient> rpcClientImpl;
 
   private Configuration clientConf;
   private Configuration serverConf;
@@ -106,22 +97,27 @@ public class TestMultipleServerPrincipalsIPC {
   private RpcServer rpcServer;
   private RpcClient rpcClient;
 
-  @Parameters(name = "{index}: rpcServerImpl={0}, rpcClientImpl={1}")
-  public static List<Object[]> params() {
-    List<Object[]> params = new ArrayList<>();
+  public TestMultipleServerPrincipalsIPC(Class<? extends RpcServer> rpcServerImpl,
+    Class<? extends RpcClient> rpcClientImpl) {
+    this.rpcServerImpl = rpcServerImpl;
+    this.rpcClientImpl = rpcClientImpl;
+  }
+
+  public static Stream<Arguments> parameters() {
+    List<Arguments> params = new ArrayList<>();
     List<Class<? extends RpcServer>> rpcServerImpls =
       Arrays.asList(NettyRpcServer.class, SimpleRpcServer.class);
     List<Class<? extends RpcClient>> rpcClientImpls =
       Arrays.asList(NettyRpcClient.class, BlockingRpcClient.class);
     for (Class<? extends RpcServer> rpcServerImpl : rpcServerImpls) {
       for (Class<? extends RpcClient> rpcClientImpl : rpcClientImpls) {
-        params.add(new Object[] { rpcServerImpl, rpcClientImpl });
+        params.add(Arguments.of(rpcServerImpl, rpcClientImpl));
       }
     }
-    return params;
+    return params.stream();
   }
 
-  @BeforeClass
+  @BeforeAll
   public static void setUpBeforeClass() throws Exception {
     KDC = TEST_UTIL.setupMiniKdc(KEYTAB_FILE);
     SERVER_PRINCIPAL = "server/" + HOST;
@@ -140,7 +136,7 @@ public class TestMultipleServerPrincipalsIPC {
     TEST_UTIL.getConfiguration().setInt(RpcClient.FAILED_SERVER_EXPIRY_KEY, 10);
   }
 
-  @AfterClass
+  @AfterAll
   public static void tearDownAfterClass() {
     if (KDC != null) {
       KDC.stop();
@@ -165,7 +161,7 @@ public class TestMultipleServerPrincipalsIPC {
     rpcServer.start();
   }
 
-  @Before
+  @BeforeEach
   public void setUp() throws Exception {
     clientConf = new Configuration(TEST_UTIL.getConfiguration());
     clientConf.setClass(RpcClientFactory.CUSTOM_RPC_CLIENT_IMPL_CONF_KEY, rpcClientImpl,
@@ -189,7 +185,7 @@ public class TestMultipleServerPrincipalsIPC {
       .createClient(clientConf, HConstants.DEFAULT_CLUSTER_ID.toString()));
   }
 
-  @After
+  @AfterEach
   public void tearDown() throws IOException {
     Closeables.close(rpcClient, true);
     rpcServer.stop();
@@ -206,13 +202,13 @@ public class TestMultipleServerPrincipalsIPC {
     });
   }
 
-  @Test
+  @TestTemplate
   public void testEcho() throws Exception {
     String msg = "Hello World";
     assertEquals(msg, echo(msg));
   }
 
-  @Test
+  @TestTemplate
   public void testMaliciousServer() throws Exception {
     // reset the server principals so the principal returned by server does not match
     SecurityInfo securityInfo =
@@ -227,7 +223,7 @@ public class TestMultipleServerPrincipalsIPC {
     assertThat(error.getCause().getCause(), instanceOf(SaslException.class));
   }
 
-  @Test
+  @TestTemplate
   public void testRememberLastSucceededServerPrincipal() throws Exception {
     // after this call we will remember the last succeeded server principal
     assertEquals("a", echo("a"));
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestNettyChannelWritability.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestNettyChannelWritability.java
index 001f6dbd22c..3e2cf468ef0 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestNettyChannelWritability.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestNettyChannelWritability.java
@@ -19,10 +19,10 @@ package org.apache.hadoop.hbase.ipc;
 
 import static org.apache.hadoop.hbase.ipc.TestProtobufRpcServiceImpl.SERVICE;
 import static org.apache.hadoop.hbase.ipc.TestProtobufRpcServiceImpl.newBlockingStub;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertThrows;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.io.IOException;
 import java.net.InetSocketAddress;
@@ -36,16 +36,14 @@ import org.apache.hadoop.hbase.Cell;
 import org.apache.hadoop.hbase.CellScanner;
 import org.apache.hadoop.hbase.CellUtil;
 import org.apache.hadoop.hbase.CompatibilityFactory;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.KeyValue;
 import org.apache.hadoop.hbase.test.MetricsAssertHelper;
 import org.apache.hadoop.hbase.testclassification.MediumTests;
 import org.apache.hadoop.hbase.testclassification.RPCTests;
 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.apache.hbase.thirdparty.com.google.common.collect.Lists;
 import org.apache.hbase.thirdparty.com.google.protobuf.ServiceException;
@@ -54,13 +52,10 @@ import org.apache.hbase.thirdparty.io.netty.channel.Channel;
 import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos;
 import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestRpcServiceProtos;
 
-@Category({ RPCTests.class, MediumTests.class })
+@Tag(RPCTests.TAG)
+@Tag(MediumTests.TAG)
 public class TestNettyChannelWritability {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestNettyChannelWritability.class);
-
   private static final MetricsAssertHelper METRICS_ASSERT =
     CompatibilityFactory.getInstance(MetricsAssertHelper.class);
 
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestNettyIPCCloseConnection.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestNettyIPCCloseConnection.java
index e21ad286853..d9f4dd96e94 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestNettyIPCCloseConnection.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestNettyIPCCloseConnection.java
@@ -18,8 +18,8 @@
 package org.apache.hadoop.hbase.ipc;
 
 import static org.apache.hadoop.hbase.ipc.TestProtobufRpcServiceImpl.SERVICE;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -28,17 +28,15 @@ import java.io.IOException;
 import java.net.InetSocketAddress;
 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.Waiter;
 import org.apache.hadoop.hbase.security.HBaseSaslRpcServer;
 import org.apache.hadoop.hbase.testclassification.MediumTests;
 import org.apache.hadoop.hbase.testclassification.RPCTests;
-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.collect.Iterators;
 import org.apache.hbase.thirdparty.com.google.common.collect.Lists;
@@ -53,13 +51,10 @@ import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestRpcServiceProto
 /**
  * Confirm that we truly close the NettyRpcConnection when the netty channel is closed.
  */
-@Category({ RPCTests.class, MediumTests.class })
+@Tag(RPCTests.TAG)
+@Tag(MediumTests.TAG)
 public class TestNettyIPCCloseConnection {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestNettyIPCCloseConnection.class);
-
   private static Configuration CONF = HBaseConfiguration.create();
 
   private NioEventLoopGroup group;
@@ -70,7 +65,7 @@ public class TestNettyIPCCloseConnection {
 
   private TestProtobufRpcProto.BlockingInterface stub;
 
-  @Before
+  @BeforeEach
   public void setUp() throws IOException {
     group = new NioEventLoopGroup();
     server = new NettyRpcServer(null, getClass().getSimpleName(),
@@ -82,7 +77,7 @@ public class TestNettyIPCCloseConnection {
     stub = TestProtobufRpcServiceImpl.newBlockingStub(client, server.getListenerAddress());
   }
 
-  @After
+  @AfterEach
   public void tearDown() throws Exception {
     Closeables.close(client, true);
     server.stop();
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestNettyRpcServer.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestNettyRpcServer.java
index 7fedb2ba112..a7d5340e681 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestNettyRpcServer.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestNettyRpcServer.java
@@ -17,9 +17,9 @@
  */
 package org.apache.hadoop.hbase.ipc;
 
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -32,14 +32,13 @@ import java.security.cert.CertificateException;
 import java.security.cert.CertificateFactory;
 import java.security.cert.X509Certificate;
 import java.util.Arrays;
-import java.util.Collection;
+import java.util.stream.Stream;
 import javax.net.ssl.SSLEngine;
 import javax.net.ssl.SSLPeerUnverifiedException;
 import javax.net.ssl.SSLSession;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
+import org.apache.hadoop.hbase.HBaseParameterizedTestTemplate;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.TableName;
-import org.apache.hadoop.hbase.TableNameTestRule;
 import org.apache.hadoop.hbase.client.Get;
 import org.apache.hadoop.hbase.client.Put;
 import org.apache.hadoop.hbase.client.Result;
@@ -51,26 +50,20 @@ import org.apache.hadoop.hbase.testclassification.MediumTests;
 import org.apache.hadoop.hbase.testclassification.RPCTests;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.LoadTestKVGenerator;
-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.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.TestInfo;
+import org.junit.jupiter.api.TestTemplate;
+import org.junit.jupiter.params.provider.Arguments;
 
 import org.apache.hbase.thirdparty.io.netty.handler.ssl.SslHandler;
 
-@Category({ RPCTests.class, MediumTests.class })
-@RunWith(Parameterized.class)
+@Tag(RPCTests.TAG)
+@Tag(MediumTests.TAG)
+@HBaseParameterizedTestTemplate(name = "{index}: allocatorType={0}")
 public class TestNettyRpcServer {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestNettyRpcServer.class);
-
   private static final byte[] FAMILY = Bytes.toBytes("f");
   private static final byte[] QUALIFIER = Bytes.toBytes("q");
   private static final int NUM_ROWS = 100;
@@ -78,21 +71,29 @@ public class TestNettyRpcServer {
   private static final int MAX_LEN = 1000000;
   protected static final LoadTestKVGenerator GENERATOR = new LoadTestKVGenerator(MIN_LEN, MAX_LEN);
   protected static HBaseTestingUtility TEST_UTIL;
+  protected TableName tableName;
+  protected final String allocatorType;
 
-  @Rule
-  public TableNameTestRule name = new TableNameTestRule();
+  public TestNettyRpcServer(String allocatorType) {
+    this.allocatorType = allocatorType;
+  }
 
-  @Parameterized.Parameter
-  public String allocatorType;
+  public static Stream<Arguments> parameters() {
+    return Arrays
+      .stream(
+        new Object[] { NettyRpcServer.POOLED_ALLOCATOR_TYPE, NettyRpcServer.UNPOOLED_ALLOCATOR_TYPE,
+          NettyRpcServer.HEAP_ALLOCATOR_TYPE, SimpleByteBufAllocator.class.getName() })
+      .map(Arguments::of);
+  }
 
-  @Parameters
-  public static Collection<Object[]> parameters() {
-    return Arrays.asList(new Object[][] { { NettyRpcServer.POOLED_ALLOCATOR_TYPE },
-      { NettyRpcServer.UNPOOLED_ALLOCATOR_TYPE }, { NettyRpcServer.HEAP_ALLOCATOR_TYPE },
-      { SimpleByteBufAllocator.class.getName() } });
+  @BeforeEach
+  public void setUpTable(TestInfo testInfo) {
+    String sanitizedAllocatorType = allocatorType.replaceAll("[^a-zA-Z0-9_.-]", "_");
+    tableName =
+      TableName.valueOf(testInfo.getTestMethod().get().getName() + "_" + sanitizedAllocatorType);
   }
 
-  @Before
+  @BeforeEach
   public void setup() throws Exception {
     // A subclass may have already created TEST_UTIL and is now upcalling to us
     if (TEST_UTIL == null) {
@@ -104,14 +105,14 @@ public class TestNettyRpcServer {
     TEST_UTIL.startMiniCluster();
   }
 
-  @After
+  @AfterEach
   public void tearDown() throws Exception {
     TEST_UTIL.shutdownMiniCluster();
   }
 
-  @Test
+  @TestTemplate
   public void testNettyRpcServer() throws Exception {
-    doTest(name.getTableName());
+    doTest(tableName);
   }
 
   protected void doTest(TableName tableName) throws Exception {
@@ -130,10 +131,10 @@ public class TestNettyRpcServer {
       for (int i = 0; i < NUM_ROWS; i++) {
         final byte[] rowKey = Bytes.toBytes(LoadTestKVGenerator.md5PrefixedKey(i));
         final Result r = table.get(new Get(rowKey).addColumn(FAMILY, QUALIFIER));
-        assertNotNull("Result was empty", r);
+        assertNotNull(r, "Result was empty");
         final byte[] v = r.getValue(FAMILY, QUALIFIER);
-        assertNotNull("Result did not contain expected value", v);
-        assertTrue("Value was not verified", LoadTestKVGenerator.verify(v, rowKey, QUALIFIER));
+        assertNotNull(v, "Result did not contain expected value");
+        assertTrue(LoadTestKVGenerator.verify(v, rowKey, QUALIFIER), "Value was not verified");
       }
     }
   }
@@ -163,7 +164,7 @@ public class TestNettyRpcServer {
     + "khS2d/JDZq2XL5RGexf3CA6YYzWiTr9YZHNjuobvLH7mVnA2c8n6Zty/UhfnuK1x\n" + "JbkleFk=\n"
     + "-----END CERTIFICATE-----";
 
-  @Test
+  @TestTemplate
   public void testHandshakeCompleteHandler()
     throws SSLPeerUnverifiedException, CertificateException {
     NettyServerRpcConnection conn = mock(NettyServerRpcConnection.class);
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestProtoBufRpc.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestProtoBufRpc.java
index a9cac3d0e7b..8fbb22e7f29 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestProtoBufRpc.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestProtoBufRpc.java
@@ -19,29 +19,25 @@ package org.apache.hadoop.hbase.ipc;
 
 import static org.apache.hadoop.hbase.ipc.TestProtobufRpcServiceImpl.SERVICE;
 import static org.apache.hadoop.hbase.ipc.TestProtobufRpcServiceImpl.newBlockingStub;
-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.assertThrows;
 
 import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.util.Arrays;
-import java.util.Collection;
+import java.util.stream.Stream;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseConfiguration;
+import org.apache.hadoop.hbase.HBaseParameterizedTestTemplate;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.logging.Log4jUtils;
 import org.apache.hadoop.hbase.testclassification.RPCTests;
 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.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameter;
-import org.junit.runners.Parameterized.Parameters;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.TestTemplate;
+import org.junit.jupiter.params.provider.Arguments;
 
 import org.apache.hbase.thirdparty.com.google.common.collect.Lists;
 
@@ -55,30 +51,29 @@ import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestRpcServiceProto
  * of types in <code>src/test/protobuf/test.proto</code> and protobuf service definition from
  * <code>src/test/protobuf/test_rpc_service.proto</code>
  */
-@RunWith(Parameterized.class)
-@Category({ RPCTests.class, SmallTests.class })
+@Tag(RPCTests.TAG)
+@Tag(SmallTests.TAG)
+@HBaseParameterizedTestTemplate(name = "{index}: rpcServerImpl={0}")
 public class TestProtoBufRpc {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestProtoBufRpc.class);
-
   public final static String ADDRESS = "localhost";
   private static int PORT = 0;
   private InetSocketAddress isa;
   private Configuration conf;
   private RpcServerInterface server;
+  private final String rpcServerImpl;
 
-  @Parameters(name = "{index}: rpcServerImpl={0}")
-  public static Collection<Object[]> parameters() {
-    return Arrays.asList(new Object[] { SimpleRpcServer.class.getName() },
-      new Object[] { NettyRpcServer.class.getName() });
+  public TestProtoBufRpc(String rpcServerImpl) {
+    this.rpcServerImpl = rpcServerImpl;
   }
 
-  @Parameter(0)
-  public String rpcServerImpl;
+  public static Stream<Arguments> parameters() {
+    return Arrays
+      .stream(new Object[] { SimpleRpcServer.class.getName(), NettyRpcServer.class.getName() })
+      .map(Arguments::of);
+  }
 
-  @Before
+  @BeforeEach
   public void setUp() throws IOException { // Setup server for both protocols
     this.conf = HBaseConfiguration.create();
     this.conf.set(RpcServerFactory.CUSTOM_RPC_SERVER_IMPL_CONF_KEY, rpcServerImpl);
@@ -97,13 +92,12 @@ public class TestProtoBufRpc {
     this.server.start();
   }
 
-  @After
+  @AfterEach
   public void tearDown() throws Exception {
     server.stop();
   }
 
-  @Test(expected = org.apache.hbase.thirdparty.com.google.protobuf.ServiceException.class
-  /* Thrown when we call stub.error */)
+  @TestTemplate
   public void testProtoBufRpc() throws Exception {
     RpcClient rpcClient = RpcClientFactory.createClient(conf, HConstants.CLUSTER_ID_DEFAULT);
     try {
@@ -117,8 +111,8 @@ public class TestProtoBufRpc {
       EchoResponseProto echoResponse = stub.echo(null, echoRequest);
       assertEquals("hello", echoResponse.getMessage());
 
-      stub.error(null, emptyRequest);
-      fail("Expected exception is not thrown");
+      assertThrows(org.apache.hbase.thirdparty.com.google.protobuf.ServiceException.class,
+        () -> stub.error(null, emptyRequest));
     } finally {
       rpcClient.close();
     }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestRWQueueRpcExecutor.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestRWQueueRpcExecutor.java
index 0008ea5f44d..714956c5ddd 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestRWQueueRpcExecutor.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestRWQueueRpcExecutor.java
@@ -21,38 +21,31 @@ import static org.apache.hadoop.hbase.ipc.RWQueueRpcExecutor.CALL_QUEUE_READ_SHA
 import static org.apache.hadoop.hbase.ipc.RWQueueRpcExecutor.CALL_QUEUE_SCAN_SHARE_CONF_KEY;
 import static org.apache.hadoop.hbase.ipc.RpcExecutor.CALL_QUEUE_HANDLER_FACTOR_CONF_KEY;
 import static org.apache.hadoop.hbase.ipc.RpcExecutor.DEFAULT_CALL_QUEUE_SIZE_HARD_LIMIT;
-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 static org.mockito.Mockito.mock;
 
 import java.util.List;
 import java.util.concurrent.BlockingQueue;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.testclassification.MediumTests;
 import org.apache.hadoop.hbase.testclassification.RPCTests;
-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;
 
-@Category({ RPCTests.class, MediumTests.class })
+@Tag(RPCTests.TAG)
+@Tag(MediumTests.TAG)
 public class TestRWQueueRpcExecutor {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestRWQueueRpcExecutor.class);
-
-  @Rule
-  public TestName testName = new TestName();
-
   private Configuration conf;
+  private String testMethodName;
 
-  @Before
-  public void setUp() {
+  @BeforeEach
+  public void setUp(TestInfo testInfo) {
+    testMethodName = testInfo.getTestMethod().get().getName();
     conf = HBaseConfiguration.create();
     conf.setFloat(CALL_QUEUE_HANDLER_FACTOR_CONF_KEY, 1.0f);
     conf.setFloat(CALL_QUEUE_SCAN_SHARE_CONF_KEY, 0.5f);
@@ -63,8 +56,8 @@ public class TestRWQueueRpcExecutor {
   public void itProvidesCorrectQueuesToBalancers() throws InterruptedException {
     PriorityFunction qosFunction = mock(PriorityFunction.class);
     int softQueueLimit = 100;
-    RWQueueRpcExecutor executor = new RWQueueRpcExecutor(testName.getMethodName(), 100,
-      softQueueLimit, qosFunction, conf, null);
+    RWQueueRpcExecutor executor =
+      new RWQueueRpcExecutor(testMethodName, 100, softQueueLimit, qosFunction, conf, null);
 
     QueueBalancer readBalancer = executor.getReadBalancer();
     QueueBalancer writeBalancer = executor.getWriteBalancer();
@@ -81,11 +74,11 @@ public class TestRWQueueRpcExecutor {
     assertEquals(25, readQueues.size());
     assertEquals(50, writeQueues.size());
     assertEquals(25, scanQueues.size());
-    assertEquals("Soft limit is not applied properly", softQueueLimit, executor.currentQueueLimit);
+    assertEquals(softQueueLimit, executor.currentQueueLimit, "Soft limit is not applied properly");
     // Hard Limit is applied as the max capacity of the queue
     int hardQueueLimit = readQueues.get(0).remainingCapacity() + readQueues.get(0).size();
-    assertEquals("Default hard limit should be applied ", DEFAULT_CALL_QUEUE_SIZE_HARD_LIMIT,
-      hardQueueLimit);
+    assertEquals(DEFAULT_CALL_QUEUE_SIZE_HARD_LIMIT, hardQueueLimit,
+      "Default hard limit should be applied ");
 
     verifyDistinct(readQueues, writeQueues, scanQueues);
     verifyDistinct(writeQueues, readQueues, scanQueues);
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestRpcClientLeaks.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestRpcClientLeaks.java
index 7aa7678c228..976ac0bfb5a 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestRpcClientLeaks.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestRpcClientLeaks.java
@@ -18,8 +18,8 @@
 package org.apache.hadoop.hbase.ipc;
 
 import static org.apache.hadoop.hbase.HBaseTestingUtility.fam1;
-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.Socket;
@@ -28,7 +28,6 @@ import java.util.Map;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.LinkedBlockingQueue;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.TableName;
@@ -40,26 +39,18 @@ import org.apache.hadoop.hbase.client.RetriesExhaustedException;
 import org.apache.hadoop.hbase.client.Table;
 import org.apache.hadoop.hbase.testclassification.MediumTests;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.junit.AfterClass;
-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.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@Category(MediumTests.class)
+@Tag(MediumTests.TAG)
 public class TestRpcClientLeaks {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestRpcClientLeaks.class);
-
-  @Rule
-  public TestName name = new TestName();
-
   private static BlockingQueue<Socket> SAVED_SOCKETS = new LinkedBlockingQueue<>();
 
   public static class MyRpcClientImpl extends BlockingRpcClient {
@@ -97,29 +88,35 @@ public class TestRpcClientLeaks {
   }
 
   private static final HBaseTestingUtility UTIL = new HBaseTestingUtility();
+  private String testMethodName;
 
-  @BeforeClass
+  @BeforeAll
   public static void setup() throws Exception {
     UTIL.startMiniCluster();
   }
 
-  @AfterClass
+  @AfterAll
   public static void teardown() throws Exception {
     UTIL.shutdownMiniCluster();
   }
 
   public static final Logger LOG = LoggerFactory.getLogger(TestRpcClientLeaks.class);
 
+  @BeforeEach
+  public void setUpTest(TestInfo testInfo) {
+    testMethodName = testInfo.getTestMethod().get().getName();
+  }
+
   @Test
   public void testSocketClosed() throws IOException, InterruptedException {
-    TableName tableName = TableName.valueOf(name.getMethodName());
+    TableName tableName = TableName.valueOf(testMethodName);
     UTIL.createTable(tableName, fam1).close();
 
     Configuration conf = new Configuration(UTIL.getConfiguration());
     conf.set(RpcClientFactory.CUSTOM_RPC_CLIENT_IMPL_CONF_KEY, MyRpcClientImpl.class.getName());
     conf.setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 2);
     try (Connection connection = ConnectionFactory.createConnection(conf);
-      Table table = connection.getTable(TableName.valueOf(name.getMethodName()))) {
+      Table table = connection.getTable(TableName.valueOf(testMethodName))) {
       MyRpcClientImpl.enableThrowExceptions();
       table.get(new Get(Bytes.toBytes("asd")));
       fail("Should fail because the injected error");
@@ -127,7 +124,7 @@ public class TestRpcClientLeaks {
       // expected
     }
     for (Socket socket : SAVED_SOCKETS) {
-      assertTrue("Socket " + socket + " is not closed", socket.isClosed());
+      assertTrue(socket.isClosed(), "Socket " + socket + " is not closed");
     }
   }
 }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestRpcHandlerException.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestRpcHandlerException.java
index f240bf88e1b..7d7e793ec28 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestRpcHandlerException.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestRpcHandlerException.java
@@ -24,21 +24,17 @@ import static org.mockito.Mockito.mock;
 import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.util.Arrays;
-import java.util.Collection;
+import java.util.stream.Stream;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.Abortable;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseConfiguration;
+import org.apache.hadoop.hbase.HBaseParameterizedTestTemplate;
 import org.apache.hadoop.hbase.ipc.RpcServer.BlockingServiceAndInterface;
 import org.apache.hadoop.hbase.testclassification.RPCTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameter;
-import org.junit.runners.Parameterized.Parameters;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.TestTemplate;
+import org.junit.jupiter.params.provider.Arguments;
 
 import org.apache.hbase.thirdparty.com.google.common.collect.Lists;
 import org.apache.hbase.thirdparty.com.google.protobuf.BlockingService;
@@ -46,15 +42,13 @@ import org.apache.hbase.thirdparty.com.google.protobuf.BlockingService;
 import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.EchoRequestProto;
 import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestRpcServiceProtos.TestProtobufRpcProto.BlockingInterface;
 
-@RunWith(Parameterized.class)
-@Category({ RPCTests.class, SmallTests.class })
+@Tag(RPCTests.TAG)
+@Tag(SmallTests.TAG)
+@HBaseParameterizedTestTemplate(name = "{index}: rpcServerImpl={0}")
 public class TestRpcHandlerException {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestRpcHandlerException.class);
-
   private final static Configuration CONF = HBaseConfiguration.create();
+  private final String rpcServerImpl;
 
   /**
    * Tests that the rpc scheduler is called when requests arrive. When Rpc handler thread dies, the
@@ -75,20 +69,21 @@ public class TestRpcHandlerException {
     }
   }
 
-  @Parameters(name = "{index}: rpcServerImpl={0}")
-  public static Collection<Object[]> parameters() {
-    return Arrays.asList(new Object[] { SimpleRpcServer.class.getName() },
-      new Object[] { NettyRpcServer.class.getName() });
+  public TestRpcHandlerException(String rpcServerImpl) {
+    this.rpcServerImpl = rpcServerImpl;
   }
 
-  @Parameter(0)
-  public String rpcServerImpl;
+  public static Stream<Arguments> parameters() {
+    return Arrays
+      .stream(new Object[] { SimpleRpcServer.class.getName(), NettyRpcServer.class.getName() })
+      .map(Arguments::of);
+  }
 
   /*
    * This is a unit test to make sure to abort region server when the number of Rpc handler thread
    * caught errors exceeds the threshold. Client will hang when RS aborts.
    */
-  @Test
+  @TestTemplate
   public void testRpcScheduler() throws IOException, InterruptedException {
     PriorityFunction qosFunction = mock(PriorityFunction.class);
     Abortable abortable = new AbortServer();
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestRpcMetrics.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestRpcMetrics.java
index c55568d392a..63b958d6f31 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestRpcMetrics.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestRpcMetrics.java
@@ -17,12 +17,11 @@
  */
 package org.apache.hadoop.hbase.ipc;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import org.apache.hadoop.hbase.CallDroppedException;
 import org.apache.hadoop.hbase.CompatibilityFactory;
 import org.apache.hadoop.hbase.DoNotRetryIOException;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.NotServingRegionException;
 import org.apache.hadoop.hbase.RegionTooBusyException;
 import org.apache.hadoop.hbase.ServerName;
@@ -32,17 +31,13 @@ import org.apache.hadoop.hbase.exceptions.RequestTooBigException;
 import org.apache.hadoop.hbase.test.MetricsAssertHelper;
 import org.apache.hadoop.hbase.testclassification.RPCTests;
 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({ RPCTests.class, SmallTests.class })
+@Tag(RPCTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestRpcMetrics {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestRpcMetrics.class);
-
   public MetricsAssertHelper HELPER = CompatibilityFactory.getInstance(MetricsAssertHelper.class);
 
   @Test
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestRpcServerSlowConnectionSetup.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestRpcServerSlowConnectionSetup.java
index 80b3845d668..47aa414c34b 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestRpcServerSlowConnectionSetup.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestRpcServerSlowConnectionSetup.java
@@ -18,7 +18,7 @@
 package org.apache.hadoop.hbase.ipc;
 
 import static org.apache.hadoop.hbase.ipc.TestProtobufRpcServiceImpl.SERVICE;
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import java.io.BufferedInputStream;
 import java.io.DataInputStream;
@@ -27,25 +27,21 @@ import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.net.Socket;
 import java.util.Arrays;
-import java.util.List;
+import java.util.stream.Stream;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseConfiguration;
+import org.apache.hadoop.hbase.HBaseParameterizedTestTemplate;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.client.MetricsConnection;
 import org.apache.hadoop.hbase.ipc.RpcServer.BlockingServiceAndInterface;
 import org.apache.hadoop.hbase.security.AuthMethod;
 import org.apache.hadoop.hbase.testclassification.MediumTests;
 import org.apache.hadoop.hbase.testclassification.RPCTests;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameter;
-import org.junit.runners.Parameterized.Parameters;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.TestTemplate;
+import org.junit.jupiter.params.provider.Arguments;
 
 import org.apache.hbase.thirdparty.com.google.common.collect.Lists;
 
@@ -58,28 +54,26 @@ import org.apache.hadoop.hbase.shaded.protobuf.generated.RPCProtos.ConnectionHea
 import org.apache.hadoop.hbase.shaded.protobuf.generated.RPCProtos.RequestHeader;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.RPCProtos.ResponseHeader;
 
-@RunWith(Parameterized.class)
-@Category({ RPCTests.class, MediumTests.class })
+@Tag(RPCTests.TAG)
+@Tag(MediumTests.TAG)
+@HBaseParameterizedTestTemplate(name = "{index}: rpcServerImpl={0}")
 public class TestRpcServerSlowConnectionSetup {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestRpcServerSlowConnectionSetup.class);
-
   private RpcServer server;
 
   private Socket socket;
+  private final Class<? extends RpcServer> rpcServerImpl;
 
-  @Parameter
-  public Class<? extends RpcServer> rpcServerImpl;
+  public TestRpcServerSlowConnectionSetup(Class<? extends RpcServer> rpcServerImpl) {
+    this.rpcServerImpl = rpcServerImpl;
+  }
 
-  @Parameters(name = "{index}: rpcServerImpl={0}")
-  public static List<Object[]> params() {
-    return Arrays.asList(new Object[] { SimpleRpcServer.class },
-      new Object[] { NettyRpcServer.class });
+  public static Stream<Arguments> parameters() {
+    return Arrays.stream(new Object[] { SimpleRpcServer.class, NettyRpcServer.class })
+      .map(Arguments::of);
   }
 
-  @Before
+  @BeforeEach
   public void setUp() throws IOException {
     Configuration conf = HBaseConfiguration.create();
     conf.set(RpcServerFactory.CUSTOM_RPC_SERVER_IMPL_CONF_KEY, rpcServerImpl.getName());
@@ -90,7 +84,7 @@ public class TestRpcServerSlowConnectionSetup {
     socket = new Socket("localhost", server.getListenerAddress().getPort());
   }
 
-  @After
+  @AfterEach
   public void tearDown() throws IOException {
     if (socket != null) {
       socket.close();
@@ -100,7 +94,7 @@ public class TestRpcServerSlowConnectionSetup {
     }
   }
 
-  @Test
+  @TestTemplate
   public void test() throws IOException, InterruptedException {
     int rpcHeaderLen = HConstants.RPC_HEADER.length;
     byte[] preamble = new byte[rpcHeaderLen + 2];
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestRpcServerTraceLogging.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestRpcServerTraceLogging.java
index 0ae0ac51ffb..df57673365d 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestRpcServerTraceLogging.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestRpcServerTraceLogging.java
@@ -17,26 +17,20 @@
  */
 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 org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
-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;
 
-@Category(SmallTests.class)
+@Tag(SmallTests.TAG)
 public class TestRpcServerTraceLogging {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestRpcServerTraceLogging.class);
-
   private static final org.apache.logging.log4j.core.Logger rpcServerLog =
     (org.apache.logging.log4j.core.Logger) org.apache.logging.log4j.LogManager
       .getLogger(RpcServer.class);
@@ -54,7 +48,7 @@ public class TestRpcServerTraceLogging {
 
   static final Configuration conf = new Configuration(false);
 
-  @BeforeClass
+  @BeforeAll
   public static void setUp() {
     Mockito.when(mockRpcServer.getConf()).thenReturn(conf);
     Mockito.when(mockRpcServer.truncateTraceLog(Mockito.any(String.class))).thenCallRealMethod();
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestRpcSkipInitialSaslHandshake.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestRpcSkipInitialSaslHandshake.java
index 48e8667064a..222155426d3 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestRpcSkipInitialSaslHandshake.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestRpcSkipInitialSaslHandshake.java
@@ -23,15 +23,14 @@ import static org.apache.hadoop.hbase.security.HBaseKerberosUtils.getKeytabFileF
 import static org.apache.hadoop.hbase.security.HBaseKerberosUtils.getPrincipalForTesting;
 import static org.apache.hadoop.hbase.security.HBaseKerberosUtils.loginKerberosPrincipal;
 import static org.apache.hadoop.hbase.security.HBaseKerberosUtils.setSecuredConfiguration;
-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.File;
 import java.net.InetSocketAddress;
 import java.util.Collections;
 import java.util.concurrent.atomic.AtomicReference;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.security.HBaseKerberosUtils;
@@ -41,12 +40,11 @@ import org.apache.hadoop.hbase.testclassification.MediumTests;
 import org.apache.hadoop.hbase.testclassification.RPCTests;
 import org.apache.hadoop.minikdc.MiniKdc;
 import org.apache.hadoop.security.UserGroupInformation;
-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.mockito.Mockito;
 
 import org.apache.hbase.thirdparty.com.google.common.collect.Lists;
@@ -55,13 +53,10 @@ import org.apache.hbase.thirdparty.io.netty.channel.Channel;
 import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos;
 import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestRpcServiceProtos.TestProtobufRpcProto.BlockingInterface;
 
-@Category({ RPCTests.class, MediumTests.class })
+@Tag(RPCTests.TAG)
+@Tag(MediumTests.TAG)
 public class TestRpcSkipInitialSaslHandshake {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestRpcSkipInitialSaslHandshake.class);
-
   protected static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
 
   protected static final File KEYTAB_FILE =
@@ -103,18 +98,18 @@ public class TestRpcSkipInitialSaslHandshake {
     serverConf = new Configuration(TEST_UTIL.getConfiguration());
   }
 
-  @BeforeClass
+  @BeforeAll
   public static void setUp() throws Exception {
     initKDCAndConf();
   }
 
-  @AfterClass
+  @AfterAll
   public static void tearDown() throws Exception {
     stopKDC();
     TEST_UTIL.cleanupTestDir();
   }
 
-  @Before
+  @BeforeEach
   public void setUpTest() throws Exception {
     setUpPrincipalAndConf();
   }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestSecureNettyRpcServer.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestSecureNettyRpcServer.java
index cfddcbebbda..21ae9e0f2c4 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestSecureNettyRpcServer.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestSecureNettyRpcServer.java
@@ -19,40 +19,42 @@ package org.apache.hadoop.hbase.ipc;
 
 import java.io.File;
 import java.security.PrivilegedExceptionAction;
+import java.util.stream.Stream;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.CommonConfigurationKeys;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
+import org.apache.hadoop.hbase.HBaseParameterizedTestTemplate;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
-import org.apache.hadoop.hbase.TableNameTestRule;
 import org.apache.hadoop.hbase.security.HBaseKerberosUtils;
 import org.apache.hadoop.hbase.testclassification.MediumTests;
 import org.apache.hadoop.hbase.testclassification.RPCTests;
 import org.apache.hadoop.minikdc.MiniKdc;
 import org.apache.hadoop.security.UserGroupInformation;
-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.TestTemplate;
+import org.junit.jupiter.params.provider.Arguments;
 
-@Category({ RPCTests.class, MediumTests.class })
+@Tag(RPCTests.TAG)
+@Tag(MediumTests.TAG)
+@HBaseParameterizedTestTemplate(name = "{index}: allocatorType={0}")
 public class TestSecureNettyRpcServer extends TestNettyRpcServer {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestSecureNettyRpcServer.class);
-
   private static File KEYTAB_FILE;
   private static MiniKdc KDC;
   private static String HOST = "localhost";
   private static String PRINCIPAL;
   private static UserGroupInformation UGI;
 
-  @Rule
-  public TableNameTestRule name = new TableNameTestRule();
+  public TestSecureNettyRpcServer(String allocatorType) {
+    super(allocatorType);
+  }
+
+  public static Stream<Arguments> parameters() {
+    return TestNettyRpcServer.parameters();
+  }
 
-  @Before
+  @BeforeEach
   public void setup() throws Exception {
     TEST_UTIL = new HBaseTestingUtility();
     KEYTAB_FILE = new File(TEST_UTIL.getDataTestDir("keytab").toUri().getPath());
@@ -67,7 +69,7 @@ public class TestSecureNettyRpcServer extends TestNettyRpcServer {
     super.setup();
   }
 
-  @After
+  @AfterEach
   public void tearDown() throws Exception {
     if (KDC != null) {
       KDC.stop();
@@ -78,12 +80,12 @@ public class TestSecureNettyRpcServer extends TestNettyRpcServer {
   }
 
   @Override
-  @Test
+  @TestTemplate
   public void testNettyRpcServer() throws Exception {
     UGI.doAs(new PrivilegedExceptionAction<Void>() {
       @Override
       public Void run() throws Exception {
-        doTest(name.getTableName());
+        doTest(tableName);
         return null;
       }
     });
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestSecureSimpleRpcServer.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestSecureSimpleRpcServer.java
index 822ccec3dd3..cc357b9a1a4 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestSecureSimpleRpcServer.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestSecureSimpleRpcServer.java
@@ -21,27 +21,20 @@ import java.io.File;
 import java.security.PrivilegedExceptionAction;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.CommonConfigurationKeys;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
-import org.apache.hadoop.hbase.TableNameTestRule;
 import org.apache.hadoop.hbase.security.HBaseKerberosUtils;
 import org.apache.hadoop.hbase.testclassification.MediumTests;
 import org.apache.hadoop.hbase.testclassification.RPCTests;
 import org.apache.hadoop.minikdc.MiniKdc;
 import org.apache.hadoop.security.UserGroupInformation;
-import org.junit.AfterClass;
-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.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
-@Category({ RPCTests.class, MediumTests.class })
-public class TestSecureSimpleRpcServer extends TestSimpleRpcServer {
-
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestSecureSimpleRpcServer.class);
+@Tag(RPCTests.TAG)
+@Tag(MediumTests.TAG)
+public class TestSecureSimpleRpcServer extends AbstractTestRpcServer {
 
   private static File KEYTAB_FILE;
   private static MiniKdc KDC;
@@ -49,10 +42,7 @@ public class TestSecureSimpleRpcServer extends TestSimpleRpcServer {
   private static String PRINCIPAL;
   private static UserGroupInformation UGI;
 
-  @Rule
-  public TableNameTestRule name = new TableNameTestRule();
-
-  @BeforeClass
+  @BeforeAll
   public static void setupClass() throws Exception {
     TEST_UTIL = new HBaseTestingUtility();
     KEYTAB_FILE = new File(TEST_UTIL.getDataTestDir("keytab").toUri().getPath());
@@ -64,27 +54,31 @@ public class TestSecureSimpleRpcServer extends TestSimpleRpcServer {
     Configuration conf = TEST_UTIL.getConfiguration();
     HBaseKerberosUtils.setSecuredConfiguration(conf, principalName, principalName);
     UGI = login(KEYTAB_FILE.toString(), principalName);
-    TestSimpleRpcServer.setupClass();
-
+    TEST_UTIL.getConfiguration().set(RpcServerFactory.CUSTOM_RPC_SERVER_IMPL_CONF_KEY,
+      SimpleRpcServer.class.getName());
+    TEST_UTIL.startMiniCluster();
   }
 
-  @AfterClass
+  @AfterAll
   public static void tearDownClass() throws Exception {
     if (KDC != null) {
       KDC.stop();
     }
-    KEYTAB_FILE.delete();
-    TestSimpleRpcServer.tearDownClass();
-    TEST_UTIL.cleanupTestDir();
+    if (KEYTAB_FILE != null) {
+      KEYTAB_FILE.delete();
+    }
+    if (TEST_UTIL != null) {
+      TEST_UTIL.shutdownMiniCluster();
+      TEST_UTIL.cleanupTestDir();
+    }
   }
 
-  @Override
   @Test
   public void testSimpleRpcServer() throws Exception {
     UGI.doAs(new PrivilegedExceptionAction<Void>() {
       @Override
       public Void run() throws Exception {
-        doTest(name.getTableName());
+        doTest(tableName);
         return null;
       }
     });
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestSecurityRpcSentBytesMetrics.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestSecurityRpcSentBytesMetrics.java
index 79551a68328..5de5a7fb497 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestSecurityRpcSentBytesMetrics.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestSecurityRpcSentBytesMetrics.java
@@ -23,13 +23,12 @@ import static org.apache.hadoop.hbase.security.HBaseKerberosUtils.getKeytabFileF
 import static org.apache.hadoop.hbase.security.HBaseKerberosUtils.getPrincipalForTesting;
 import static org.apache.hadoop.hbase.security.HBaseKerberosUtils.loginKerberosPrincipal;
 import static org.apache.hadoop.hbase.security.HBaseKerberosUtils.setSecuredConfiguration;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.io.File;
 import java.net.InetSocketAddress;
 import java.util.Collections;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.security.HBaseKerberosUtils;
@@ -39,12 +38,11 @@ import org.apache.hadoop.hbase.testclassification.MediumTests;
 import org.apache.hadoop.hbase.testclassification.SecurityTests;
 import org.apache.hadoop.minikdc.MiniKdc;
 import org.apache.hadoop.security.UserGroupInformation;
-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.mockito.Mockito;
 
 import org.apache.hbase.thirdparty.com.google.common.collect.Lists;
@@ -52,13 +50,10 @@ import org.apache.hbase.thirdparty.com.google.common.collect.Lists;
 import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos;
 import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestRpcServiceProtos.TestProtobufRpcProto.BlockingInterface;
 
-@Category({ SecurityTests.class, MediumTests.class })
+@Tag(SecurityTests.TAG)
+@Tag(MediumTests.TAG)
 public class TestSecurityRpcSentBytesMetrics {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestSecurityRpcSentBytesMetrics.class);
-
   protected static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
 
   protected static final File KEYTAB_FILE =
@@ -100,18 +95,18 @@ public class TestSecurityRpcSentBytesMetrics {
     setSecuredConfiguration(serverConf);
   }
 
-  @BeforeClass
+  @BeforeAll
   public static void setUp() throws Exception {
     initKDCAndConf();
   }
 
-  @AfterClass
+  @AfterAll
   public static void tearDown() throws Exception {
     stopKDC();
     TEST_UTIL.cleanupTestDir();
   }
 
-  @Before
+  @BeforeEach
   public void setUpTest() throws Exception {
     setUpPrincipalAndConf();
   }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestServerCall.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestServerCall.java
index 152f358b1a6..6b1bf82fff1 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestServerCall.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestServerCall.java
@@ -17,8 +17,8 @@
  */
 package org.apache.hadoop.hbase.ipc;
 
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
+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.doThrow;
 import static org.mockito.Mockito.mock;
@@ -29,16 +29,14 @@ import java.net.InetAddress;
 import java.nio.ByteBuffer;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.CellScanner;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.codec.Codec;
 import org.apache.hadoop.hbase.io.ByteBuffAllocator;
 import org.apache.hadoop.hbase.testclassification.MediumTests;
 import org.apache.hadoop.hbase.testclassification.RPCTests;
-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;
 
@@ -52,13 +50,10 @@ import org.apache.hadoop.hbase.shaded.protobuf.generated.RPCProtos.RequestHeader
 /**
  * Test for ServerCall IOException handling in setResponse method.
  */
-@Category({ RPCTests.class, MediumTests.class })
+@Tag(RPCTests.TAG)
+@Tag(MediumTests.TAG)
 public class TestServerCall {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestServerCall.class);
-
   private static final Logger LOG = LoggerFactory.getLogger(TestServerCall.class);
 
   private Configuration conf;
@@ -71,7 +66,7 @@ public class TestServerCall {
   private BlockingService mockService;
   private MethodDescriptor mockMethodDescriptor;
 
-  @Before
+  @BeforeEach
   public void setUp() throws Exception {
     conf = HBaseConfiguration.create();
     mockConnection = mock(NettyServerRpcConnection.class);
@@ -117,13 +112,13 @@ public class TestServerCall {
 
     // Verify that response is not null and contains error information
     BufferChain response = call.getResponse();
-    assertNotNull("Response should not be null even when IOException occurs", response);
-    assertTrue("Call should be marked as error", call.isError);
+    assertNotNull(response, "Response should not be null even when IOException occurs");
+    assertTrue(call.isError, "Call should be marked as error");
 
     // Verify the response buffer is valid
     ByteBuffer[] bufs = response.getBuffers();
-    assertNotNull("Response buffers should not be null", bufs);
-    assertTrue("Response should have at least one buffer", bufs.length > 0);
+    assertNotNull(bufs, "Response buffers should not be null");
+    assertTrue(bufs.length > 0, "Response should have at least one buffer");
   }
 
   /**
@@ -146,7 +141,7 @@ public class TestServerCall {
 
     // Even if error response creation might fail, the call should still be marked as error
     call.setResponse(mockResponse, mockCellScanner, null, null);
-    assertTrue("Call should be marked as error", call.isError);
+    assertTrue(call.isError, "Call should be marked as error");
   }
 
   /**
@@ -168,7 +163,7 @@ public class TestServerCall {
     call.setResponse(mockResponse, null, null, null);
 
     BufferChain response = call.getResponse();
-    assertNotNull("Response should not be null in normal flow", response);
-    assertTrue("Call should not be marked as error in normal flow", !call.isError);
+    assertNotNull(response, "Response should not be null in normal flow");
+    assertTrue(!call.isError, "Call should not be marked as error in normal flow");
   }
 }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestSimpleRpcScheduler.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestSimpleRpcScheduler.java
index 86f46171673..c7490bb2e7c 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestSimpleRpcScheduler.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestSimpleRpcScheduler.java
@@ -17,11 +17,11 @@
  */
 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.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.assertNotEquals;
+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.eq;
 import static org.mockito.Mockito.doAnswer;
@@ -43,7 +43,6 @@ import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.LinkedBlockingQueue;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.Abortable;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.client.Put;
@@ -54,12 +53,10 @@ import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.EnvironmentEdge;
 import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
 import org.apache.hadoop.hbase.util.Threads;
-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.Mockito;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
@@ -76,16 +73,10 @@ import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.ScanReques
 import org.apache.hadoop.hbase.shaded.protobuf.generated.RPCProtos;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.RPCProtos.RequestHeader;
 
-@Category({ RPCTests.class, MediumTests.class })
+@Tag(RPCTests.TAG)
+@Tag(MediumTests.TAG)
 public class TestSimpleRpcScheduler {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestSimpleRpcScheduler.class);
-
-  @Rule
-  public TestName testName = new TestName();
-
   private static final Logger LOG = LoggerFactory.getLogger(TestSimpleRpcScheduler.class);
 
   private final RpcScheduler.Context CONTEXT = new RpcScheduler.Context() {
@@ -95,9 +86,11 @@ public class TestSimpleRpcScheduler {
     }
   };
   private Configuration conf;
+  private String testMethodName;
 
-  @Before
-  public void setUp() {
+  @BeforeEach
+  public void setUp(TestInfo testInfo) {
+    testMethodName = testInfo.getTestMethod().get().getName();
     conf = HBaseConfiguration.create();
   }
 
@@ -650,8 +643,8 @@ public class TestSimpleRpcScheduler {
       // make sure fast calls are handled
       waitUntilQueueEmpty(scheduler);
       Thread.sleep(100);
-      assertEquals("None of these calls should have been discarded", 0,
-        scheduler.getNumGeneralCallsDropped());
+      assertEquals(0, scheduler.getNumGeneralCallsDropped(),
+        "None of these calls should have been discarded");
 
       envEdge.offset = 151;
       // calls slower than min delay, but not individually slow enough to be dropped
@@ -665,8 +658,8 @@ public class TestSimpleRpcScheduler {
       // make sure somewhat slow calls are handled
       waitUntilQueueEmpty(scheduler);
       Thread.sleep(100);
-      assertEquals("None of these calls should have been discarded", 0,
-        scheduler.getNumGeneralCallsDropped());
+      assertEquals(0, scheduler.getNumGeneralCallsDropped(),
+        "None of these calls should have been discarded");
 
       envEdge.offset = 2000;
       // now slow calls and the ones to be dropped
@@ -680,8 +673,9 @@ public class TestSimpleRpcScheduler {
       // make sure somewhat slow calls are handled
       waitUntilQueueEmpty(scheduler);
       Thread.sleep(100);
-      assertTrue("There should have been at least 12 calls dropped however there were "
-        + scheduler.getNumGeneralCallsDropped(), scheduler.getNumGeneralCallsDropped() > 12);
+      assertTrue(scheduler.getNumGeneralCallsDropped() > 12,
+        "There should have been at least 12 calls dropped however there were "
+          + scheduler.getNumGeneralCallsDropped());
     } finally {
       scheduler.stop();
     }
@@ -689,7 +683,7 @@ public class TestSimpleRpcScheduler {
 
   @Test
   public void testFastPathBalancedQueueRpcExecutorWithQueueLength0() throws Exception {
-    String name = testName.getMethodName();
+    String name = testMethodName;
     int handlerCount = 1;
     String callQueueType = RpcExecutor.CALL_QUEUE_TYPE_CODEL_CONF_VALUE;
     int maxQueueLength = 0;
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestSimpleRpcServer.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestSimpleRpcServer.java
index 2bb50cb3d42..56d5ddf7255 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestSimpleRpcServer.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestSimpleRpcServer.java
@@ -17,53 +17,22 @@
  */
 package org.apache.hadoop.hbase.ipc;
 
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
-import org.apache.hadoop.hbase.TableName;
-import org.apache.hadoop.hbase.TableNameTestRule;
-import org.apache.hadoop.hbase.client.Get;
-import org.apache.hadoop.hbase.client.Put;
-import org.apache.hadoop.hbase.client.Result;
-import org.apache.hadoop.hbase.client.Table;
-import org.apache.hadoop.hbase.client.TableDescriptor;
-import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
-import org.apache.hadoop.hbase.regionserver.DisabledRegionSplitPolicy;
 import org.apache.hadoop.hbase.testclassification.MediumTests;
 import org.apache.hadoop.hbase.testclassification.RPCTests;
-import org.apache.hadoop.hbase.util.Bytes;
-import org.apache.hadoop.hbase.util.LoadTestKVGenerator;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-
-@Category({ RPCTests.class, MediumTests.class })
-public class TestSimpleRpcServer {
-
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestSimpleRpcServer.class);
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
-  private static final byte[] FAMILY = Bytes.toBytes("f");
-  private static final byte[] QUALIFIER = Bytes.toBytes("q");
-  private static final int NUM_ROWS = 100;
-  private static final int MIN_LEN = 1000;
-  private static final int MAX_LEN = 1000000;
-  protected static final LoadTestKVGenerator GENERATOR = new LoadTestKVGenerator(MIN_LEN, MAX_LEN);
-  protected static HBaseTestingUtility TEST_UTIL;
-
-  @Rule
-  public TableNameTestRule name = new TableNameTestRule();
+@Tag(RPCTests.TAG)
+@Tag(MediumTests.TAG)
+public class TestSimpleRpcServer extends AbstractTestRpcServer {
 
   @SuppressWarnings("deprecation")
-  @BeforeClass
+  @BeforeAll
   public static void setupClass() throws Exception {
-    // A subclass may have already created TEST_UTIL and is now upcalling to us
+    // Reuse TEST_UTIL if the test already initialized it.
     if (TEST_UTIL == null) {
       TEST_UTIL = new HBaseTestingUtility();
     }
@@ -73,38 +42,15 @@ public class TestSimpleRpcServer {
     TEST_UTIL.startMiniCluster();
   }
 
-  @AfterClass
+  @AfterAll
   public static void tearDownClass() throws Exception {
-    TEST_UTIL.shutdownMiniCluster();
+    if (TEST_UTIL != null) {
+      TEST_UTIL.shutdownMiniCluster();
+    }
   }
 
   @Test
   public void testSimpleRpcServer() throws Exception {
-    doTest(name.getTableName());
+    doTest(tableName);
   }
-
-  protected void doTest(TableName tableName) throws Exception {
-    // Splitting just complicates the test scenario, disable it
-    final TableDescriptor desc = TableDescriptorBuilder.newBuilder(tableName)
-      .setRegionSplitPolicyClassName(DisabledRegionSplitPolicy.class.getName()).build();
-    try (Table table =
-      TEST_UTIL.createTable(desc, new byte[][] { FAMILY }, TEST_UTIL.getConfiguration())) {
-      // put some test data
-      for (int i = 0; i < NUM_ROWS; i++) {
-        final byte[] rowKey = Bytes.toBytes(LoadTestKVGenerator.md5PrefixedKey(i));
-        final byte[] v = GENERATOR.generateRandomSizeValue(rowKey, QUALIFIER);
-        table.put(new Put(rowKey).addColumn(FAMILY, QUALIFIER, v));
-      }
-      // read to verify it.
-      for (int i = 0; i < NUM_ROWS; i++) {
-        final byte[] rowKey = Bytes.toBytes(LoadTestKVGenerator.md5PrefixedKey(i));
-        final Result r = table.get(new Get(rowKey).addColumn(FAMILY, QUALIFIER));
-        assertNotNull("Result was empty", r);
-        final byte[] v = r.getValue(FAMILY, QUALIFIER);
-        assertNotNull("Result did not contain expected value", v);
-        assertTrue("Value was not verified", LoadTestKVGenerator.verify(v, rowKey, QUALIFIER));
-      }
-    }
-  }
-
 }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/MobTestUtil.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/MobTestUtil.java
index 1d3d5bf5ad3..e89bf617b16 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/MobTestUtil.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/MobTestUtil.java
@@ -17,6 +17,9 @@
  */
 package org.apache.hadoop.hbase.mob;
 
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
 import java.io.IOException;
 import java.util.Date;
 import java.util.List;
@@ -40,7 +43,6 @@ import org.apache.hadoop.hbase.io.hfile.CacheConfig;
 import org.apache.hadoop.hbase.regionserver.StoreFileWriter;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
-import org.junit.Assert;
 
 public class MobTestUtil {
   protected static final char FIRST_CHAR = 'a';
@@ -84,13 +86,11 @@ public class MobTestUtil {
    * Compare two Cells only for their row family qualifier value
    */
   public static void assertCellEquals(Cell firstKeyValue, Cell secondKeyValue) {
-    Assert.assertArrayEquals(CellUtil.cloneRow(firstKeyValue), CellUtil.cloneRow(secondKeyValue));
-    Assert.assertArrayEquals(CellUtil.cloneFamily(firstKeyValue),
-      CellUtil.cloneFamily(secondKeyValue));
-    Assert.assertArrayEquals(CellUtil.cloneQualifier(firstKeyValue),
+    assertArrayEquals(CellUtil.cloneRow(firstKeyValue), CellUtil.cloneRow(secondKeyValue));
+    assertArrayEquals(CellUtil.cloneFamily(firstKeyValue), CellUtil.cloneFamily(secondKeyValue));
+    assertArrayEquals(CellUtil.cloneQualifier(firstKeyValue),
       CellUtil.cloneQualifier(secondKeyValue));
-    Assert.assertArrayEquals(CellUtil.cloneValue(firstKeyValue),
-      CellUtil.cloneValue(secondKeyValue));
+    assertArrayEquals(CellUtil.cloneValue(firstKeyValue), CellUtil.cloneValue(secondKeyValue));
   }
 
   public static void assertCellsValue(Table table, Scan scan, byte[] expectedValue,
@@ -101,12 +101,12 @@ public class MobTestUtil {
       List<Cell> cells = res.listCells();
       for (Cell cell : cells) {
         // Verify the value
-        Assert.assertArrayEquals(expectedValue, CellUtil.cloneValue(cell));
+        assertArrayEquals(expectedValue, CellUtil.cloneValue(cell));
         count++;
       }
     }
     results.close();
-    Assert.assertEquals(expectedCount, count);
+    assertEquals(expectedCount, count);
   }
 
   /**
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestCachedMobFile.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestCachedMobFile.java
index eee9fd0d5fc..af835ad965d 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestCachedMobFile.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestCachedMobFile.java
@@ -17,13 +17,13 @@
  */
 package org.apache.hadoop.hbase.mob;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
 
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hbase.Cell;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.KeyValue;
 import org.apache.hadoop.hbase.KeyValue.Type;
@@ -36,22 +36,15 @@ import org.apache.hadoop.hbase.regionserver.StoreFileInfo;
 import org.apache.hadoop.hbase.regionserver.StoreFileWriter;
 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.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;
 
-@Category(SmallTests.class)
+@Tag(SmallTests.TAG)
 public class TestCachedMobFile {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestCachedMobFile.class);
-
   static final Logger LOG = LoggerFactory.getLogger(TestCachedMobFile.class);
   private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
   private Configuration conf = TEST_UTIL.getConfiguration();
@@ -61,12 +54,10 @@ public class TestCachedMobFile {
   private static final long EXPECTED_REFERENCE_ZERO = 0;
   private static final long EXPECTED_REFERENCE_ONE = 1;
   private static final long EXPECTED_REFERENCE_TWO = 2;
-  @Rule
-  public TestName testName = new TestName();
 
   @Test
-  public void testOpenClose() throws Exception {
-    String caseName = testName.getMethodName();
+  public void testOpenClose(TestInfo testInfo) throws Exception {
+    String caseName = testInfo.getTestMethod().get().getName();
     Path testDir = TEST_UTIL.getDataTestDir();
     FileSystem fs = testDir.getFileSystem(conf);
     HFileContext meta = new HFileContextBuilder().withBlockSize(8 * 1024).build();
@@ -90,8 +81,8 @@ public class TestCachedMobFile {
 
   @SuppressWarnings("SelfComparison")
   @Test
-  public void testCompare() throws Exception {
-    String caseName = testName.getMethodName();
+  public void testCompare(TestInfo testInfo) throws Exception {
+    String caseName = testInfo.getTestMethod().get().getName();
     Path testDir = TEST_UTIL.getDataTestDir();
     FileSystem fs = testDir.getFileSystem(conf);
     Path outputDir1 = new Path(testDir, FAMILY1);
@@ -119,13 +110,13 @@ public class TestCachedMobFile {
   }
 
   @Test
-  public void testReadKeyValue() throws Exception {
+  public void testReadKeyValue(TestInfo testInfo) throws Exception {
     Path testDir = TEST_UTIL.getDataTestDir();
     FileSystem fs = testDir.getFileSystem(conf);
     HFileContext meta = new HFileContextBuilder().withBlockSize(8 * 1024).build();
     StoreFileWriter writer = new StoreFileWriter.Builder(conf, cacheConf, fs).withOutputDir(testDir)
       .withFileContext(meta).build();
-    String caseName = testName.getMethodName();
+    String caseName = testInfo.getTestMethod().get().getName();
     MobTestUtil.writeStoreFile(writer, caseName);
     StoreFileInfo storeFileInfo =
       StoreFileInfo.createStoreFileInfoForHFile(conf, fs, writer.getPath(), true);
@@ -165,6 +156,6 @@ public class TestCachedMobFile {
     // Test the key which is more than the end key
     byte[] upperKey = Bytes.toBytes("z{"); // Bigger than "zz"
     seekKey = new KeyValue(upperKey, family, qualify, Long.MAX_VALUE, Type.Put, upperKey);
-    Assert.assertNull(cachedMobFile.readCell(seekKey, false));
+    assertNull(cachedMobFile.readCell(seekKey, false));
   }
 }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestDefaultMobStoreFlusher.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestDefaultMobStoreFlusher.java
index 056afaf6fc4..0b05560d984 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestDefaultMobStoreFlusher.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestDefaultMobStoreFlusher.java
@@ -17,12 +17,14 @@
  */
 package org.apache.hadoop.hbase.mob;
 
-import java.util.Arrays;
-import java.util.Collection;
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
 import java.util.List;
+import java.util.stream.Stream;
 import org.apache.hadoop.hbase.Cell;
 import org.apache.hadoop.hbase.CellUtil;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
+import org.apache.hadoop.hbase.HBaseParameterizedTestTemplate;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;
@@ -36,25 +38,17 @@ import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
 import org.apache.hadoop.hbase.regionserver.storefiletracker.StoreFileTrackerFactory;
 import org.apache.hadoop.hbase.testclassification.LargeTests;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.junit.After;
-import org.junit.Assert;
-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.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-@RunWith(Parameterized.class)
-@Category(LargeTests.class)
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.TestInfo;
+import org.junit.jupiter.api.TestTemplate;
+import org.junit.jupiter.params.provider.Arguments;
+
+@Tag(LargeTests.TAG)
+@HBaseParameterizedTestTemplate(name = "{index}: useFileBasedSFT={0}")
 public class TestDefaultMobStoreFlusher {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestDefaultMobStoreFlusher.class);
-
   private final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
   private final static byte[] row1 = Bytes.toBytes("row1");
   private final static byte[] row2 = Bytes.toBytes("row2");
@@ -64,8 +58,7 @@ public class TestDefaultMobStoreFlusher {
   private final static byte[] value1 = Bytes.toBytes("value1");
   private final static byte[] value2 = Bytes.toBytes("value2");
 
-  @Rule
-  public TestName name = new TestName();
+  private String testMethodName;
 
   protected Boolean useFileBasedSFT;
 
@@ -73,14 +66,14 @@ public class TestDefaultMobStoreFlusher {
     this.useFileBasedSFT = useFileBasedSFT;
   }
 
-  @Parameterized.Parameters
-  public static Collection<Boolean> data() {
-    Boolean[] data = { false, true };
-    return Arrays.asList(data);
+  public static Stream<Arguments> parameters() {
+    return Stream.of(false, true).map(Arguments::of);
   }
 
-  @Before
-  public void setUpBefore() throws Exception {
+  @BeforeEach
+  public void setUpBefore(TestInfo testInfo) throws Exception {
+    testMethodName = testInfo.getTestMethod().get().getName()
+      + testInfo.getDisplayName().replaceAll("[:= ]", "_").replaceAll("_+", "_").trim();
     if (useFileBasedSFT) {
       TEST_UTIL.getConfiguration().set(StoreFileTrackerFactory.TRACKER_IMPL,
         "org.apache.hadoop.hbase.regionserver.storefiletracker.FileBasedStoreFileTracker");
@@ -88,23 +81,23 @@ public class TestDefaultMobStoreFlusher {
     TEST_UTIL.startMiniCluster(1);
   }
 
-  @After
+  @AfterEach
   public void tearDownAfter() throws Exception {
     TEST_UTIL.shutdownMiniCluster();
   }
 
-  @Test
+  @TestTemplate
   public void testFlushNonMobFile() throws Exception {
-    final TableName tableName = TableName.valueOf(TestMobUtils.getTableName(name));
+    final TableName tableName = TableName.valueOf(TestMobUtils.getTableName(testMethodName));
     TableDescriptor tableDescriptor = TableDescriptorBuilder.newBuilder(tableName)
       .setColumnFamily(ColumnFamilyDescriptorBuilder.newBuilder(family).setMaxVersions(4).build())
       .build();
     testFlushFile(tableDescriptor);
   }
 
-  @Test
+  @TestTemplate
   public void testFlushMobFile() throws Exception {
-    final TableName tableName = TableName.valueOf(TestMobUtils.getTableName(name));
+    final TableName tableName = TableName.valueOf(TestMobUtils.getTableName(testMethodName));
     TableDescriptor tableDescriptor = TableDescriptorBuilder.newBuilder(tableName)
       .setColumnFamily(ColumnFamilyDescriptorBuilder.newBuilder(family).setMobEnabled(true)
         .setMobThreshold(3L).setMaxVersions(4).build())
@@ -142,12 +135,12 @@ public class TestDefaultMobStoreFlusher {
         size++;
         List<Cell> cells = result.getColumnCells(family, qf1);
         // Verify the cell size
-        Assert.assertEquals(1, cells.size());
+        assertEquals(1, cells.size());
         // Verify the value
-        Assert.assertArrayEquals(value1, CellUtil.cloneValue(cells.get(0)));
+        assertArrayEquals(value1, CellUtil.cloneValue(cells.get(0)));
       }
       scanner.close();
-      Assert.assertEquals(1, size);
+      assertEquals(1, size);
     } finally {
       table.close();
     }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestExpiredMobFileCleaner.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestExpiredMobFileCleaner.java
index a59b839a806..d1b976cefee 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestExpiredMobFileCleaner.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestExpiredMobFileCleaner.java
@@ -18,11 +18,10 @@
 package org.apache.hadoop.hbase.mob;
 
 import static org.apache.hadoop.hbase.mob.MobConstants.MOB_CLEANER_BATCH_SIZE_UPPER_BOUND;
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.Path;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.HColumnDescriptor;
 import org.apache.hadoop.hbase.HTableDescriptor;
@@ -36,23 +35,18 @@ import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.CommonFSUtils;
 import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
 import org.apache.hadoop.util.ToolRunner;
-import org.junit.After;
-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.AfterEach;
+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;
 
-@Category(MediumTests.class)
+@Tag(MediumTests.TAG)
 public class TestExpiredMobFileCleaner {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestExpiredMobFileCleaner.class);
-
   private final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
   private final static TableName tableName = TableName.valueOf("TestExpiredMobFileCleaner");
   private final static String family = "family";
@@ -65,23 +59,23 @@ public class TestExpiredMobFileCleaner {
   private static BufferedMutator table;
   private static Admin admin;
 
-  @BeforeClass
+  @BeforeAll
   public static void setUpBeforeClass() throws Exception {
     TEST_UTIL.getConfiguration().setInt("hfile.format.version", 3);
     TEST_UTIL.getConfiguration().setInt(MOB_CLEANER_BATCH_SIZE_UPPER_BOUND, 2);
   }
 
-  @AfterClass
+  @AfterAll
   public static void tearDownAfterClass() throws Exception {
 
   }
 
-  @Before
+  @BeforeEach
   public void setUp() throws Exception {
     TEST_UTIL.startMiniCluster(1);
   }
 
-  @After
+  @AfterEach
   public void tearDown() throws Exception {
     admin.disableTable(tableName);
     admin.deleteTable(tableName);
@@ -145,7 +139,7 @@ public class TestExpiredMobFileCleaner {
       TEST_UTIL.getDefaultRootDirPath(), LOG);
     FileStatus[] firstFiles = TEST_UTIL.getTestFileSystem().listStatus(mobDirPath);
     // the first mob file
-    assertEquals("Before cleanup without delay 1", 1, firstFiles.length);
+    assertEquals(1, firstFiles.length, "Before cleanup without delay 1");
     String firstFile = firstFiles[0].getPath().getName();
 
     // 1.5 day before
@@ -153,7 +147,7 @@ public class TestExpiredMobFileCleaner {
     putKVAndFlush(table, row2, dummyData, ts);
     FileStatus[] secondFiles = TEST_UTIL.getTestFileSystem().listStatus(mobDirPath);
     // now there are 2 mob files
-    assertEquals("Before cleanup without delay 2", 2, secondFiles.length);
+    assertEquals(2, secondFiles.length, "Before cleanup without delay 2");
     String f1 = secondFiles[0].getPath().getName();
     String f2 = secondFiles[1].getPath().getName();
     String secondFile = f1.equals(firstFile) ? f2 : f1;
@@ -164,7 +158,7 @@ public class TestExpiredMobFileCleaner {
     putKVAndFlush(table, row3, dummyData, ts);
     FileStatus[] thirdFiles = TEST_UTIL.getTestFileSystem().listStatus(mobDirPath);
     // now there are 4 mob files
-    assertEquals("Before cleanup without delay 3", 4, thirdFiles.length);
+    assertEquals(4, thirdFiles.length, "Before cleanup without delay 3");
 
     modifyColumnExpiryDays(2); // ttl = 2, make the first row expired
 
@@ -177,8 +171,8 @@ public class TestExpiredMobFileCleaner {
     FileStatus[] filesAfterClean = TEST_UTIL.getTestFileSystem().listStatus(mobDirPath);
     String lastFile = filesAfterClean[0].getPath().getName();
     // there are 4 mob files in total, but only 3 need to be cleaned
-    assertEquals("After cleanup without delay 1", 1, filesAfterClean.length);
-    assertEquals("After cleanup without delay 2", secondFile, lastFile);
+    assertEquals(1, filesAfterClean.length, "After cleanup without delay 1");
+    assertEquals(secondFile, lastFile, "After cleanup without delay 2");
   }
 
   private int secondsOfDay() {
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestExpiredMobFileCleanerChore.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestExpiredMobFileCleanerChore.java
index 3d9cced8935..81567db88c0 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestExpiredMobFileCleanerChore.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestExpiredMobFileCleanerChore.java
@@ -19,12 +19,11 @@ package org.apache.hadoop.hbase.mob;
 
 import static org.apache.hadoop.hbase.mob.MobConstants.MOB_CLEANER_BATCH_SIZE_UPPER_BOUND;
 import static org.apache.hadoop.hbase.mob.MobConstants.MOB_CLEANER_THREAD_COUNT;
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import java.io.IOException;
 import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.Path;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.client.Admin;
@@ -38,20 +37,16 @@ import org.apache.hadoop.hbase.testclassification.MasterTests;
 import org.apache.hadoop.hbase.testclassification.MediumTests;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Assert;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-
-@Category({ MediumTests.class, MasterTests.class })
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+
+@Tag(MediumTests.TAG)
+@Tag(MasterTests.TAG)
 public class TestExpiredMobFileCleanerChore {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestExpiredMobFileCleanerChore.class);
   private final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
   private final static TableName tableName = TableName.valueOf("TestExpiredMobFileCleaner");
   private final static TableName tableName2 = TableName.valueOf("TestExpiredMobFileCleaner2");
@@ -66,7 +61,7 @@ public class TestExpiredMobFileCleanerChore {
   private static BufferedMutator table2;
   private static MobFileCleanerChore mobFileCleanerChore;
 
-  @BeforeClass
+  @BeforeAll
   public static void setUp() throws Exception {
     TEST_UTIL.getConfiguration().setInt("hfile.format.version", 3);
     TEST_UTIL.getConfiguration().setInt(MOB_CLEANER_BATCH_SIZE_UPPER_BOUND, 2);
@@ -74,7 +69,7 @@ public class TestExpiredMobFileCleanerChore {
     mobFileCleanerChore = TEST_UTIL.getMiniHBaseCluster().getMaster().getMobFileCleanerChore();
   }
 
-  @After
+  @AfterEach
   public void cleanUp() throws IOException {
     admin.disableTable(tableName);
     admin.deleteTable(tableName);
@@ -83,7 +78,7 @@ public class TestExpiredMobFileCleanerChore {
     admin.close();
   }
 
-  @AfterClass
+  @AfterAll
   public static void tearDown() throws Exception {
     TEST_UTIL.shutdownMiniCluster();
     TEST_UTIL.getTestFileSystem().delete(TEST_UTIL.getDataTestDir(), true);
@@ -94,7 +89,7 @@ public class TestExpiredMobFileCleanerChore {
     TEST_UTIL.getConfiguration().setInt(MOB_CLEANER_THREAD_COUNT, 1);
     mobFileCleanerChore.onConfigurationChange(TEST_UTIL.getConfiguration());
     int corePoolSize = mobFileCleanerChore.getExecutor().getCorePoolSize();
-    Assert.assertEquals(1, corePoolSize);
+    assertEquals(1, corePoolSize);
     testCleanerInternal();
   }
 
@@ -103,7 +98,7 @@ public class TestExpiredMobFileCleanerChore {
     TEST_UTIL.getConfiguration().setInt(MOB_CLEANER_THREAD_COUNT, 2);
     mobFileCleanerChore.onConfigurationChange(TEST_UTIL.getConfiguration());
     int corePoolSize = mobFileCleanerChore.getExecutor().getCorePoolSize();
-    Assert.assertEquals(2, corePoolSize);
+    assertEquals(2, corePoolSize);
     testCleanerInternal();
   }
 
@@ -174,7 +169,7 @@ public class TestExpiredMobFileCleanerChore {
     putKVAndFlush(table, row1, dummyData, ts, tableName);
     FileStatus[] firstFiles = TEST_UTIL.getTestFileSystem().listStatus(mobDirPath);
     // the first mob file
-    assertEquals("Before cleanup without delay 1", 1, firstFiles.length);
+    assertEquals(1, firstFiles.length, "Before cleanup without delay 1");
     String firstFile = firstFiles[0].getPath().getName();
 
     // 1.5 day before
@@ -182,7 +177,7 @@ public class TestExpiredMobFileCleanerChore {
     putKVAndFlush(table, row2, dummyData, ts, tableName);
     FileStatus[] secondFiles = TEST_UTIL.getTestFileSystem().listStatus(mobDirPath);
     // now there are 2 mob files
-    assertEquals("Before cleanup without delay 2", 2, secondFiles.length);
+    assertEquals(2, secondFiles.length, "Before cleanup without delay 2");
     String f1 = secondFiles[0].getPath().getName();
     String f2 = secondFiles[1].getPath().getName();
     String secondFile = f1.equals(firstFile) ? f2 : f1;
@@ -193,7 +188,7 @@ public class TestExpiredMobFileCleanerChore {
     putKVAndFlush(table, row3, dummyData, ts, tableName);
     FileStatus[] thirdFiles = TEST_UTIL.getTestFileSystem().listStatus(mobDirPath);
     // now there are 4 mob files
-    assertEquals("Before cleanup without delay 3", 4, thirdFiles.length);
+    assertEquals(4, thirdFiles.length, "Before cleanup without delay 3");
 
     // modifyColumnExpiryDays(2); // ttl = 2, make the first row expired
 
@@ -205,7 +200,7 @@ public class TestExpiredMobFileCleanerChore {
     putKVAndFlush(table2, row1, dummyData2, ts, tableName2);
     FileStatus[] firstFiles2 = TEST_UTIL.getTestFileSystem().listStatus(mobDirPath2);
     // the first mob file
-    assertEquals("Before cleanup without delay 1", 1, firstFiles2.length);
+    assertEquals(1, firstFiles2.length, "Before cleanup without delay 1");
     String firstFile2 = firstFiles2[0].getPath().getName();
 
     // 1.5 day before
@@ -213,7 +208,7 @@ public class TestExpiredMobFileCleanerChore {
     putKVAndFlush(table2, row2, dummyData2, ts, tableName2);
     FileStatus[] secondFiles2 = TEST_UTIL.getTestFileSystem().listStatus(mobDirPath2);
     // now there are 2 mob files
-    assertEquals("Before cleanup without delay 2", 2, secondFiles2.length);
+    assertEquals(2, secondFiles2.length, "Before cleanup without delay 2");
     String f1Second = secondFiles2[0].getPath().getName();
     String f2Second = secondFiles2[1].getPath().getName();
     String secondFile2 = f1Second.equals(firstFile2) ? f2Second : f1Second;
@@ -223,7 +218,7 @@ public class TestExpiredMobFileCleanerChore {
     putKVAndFlush(table2, row3, dummyData2, ts, tableName2);
     FileStatus[] thirdFiles2 = TEST_UTIL.getTestFileSystem().listStatus(mobDirPath2);
     // now there are 4 mob files
-    assertEquals("Before cleanup without delay 3", 4, thirdFiles2.length);
+    assertEquals(4, thirdFiles2.length, "Before cleanup without delay 3");
 
     modifyColumnExpiryDays(2); // ttl = 2, make the first row expired
 
@@ -233,14 +228,14 @@ public class TestExpiredMobFileCleanerChore {
     FileStatus[] filesAfterClean = TEST_UTIL.getTestFileSystem().listStatus(mobDirPath);
     String lastFile = filesAfterClean[0].getPath().getName();
     // there are 4 mob files in total, but only 3 need to be cleaned
-    assertEquals("After cleanup without delay 1", 1, filesAfterClean.length);
-    assertEquals("After cleanup without delay 2", secondFile, lastFile);
+    assertEquals(1, filesAfterClean.length, "After cleanup without delay 1");
+    assertEquals(secondFile, lastFile, "After cleanup without delay 2");
 
     filesAfterClean = TEST_UTIL.getTestFileSystem().listStatus(mobDirPath2);
     lastFile = filesAfterClean[0].getPath().getName();
     // there are 4 mob files in total, but only 3 need to be cleaned
-    assertEquals("After cleanup without delay 1", 1, filesAfterClean.length);
-    assertEquals("After cleanup without delay 2", secondFile2, lastFile);
+    assertEquals(1, filesAfterClean.length, "After cleanup without delay 1");
+    assertEquals(secondFile2, lastFile, "After cleanup without delay 2");
   }
 
   private static int secondsOfDay() {
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobCompactionOptMode.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobCompactionOptMode.java
index 816ea29b911..a87482f56b6 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobCompactionOptMode.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobCompactionOptMode.java
@@ -17,10 +17,9 @@
  */
 package org.apache.hadoop.hbase.mob;
 
-import org.apache.hadoop.hbase.HBaseClassTestRule;
+import org.apache.hadoop.hbase.HBaseParameterizedTestTemplate;
 import org.apache.hadoop.hbase.testclassification.LargeTests;
-import org.junit.ClassRule;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
 
 /**
  * Mob file compaction chore in a generational non-batch mode test. 1. Uses default (non-batch) mode
@@ -32,11 +31,9 @@ import org.junit.experimental.categories.Category;
  * than minimum age to archive 10. Runs Mob cleaner chore 11 Verifies that number of MOB files in a
  * mob directory is 20. 12 Runs scanner and checks all 3 * 1000 rows.
  */
-@Category(LargeTests.class)
+@Tag(LargeTests.TAG)
+@HBaseParameterizedTestTemplate(name = "{index}: useFileBasedSFT={0}")
 public class TestMobCompactionOptMode extends TestMobCompactionWithDefaults {
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestMobCompactionOptMode.class);
 
   public TestMobCompactionOptMode(Boolean useFileBasedSFT) {
     super(useFileBasedSFT);
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobCompactionOptRegionBatchMode.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobCompactionOptRegionBatchMode.java
index dfd6435d364..3b3857b6001 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobCompactionOptRegionBatchMode.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobCompactionOptRegionBatchMode.java
@@ -18,15 +18,13 @@
 package org.apache.hadoop.hbase.mob;
 
 import java.io.IOException;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
+import org.apache.hadoop.hbase.HBaseParameterizedTestTemplate;
 import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;
 import org.apache.hadoop.hbase.client.TableDescriptor;
 import org.apache.hadoop.hbase.testclassification.LargeTests;
-import org.junit.Before;
-import org.junit.ClassRule;
-import org.junit.experimental.categories.Category;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.TestInfo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -40,14 +38,11 @@ import org.slf4j.LoggerFactory;
  * time larger than minimum age to archive 10. Runs Mob cleaner chore 11 Verifies that number of MOB
  * files in a mob directory is 20. 12 Runs scanner and checks all 3 * 1000 rows.
  */
-@RunWith(Parameterized.class)
-@Category(LargeTests.class)
+@Tag(LargeTests.TAG)
+@HBaseParameterizedTestTemplate(name = "{index}: useFileBasedSFT={0}")
 public class TestMobCompactionOptRegionBatchMode extends TestMobCompactionWithDefaults {
   private static final Logger LOG =
     LoggerFactory.getLogger(TestMobCompactionOptRegionBatchMode.class);
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestMobCompactionOptRegionBatchMode.class);
 
   private static final int batchSize = 7;
   private MobFileCompactionChore compactionChore;
@@ -56,9 +51,9 @@ public class TestMobCompactionOptRegionBatchMode extends TestMobCompactionWithDe
     super(useFileBasedSFT);
   }
 
-  @Before
-  public void setUp() throws Exception {
-    super.setUp();
+  @BeforeEach
+  public void setUp(TestInfo testInfo) throws Exception {
+    super.setUp(testInfo);
     compactionChore = new MobFileCompactionChore(conf, batchSize);
   }
 
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobCompactionRegularRegionBatchMode.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobCompactionRegularRegionBatchMode.java
index 5e2806bdee2..39fe1779d34 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobCompactionRegularRegionBatchMode.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobCompactionRegularRegionBatchMode.java
@@ -18,15 +18,13 @@
 package org.apache.hadoop.hbase.mob;
 
 import java.io.IOException;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
+import org.apache.hadoop.hbase.HBaseParameterizedTestTemplate;
 import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;
 import org.apache.hadoop.hbase.client.TableDescriptor;
 import org.apache.hadoop.hbase.testclassification.LargeTests;
-import org.junit.Before;
-import org.junit.ClassRule;
-import org.junit.experimental.categories.Category;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.TestInfo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -40,14 +38,11 @@ import org.slf4j.LoggerFactory;
  * to archive 10. Runs Mob cleaner chore 11 Verifies that number of MOB files in a mob directory is
  * 20. 12 Runs scanner and checks all 3 * 1000 rows.
  */
-@RunWith(Parameterized.class)
-@Category(LargeTests.class)
+@Tag(LargeTests.TAG)
+@HBaseParameterizedTestTemplate(name = "{index}: useFileBasedSFT={0}")
 public class TestMobCompactionRegularRegionBatchMode extends TestMobCompactionWithDefaults {
   private static final Logger LOG =
     LoggerFactory.getLogger(TestMobCompactionRegularRegionBatchMode.class);
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestMobCompactionRegularRegionBatchMode.class);
 
   private static final int batchSize = 7;
   private MobFileCompactionChore compactionChore;
@@ -56,9 +51,9 @@ public class TestMobCompactionRegularRegionBatchMode extends TestMobCompactionWi
     super(useFileBasedSFT);
   }
 
-  @Before
-  public void setUp() throws Exception {
-    super.setUp();
+  @BeforeEach
+  public void setUp(TestInfo testInfo) throws Exception {
+    super.setUp(testInfo);
     compactionChore = new MobFileCompactionChore(conf, batchSize);
   }
 
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobCompactionWithDefaults.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobCompactionWithDefaults.java
index b7283aa5919..70959ef3065 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobCompactionWithDefaults.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobCompactionWithDefaults.java
@@ -17,21 +17,21 @@
  */
 package org.apache.hadoop.hbase.mob;
 
-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.Arrays;
-import java.util.Collection;
 import java.util.List;
 import java.util.Random;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
+import org.apache.hadoop.hbase.HBaseParameterizedTestTemplate;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.ServerName;
 import org.apache.hadoop.hbase.TableName;
@@ -49,15 +49,12 @@ import org.apache.hadoop.hbase.regionserver.storefiletracker.StoreFileTrackerFac
 import org.apache.hadoop.hbase.testclassification.LargeTests;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.RegionSplitter;
-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.runner.RunWith;
-import org.junit.runners.Parameterized;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.TestInfo;
+import org.junit.jupiter.api.TestTemplate;
+import org.junit.jupiter.params.provider.Arguments;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -71,13 +68,10 @@ import org.slf4j.LoggerFactory;
  * Runs Mob cleaner chore 11 Verifies that number of MOB files in a mob directory is 20. 12 Runs
  * scanner and checks all 3 * 1000 rows.
  */
-@RunWith(Parameterized.class)
-@Category(LargeTests.class)
+@Tag(LargeTests.TAG)
+@HBaseParameterizedTestTemplate(name = "{index}: useFileBasedSFT={0}")
 public class TestMobCompactionWithDefaults {
   private static final Logger LOG = LoggerFactory.getLogger(TestMobCompactionWithDefaults.class);
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestMobCompactionWithDefaults.class);
 
   protected static HBaseTestingUtility HTU;
   protected static Configuration conf;
@@ -90,8 +84,7 @@ public class TestMobCompactionWithDefaults {
   protected final static byte[] mobVal = Bytes
     .toBytes("01234567890123456789012345678901234567890123456789012345678901234567890123456789");
 
-  @Rule
-  public TestName test = new TestName();
+  private String testMethodName;
   protected TableDescriptorBuilder.ModifyableTableDescriptor tableDescriptor;
   protected ColumnFamilyDescriptorBuilder.ModifyableColumnFamilyDescriptor familyDescriptor;
   protected Admin admin;
@@ -105,10 +98,8 @@ public class TestMobCompactionWithDefaults {
     this.useFileBasedSFT = useFileBasedSFT;
   }
 
-  @Parameterized.Parameters
-  public static Collection<Boolean> data() {
-    Boolean[] data = { false, true };
-    return Arrays.asList(data);
+  public static Stream<Arguments> parameters() {
+    return Stream.of(false, true).map(Arguments::of);
   }
 
   protected void htuStart() throws Exception {
@@ -135,10 +126,13 @@ public class TestMobCompactionWithDefaults {
   protected void additonalConfigSetup() {
   }
 
-  @Before
-  public void setUp() throws Exception {
+  @BeforeEach
+  public void setUp(TestInfo testInfo) throws Exception {
+    testMethodName = testInfo.getTestMethod().get().getName()
+      + testInfo.getDisplayName().replaceAll("[:= ]", "_").replaceAll("_+", "_").trim();
     htuStart();
-    tableDescriptor = HTU.createModifyableTableDescriptor(TestMobUtils.getTableName(test));
+    tableDescriptor =
+      HTU.createModifyableTableDescriptor(TestMobUtils.getTableName(testMethodName));
     admin = HTU.getAdmin();
     familyDescriptor = new ColumnFamilyDescriptorBuilder.ModifyableColumnFamilyDescriptor(fam);
     familyDescriptor.setMobEnabled(true);
@@ -170,56 +164,56 @@ public class TestMobCompactionWithDefaults {
     }
   }
 
-  @After
+  @AfterEach
   public void tearDown() throws Exception {
     admin.disableTable(tableDescriptor.getTableName());
     admin.deleteTable(tableDescriptor.getTableName());
     HTU.shutdownMiniCluster();
   }
 
-  @Test
+  @TestTemplate
   public void baseTestMobFileCompaction() throws InterruptedException, IOException {
     LOG.info("MOB compaction " + description() + " started");
     loadAndFlushThreeTimes(rows, table, famStr);
     mobCompact(tableDescriptor, familyDescriptor);
-    assertEquals("Should have 4 MOB files per region due to 3xflush + compaction.", numRegions * 4,
-      getNumberOfMobFiles(table, famStr));
+    assertEquals(numRegions * 4, getNumberOfMobFiles(table, famStr),
+      "Should have 4 MOB files per region due to 3xflush + compaction.");
     cleanupAndVerifyCounts(table, famStr, 3 * rows);
     LOG.info("MOB compaction " + description() + " finished OK");
   }
 
-  @Test
+  @TestTemplate
   public void testMobFileCompactionAfterSnapshotClone() throws InterruptedException, IOException {
-    final TableName clone = TableName.valueOf(TestMobUtils.getTableName(test) + "-clone");
+    final TableName clone = TableName.valueOf(TestMobUtils.getTableName(testMethodName) + "-clone");
     LOG.info("MOB compaction of cloned snapshot, " + description() + " started");
     loadAndFlushThreeTimes(rows, table, famStr);
     LOG.debug("Taking snapshot and cloning table {}", table);
-    admin.snapshot(TestMobUtils.getTableName(test), table);
-    admin.cloneSnapshot(TestMobUtils.getTableName(test), clone);
-    assertEquals("Should have 3 hlinks per region in MOB area from snapshot clone", 3 * numRegions,
-      getNumberOfMobFiles(clone, famStr));
+    admin.snapshot(TestMobUtils.getTableName(testMethodName), table);
+    admin.cloneSnapshot(TestMobUtils.getTableName(testMethodName), clone);
+    assertEquals(3 * numRegions, getNumberOfMobFiles(clone, famStr),
+      "Should have 3 hlinks per region in MOB area from snapshot clone");
     mobCompact(admin.getDescriptor(clone), familyDescriptor);
-    assertEquals("Should have 3 hlinks + 1 MOB file per region due to clone + compact",
-      4 * numRegions, getNumberOfMobFiles(clone, famStr));
+    assertEquals(4 * numRegions, getNumberOfMobFiles(clone, famStr),
+      "Should have 3 hlinks + 1 MOB file per region due to clone + compact");
     cleanupAndVerifyCounts(clone, famStr, 3 * rows);
     LOG.info("MOB compaction of cloned snapshot, " + description() + " finished OK");
   }
 
-  @Test
+  @TestTemplate
   public void testMobFileCompactionAfterSnapshotCloneAndFlush()
     throws InterruptedException, IOException {
-    final TableName clone = TableName.valueOf(TestMobUtils.getTableName(test) + "-clone");
+    final TableName clone = TableName.valueOf(TestMobUtils.getTableName(testMethodName) + "-clone");
     LOG.info("MOB compaction of cloned snapshot after flush, " + description() + " started");
     loadAndFlushThreeTimes(rows, table, famStr);
     LOG.debug("Taking snapshot and cloning table {}", table);
-    admin.snapshot(TestMobUtils.getTableName(test), table);
-    admin.cloneSnapshot(TestMobUtils.getTableName(test), clone);
-    assertEquals("Should have 3 hlinks per region in MOB area from snapshot clone", 3 * numRegions,
-      getNumberOfMobFiles(clone, famStr));
+    admin.snapshot(TestMobUtils.getTableName(testMethodName), table);
+    admin.cloneSnapshot(TestMobUtils.getTableName(testMethodName), clone);
+    assertEquals(3 * numRegions, getNumberOfMobFiles(clone, famStr),
+      "Should have 3 hlinks per region in MOB area from snapshot clone");
     loadAndFlushThreeTimes(rows, clone, famStr);
     mobCompact(admin.getDescriptor(clone), familyDescriptor);
-    assertEquals("Should have 7 MOB file per region due to clone + 3xflush + compact",
-      7 * numRegions, getNumberOfMobFiles(clone, famStr));
+    assertEquals(7 * numRegions, getNumberOfMobFiles(clone, famStr),
+      "Should have 7 MOB file per region due to clone + 3xflush + compact");
     cleanupAndVerifyCounts(clone, famStr, 6 * rows);
     LOG.info("MOB compaction of cloned snapshot w flush, " + description() + " finished OK");
   }
@@ -231,8 +225,8 @@ public class TestMobCompactionWithDefaults {
     loadData(table, rows);
     loadData(table, rows);
     loadData(table, rows);
-    assertEquals("Should have 3 more mob files per region from flushing.", start + numRegions * 3,
-      getNumberOfMobFiles(table, family));
+    assertEquals(start + numRegions * 3, getNumberOfMobFiles(table, family),
+      "Should have 3 more mob files per region from flushing.");
   }
 
   protected String description() {
@@ -298,12 +292,12 @@ public class TestMobCompactionWithDefaults {
       HTU.getMiniHBaseCluster().getRegionServer(sn).getRSMobFileCleanerChore().chore();
     }
 
-    assertEquals("After cleaning, we should have 1 MOB file per region based on size.", numRegions,
-      getNumberOfMobFiles(table, family));
+    assertEquals(numRegions, getNumberOfMobFiles(table, family),
+      "After cleaning, we should have 1 MOB file per region based on size.");
 
     LOG.debug("checking count of rows");
     long scanned = scanTable(table);
-    assertEquals("Got the wrong number of rows in table " + table + " cf " + family, rows, scanned);
+    assertEquals(rows, scanned, "Got the wrong number of rows in table " + table + " cf " + family);
 
   }
 
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobCompactionWithException.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobCompactionWithException.java
index 7aaedf170ac..1dae5a7c893 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobCompactionWithException.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobCompactionWithException.java
@@ -19,9 +19,9 @@ package org.apache.hadoop.hbase.mob;
 
 import static org.apache.hadoop.hbase.HBaseTestingUtility.START_KEY;
 import static org.apache.hadoop.hbase.HBaseTestingUtility.fam1;
-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.List;
@@ -31,7 +31,6 @@ import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hbase.Cell;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;
@@ -60,27 +59,21 @@ import org.apache.hadoop.hbase.regionserver.throttle.ThroughputController;
 import org.apache.hadoop.hbase.security.User;
 import org.apache.hadoop.hbase.testclassification.MediumTests;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.junit.After;
-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.AfterEach;
+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.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@Category(MediumTests.class)
+@Tag(MediumTests.TAG)
 public class TestMobCompactionWithException {
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestMobCompactionWithException.class);
-
-  @Rule
-  public TestName name = new TestName();
   static final Logger LOG = LoggerFactory.getLogger(TestMobCompactionWithException.class.getName());
   private final static HBaseTestingUtility HTU = new HBaseTestingUtility();
   private static Configuration conf = null;
+  private String testMethodName;
 
   private HRegion region = null;
   private TableDescriptor tableDescriptor;
@@ -93,7 +86,7 @@ public class TestMobCompactionWithException {
   private static int rowCount = 100;
   private Table table;
 
-  @BeforeClass
+  @BeforeAll
   public static void setUp() throws Exception {
     conf = HTU.getConfiguration();
     conf.set(MobConstants.MOB_COMPACTION_TYPE_KEY, MobConstants.OPTIMIZED_MOB_COMPACTION_TYPE);
@@ -101,7 +94,12 @@ public class TestMobCompactionWithException {
 
   }
 
-  @After
+  @BeforeEach
+  public void setUp(TestInfo testInfo) {
+    testMethodName = testInfo.getTestMethod().get().getName();
+  }
+
+  @AfterEach
   public void tearDown() throws Exception {
     region.close();
     this.table.close();
@@ -113,9 +111,9 @@ public class TestMobCompactionWithException {
     this.columnFamilyDescriptor =
       ColumnFamilyDescriptorBuilder.newBuilder(COLUMN_FAMILY).setMobEnabled(true)
         .setMobThreshold(mobThreshold).setMaxVersions(1).setBlocksize(500).build();
-    this.tableDescriptor =
-      TableDescriptorBuilder.newBuilder(TableName.valueOf(TestMobUtils.getTableName(name)))
-        .setColumnFamily(columnFamilyDescriptor).build();
+    this.tableDescriptor = TableDescriptorBuilder
+      .newBuilder(TableName.valueOf(TestMobUtils.getTableName(testMethodName)))
+      .setColumnFamily(columnFamilyDescriptor).build();
     RegionInfo regionInfo = RegionInfoBuilder.newBuilder(tableDescriptor.getTableName()).build();
     region = HBaseTestingUtility.createRegionAndWAL(regionInfo, HTU.getDataTestDir(), conf,
       tableDescriptor, new MobFileCache(conf));
@@ -168,8 +166,8 @@ public class TestMobCompactionWithException {
 
     // When compaction is failed,the count of StoreFile and MobStoreFile should be the same as
     // before compaction.
-    assertEquals("After compaction: store files", storeFileCountBeforeCompact, countStoreFiles());
-    assertEquals("After compaction: mob file count", mobFileCountBeforeCompact, countMobFiles());
+    assertEquals(storeFileCountBeforeCompact, countStoreFiles(), "After compaction: store files");
+    assertEquals(mobFileCountBeforeCompact, countMobFiles(), "After compaction: mob file count");
   }
 
   private int countStoreFiles() throws IOException {
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobDataBlockEncoding.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobDataBlockEncoding.java
index d2e761e4fd5..9b48f6eac92 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobDataBlockEncoding.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobDataBlockEncoding.java
@@ -17,7 +17,6 @@
  */
 package org.apache.hadoop.hbase.mob;
 
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.HColumnDescriptor;
 import org.apache.hadoop.hbase.HTableDescriptor;
@@ -31,19 +30,14 @@ import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;
 import org.apache.hadoop.hbase.testclassification.MediumTests;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
-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;
 
-@Category(MediumTests.class)
+@Tag(MediumTests.TAG)
 public class TestMobDataBlockEncoding {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestMobDataBlockEncoding.class);
-
   private final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
   private final static byte[] row1 = Bytes.toBytes("row1");
   private final static byte[] family = Bytes.toBytes("family");
@@ -56,12 +50,12 @@ public class TestMobDataBlockEncoding {
   private static HTableDescriptor desc;
   private static long defaultThreshold = 10;
 
-  @BeforeClass
+  @BeforeAll
   public static void setUpBeforeClass() throws Exception {
     TEST_UTIL.startMiniCluster(1);
   }
 
-  @AfterClass
+  @AfterAll
   public static void tearDownAfterClass() throws Exception {
     TEST_UTIL.shutdownMiniCluster();
   }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobFile.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobFile.java
index ac7645bf1d9..97e36c0ed8d 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobFile.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobFile.java
@@ -17,15 +17,14 @@
  */
 package org.apache.hadoop.hbase.mob;
 
-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.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hbase.Cell;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.KeyValue;
 import org.apache.hadoop.hbase.KeyValue.Type;
@@ -39,33 +38,25 @@ import org.apache.hadoop.hbase.regionserver.StoreFileScanner;
 import org.apache.hadoop.hbase.regionserver.StoreFileWriter;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.junit.ClassRule;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-import org.junit.rules.TestName;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInfo;
 
-@Category(SmallTests.class)
+@Tag(SmallTests.TAG)
 public class TestMobFile {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestMobFile.class);
-
   private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
   private Configuration conf = TEST_UTIL.getConfiguration();
   private CacheConfig cacheConf = new CacheConfig(conf);
-  @Rule
-  public TestName testName = new TestName();
 
   @Test
-  public void testReadKeyValue() throws Exception {
+  public void testReadKeyValue(TestInfo testInfo) throws Exception {
     Path testDir = TEST_UTIL.getDataTestDir();
     FileSystem fs = testDir.getFileSystem(conf);
     HFileContext meta = new HFileContextBuilder().withBlockSize(8 * 1024).build();
     StoreFileWriter writer = new StoreFileWriter.Builder(conf, cacheConf, fs).withOutputDir(testDir)
       .withFileContext(meta).build();
-    String caseName = testName.getMethodName();
+    String caseName = testInfo.getTestMethod().get().getName();
     MobTestUtil.writeStoreFile(writer, caseName);
 
     StoreFileInfo storeFileInfo =
@@ -110,13 +101,13 @@ public class TestMobFile {
   }
 
   @Test
-  public void testGetScanner() throws Exception {
+  public void testGetScanner(TestInfo testInfo) throws Exception {
     Path testDir = TEST_UTIL.getDataTestDir();
     FileSystem fs = testDir.getFileSystem(conf);
     HFileContext meta = new HFileContextBuilder().withBlockSize(8 * 1024).build();
     StoreFileWriter writer = new StoreFileWriter.Builder(conf, cacheConf, fs).withOutputDir(testDir)
       .withFileContext(meta).build();
-    MobTestUtil.writeStoreFile(writer, testName.getMethodName());
+    MobTestUtil.writeStoreFile(writer, testInfo.getTestMethod().get().getName());
 
     StoreFileInfo storeFileInfo =
       StoreFileInfo.createStoreFileInfoForHFile(conf, fs, writer.getPath(), true);
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobFileCache.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobFileCache.java
index 773203300a8..ced6ccdd3bf 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobFileCache.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobFileCache.java
@@ -17,15 +17,14 @@
  */
 package org.apache.hadoop.hbase.mob;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 
 import java.io.IOException;
 import java.util.Date;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.HColumnDescriptor;
 import org.apache.hadoop.hbase.HRegionInfo;
@@ -44,21 +43,16 @@ import org.apache.hadoop.hbase.regionserver.StoreFileWriter;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.Pair;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@Category(SmallTests.class)
+@Tag(SmallTests.TAG)
 public class TestMobFileCache {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestMobFileCache.class);
-
   static final Logger LOG = LoggerFactory.getLogger(TestMobFileCache.class);
   private HBaseTestingUtility UTIL;
   private HRegion region;
@@ -86,7 +80,7 @@ public class TestMobFileCache {
   private static final byte[] QF2 = Bytes.toBytes("qf2");
   private static final byte[] QF3 = Bytes.toBytes("qf3");
 
-  @Before
+  @BeforeEach
   public void setUp() throws Exception {
     UTIL = HBaseTestingUtility.createLocalHTU();
     conf = UTIL.getConfiguration();
@@ -110,7 +104,7 @@ public class TestMobFileCache {
       mobFileCache);
   }
 
-  @After
+  @AfterEach
   public void tearDown() throws Exception {
     region.close();
     region.getFilesystem().delete(UTIL.getDataTestDir(), true);
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobFileCleanupUtil.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobFileCleanupUtil.java
index 6c9b869a9dd..c91f82a72e8 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobFileCleanupUtil.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobFileCleanupUtil.java
@@ -17,9 +17,9 @@
  */
 package org.apache.hadoop.hbase.mob;
 
-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.Arrays;
@@ -27,7 +27,6 @@ import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.HColumnDescriptor;
 import org.apache.hadoop.hbase.HTableDescriptor;
@@ -43,11 +42,10 @@ import org.apache.hadoop.hbase.client.Table;
 import org.apache.hadoop.hbase.master.cleaner.TimeToLiveHFileCleaner;
 import org.apache.hadoop.hbase.testclassification.MediumTests;
 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.jupiter.api.AfterEach;
+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;
 
@@ -58,12 +56,9 @@ import org.slf4j.LoggerFactory;
  * cleaner chore 7 Verifies that number of MOB files in a mob directory is 1.
  */
 @SuppressWarnings("deprecation")
-@Category(MediumTests.class)
+@Tag(MediumTests.TAG)
 public class TestMobFileCleanupUtil {
   private static final Logger LOG = LoggerFactory.getLogger(TestMobFileCleanupUtil.class);
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestMobFileCleanupUtil.class);
 
   private HBaseTestingUtility HTU;
 
@@ -84,7 +79,7 @@ public class TestMobFileCleanupUtil {
   public TestMobFileCleanupUtil() {
   }
 
-  @Before
+  @BeforeEach
   public void setUp() throws Exception {
     HTU = new HBaseTestingUtility();
     hdt = HTU.createTableDescriptor("testMobCompactTable");
@@ -139,7 +134,7 @@ public class TestMobFileCleanupUtil {
     }
   }
 
-  @After
+  @AfterEach
   public void tearDown() throws Exception {
     admin.disableTable(hdt.getTableName());
     admin.deleteTable(hdt.getTableName());
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobFileLink.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobFileLink.java
index 613fa59b635..50ec7d7cc54 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobFileLink.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobFileLink.java
@@ -17,37 +17,28 @@
  */
 package org.apache.hadoop.hbase.mob;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
 import java.io.IOException;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.io.HFileLink;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.CommonFSUtils;
 import org.apache.hadoop.hbase.util.HFileArchiveUtil;
-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(SmallTests.class)
+@Tag(SmallTests.TAG)
 public class TestMobFileLink {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestMobFileLink.class);
-
-  @Rule
-  public TestName name = new TestName();
-
   @Test
-  public void testMobFilePath() throws IOException {
-    final TableName tableName = TableName.valueOf(name.getMethodName());
+  public void testMobFilePath(TestInfo testInfo) throws IOException {
+    final TableName tableName = TableName.valueOf(testInfo.getTestMethod().get().getName());
     Configuration conf = HBaseConfiguration.create();
     FileSystem fs = FileSystem.get(conf);
     Path rootDir = CommonFSUtils.getRootDir(conf);
@@ -69,8 +60,8 @@ public class TestMobFileLink {
     String hfileLinkName = tableName.getNameAsString() + "=" + encodedRegionName + "-" + fileName;
     Path hfileLinkPath = new Path(columnFamily, hfileLinkName);
     HFileLink hfileLink = HFileLink.buildFromHFileLinkPattern(conf, hfileLinkPath);
-    Assert.assertEquals(expectedMobFilePath, hfileLink.getMobPath());
-    Assert.assertEquals(expectedOriginPath, hfileLink.getOriginPath());
-    Assert.assertEquals(expectedArchivePath, hfileLink.getArchivePath());
+    assertEquals(expectedMobFilePath, hfileLink.getMobPath());
+    assertEquals(expectedOriginPath, hfileLink.getOriginPath());
+    assertEquals(expectedArchivePath, hfileLink.getArchivePath());
   }
 }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobFileName.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobFileName.java
index fecb724bced..05474ecee94 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobFileName.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobFileName.java
@@ -17,37 +17,31 @@
  */
 package org.apache.hadoop.hbase.mob;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotSame;
-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.assertNotSame;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.util.Date;
 import java.util.concurrent.ThreadLocalRandom;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.MD5Hash;
-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 TestMobFileName {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestMobFileName.class);
-
   private String uuid;
   private Date date;
   private String dateStr;
   private byte[] startKey;
   private String regionName = "region";
 
-  @Before
+  @BeforeEach
   public void setUp() {
     uuid = HBaseTestingUtility.getRandomUUID().toString().replaceAll("-", "");
     date = new Date();
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobStoreCompaction.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobStoreCompaction.java
index bdfb42a1497..ed3232f8993 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobStoreCompaction.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobStoreCompaction.java
@@ -21,25 +21,24 @@ import static org.apache.hadoop.hbase.HBaseTestingUtility.START_KEY;
 import static org.apache.hadoop.hbase.HBaseTestingUtility.fam1;
 import static org.apache.hadoop.hbase.regionserver.HStoreFile.BULKLOAD_TIME_KEY;
 import static org.apache.hadoop.hbase.regionserver.HStoreFile.MOB_CELLS_COUNT;
-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;
-import java.util.Arrays;
-import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
 import java.util.UUID;
+import java.util.stream.Stream;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hbase.Cell;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
+import org.apache.hadoop.hbase.HBaseParameterizedTestTemplate;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.HColumnDescriptor;
 import org.apache.hadoop.hbase.HConstants;
@@ -79,33 +78,26 @@ import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.CommonFSUtils;
 import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
 import org.apache.hadoop.hbase.util.Pair;
-import org.junit.After;
-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.runner.RunWith;
-import org.junit.runners.Parameterized;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.TestInfo;
+import org.junit.jupiter.api.TestTemplate;
+import org.junit.jupiter.params.provider.Arguments;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
  * Test mob store compaction
  */
-@RunWith(Parameterized.class)
-@Category(MediumTests.class)
+@Tag(MediumTests.TAG)
+@HBaseParameterizedTestTemplate(name = "{index}: useFileBasedSFT={0}")
 public class TestMobStoreCompaction {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestMobStoreCompaction.class);
-
-  @Rule
-  public TestName name = new TestName();
   static final Logger LOG = LoggerFactory.getLogger(TestMobStoreCompaction.class.getName());
   private final static HBaseTestingUtility UTIL = new HBaseTestingUtility();
   private Configuration conf = null;
+  private String testMethodName;
 
   private HRegion region = null;
   private HTableDescriptor htd = null;
@@ -124,10 +116,14 @@ public class TestMobStoreCompaction {
     this.useFileBasedSFT = useFileBasedSFT;
   }
 
-  @Parameterized.Parameters
-  public static Collection<Boolean> data() {
-    Boolean[] data = { false, true };
-    return Arrays.asList(data);
+  public static Stream<Arguments> parameters() {
+    return Stream.of(false, true).map(Arguments::of);
+  }
+
+  @BeforeEach
+  public void setUp(TestInfo testInfo) {
+    testMethodName = testInfo.getTestMethod().get().getName()
+      + testInfo.getDisplayName().replaceAll("[:= ]", "_").replaceAll("_+", "_").trim();
   }
 
   private void init(Configuration conf, long mobThreshold) throws Exception {
@@ -141,7 +137,7 @@ public class TestMobStoreCompaction {
     HBaseTestingUtility UTIL = new HBaseTestingUtility(conf);
 
     compactionThreshold = conf.getInt("hbase.hstore.compactionThreshold", 3);
-    htd = UTIL.createTableDescriptor(TestMobUtils.getTableName(name));
+    htd = UTIL.createTableDescriptor(TestMobUtils.getTableName(testMethodName));
     hcd = new HColumnDescriptor(COLUMN_FAMILY);
     hcd.setMobEnabled(true);
     hcd.setMobThreshold(mobThreshold);
@@ -154,7 +150,7 @@ public class TestMobStoreCompaction {
     fs = FileSystem.get(conf);
   }
 
-  @After
+  @AfterEach
   public void tearDown() throws Exception {
     region.close();
     fs.delete(UTIL.getDataTestDir(), true);
@@ -163,7 +159,7 @@ public class TestMobStoreCompaction {
   /**
    * During compaction, cells smaller than the threshold won't be affected.
    */
-  @Test
+  @TestTemplate
   public void testSmallerValue() throws Exception {
     init(UTIL.getConfiguration(), 500);
     byte[] dummyData = makeDummyData(300); // smaller than mob threshold
@@ -174,24 +170,24 @@ public class TestMobStoreCompaction {
       loader.put(p);
       region.flush(true);
     }
-    assertEquals("Before compaction: store files", compactionThreshold, countStoreFiles());
-    assertEquals("Before compaction: mob file count", 0, countMobFiles());
-    assertEquals("Before compaction: rows", compactionThreshold, UTIL.countRows(region));
-    assertEquals("Before compaction: mob rows", 0, countMobRows());
+    assertEquals(compactionThreshold, countStoreFiles(), "Before compaction: store files");
+    assertEquals(0, countMobFiles(), "Before compaction: mob file count");
+    assertEquals(compactionThreshold, UTIL.countRows(region), "Before compaction: rows");
+    assertEquals(0, countMobRows(), "Before compaction: mob rows");
 
     region.compactStores();
 
-    assertEquals("After compaction: store files", 1, countStoreFiles());
-    assertEquals("After compaction: mob file count", 0, countMobFiles());
-    assertEquals("After compaction: referenced mob file count", 0, countReferencedMobFiles());
-    assertEquals("After compaction: rows", compactionThreshold, UTIL.countRows(region));
-    assertEquals("After compaction: mob rows", 0, countMobRows());
+    assertEquals(1, countStoreFiles(), "After compaction: store files");
+    assertEquals(0, countMobFiles(), "After compaction: mob file count");
+    assertEquals(0, countReferencedMobFiles(), "After compaction: referenced mob file count");
+    assertEquals(compactionThreshold, UTIL.countRows(region), "After compaction: rows");
+    assertEquals(0, countMobRows(), "After compaction: mob rows");
   }
 
   /**
    * During compaction, the mob threshold size is changed.
    */
-  @Test
+  @TestTemplate
   public void testLargerValue() throws Exception {
     init(UTIL.getConfiguration(), 200);
     byte[] dummyData = makeDummyData(300); // larger than mob threshold
@@ -201,12 +197,12 @@ public class TestMobStoreCompaction {
       loader.put(p);
       region.flush(true);
     }
-    assertEquals("Before compaction: store files", compactionThreshold, countStoreFiles());
-    assertEquals("Before compaction: mob file count", compactionThreshold, countMobFiles());
-    assertEquals("Before compaction: rows", compactionThreshold, UTIL.countRows(region));
-    assertEquals("Before compaction: mob rows", compactionThreshold, countMobRows());
-    assertEquals("Before compaction: number of mob cells", compactionThreshold,
-      countMobCellsInMetadata());
+    assertEquals(compactionThreshold, countStoreFiles(), "Before compaction: store files");
+    assertEquals(compactionThreshold, countMobFiles(), "Before compaction: mob file count");
+    assertEquals(compactionThreshold, UTIL.countRows(region), "Before compaction: rows");
+    assertEquals(compactionThreshold, countMobRows(), "Before compaction: mob rows");
+    assertEquals(compactionThreshold, countMobCellsInMetadata(),
+      "Before compaction: number of mob cells");
     // Change the threshold larger than the data size
     setMobThreshold(region, COLUMN_FAMILY, 500);
     region.initialize();
@@ -223,11 +219,11 @@ public class TestMobStoreCompaction {
       region.compact(context.get(), store, NoLimitThroughputController.INSTANCE, User.getCurrent());
     }
 
-    assertEquals("After compaction: store files", 1, countStoreFiles());
-    assertEquals("After compaction: mob file count", compactionThreshold, countMobFiles());
-    assertEquals("After compaction: referenced mob file count", 0, countReferencedMobFiles());
-    assertEquals("After compaction: rows", compactionThreshold, UTIL.countRows(region));
-    assertEquals("After compaction: mob rows", 0, countMobRows());
+    assertEquals(1, countStoreFiles(), "After compaction: store files");
+    assertEquals(compactionThreshold, countMobFiles(), "After compaction: mob file count");
+    assertEquals(0, countReferencedMobFiles(), "After compaction: referenced mob file count");
+    assertEquals(compactionThreshold, UTIL.countRows(region), "After compaction: rows");
+    assertEquals(0, countMobRows(), "After compaction: mob rows");
   }
 
   private static HRegion setMobThreshold(HRegion region, byte[] cfName, long modThreshold) {
@@ -244,7 +240,7 @@ public class TestMobStoreCompaction {
    * This test will first generate store files, then bulk load them and trigger the compaction. When
    * compaction, the cell value will be larger than the threshold.
    */
-  @Test
+  @TestTemplate
   public void testMobCompactionWithBulkload() throws Exception {
     // The following will produce store files of 600.
     init(UTIL.getConfiguration(), 300);
@@ -262,25 +258,25 @@ public class TestMobStoreCompaction {
     // The following will bulk load the above generated store files and compact, with 600(fileSize)
     // > 300(threshold)
     Map<byte[], List<Path>> map = region.bulkLoadHFiles(hfiles, true, null);
-    assertTrue("Bulkload result:", !map.isEmpty());
-    assertEquals("Before compaction: store files", compactionThreshold, countStoreFiles());
-    assertEquals("Before compaction: mob file count", 0, countMobFiles());
-    assertEquals("Before compaction: rows", compactionThreshold, UTIL.countRows(region));
-    assertEquals("Before compaction: mob rows", 0, countMobRows());
-    assertEquals("Before compaction: referenced mob file count", 0, countReferencedMobFiles());
+    assertTrue(!map.isEmpty(), "Bulkload result:");
+    assertEquals(compactionThreshold, countStoreFiles(), "Before compaction: store files");
+    assertEquals(0, countMobFiles(), "Before compaction: mob file count");
+    assertEquals(compactionThreshold, UTIL.countRows(region), "Before compaction: rows");
+    assertEquals(0, countMobRows(), "Before compaction: mob rows");
+    assertEquals(0, countReferencedMobFiles(), "Before compaction: referenced mob file count");
 
     region.compactStores();
 
-    assertEquals("After compaction: store files", 1, countStoreFiles());
-    assertEquals("After compaction: mob file count:", 1, countMobFiles());
-    assertEquals("After compaction: rows", compactionThreshold, UTIL.countRows(region));
-    assertEquals("After compaction: mob rows", compactionThreshold, countMobRows());
-    assertEquals("After compaction: referenced mob file count", 1, countReferencedMobFiles());
-    assertEquals("After compaction: number of mob cells", compactionThreshold,
-      countMobCellsInMetadata());
+    assertEquals(1, countStoreFiles(), "After compaction: store files");
+    assertEquals(1, countMobFiles(), "After compaction: mob file count:");
+    assertEquals(compactionThreshold, UTIL.countRows(region), "After compaction: rows");
+    assertEquals(compactionThreshold, countMobRows(), "After compaction: mob rows");
+    assertEquals(1, countReferencedMobFiles(), "After compaction: referenced mob file count");
+    assertEquals(compactionThreshold, countMobCellsInMetadata(),
+      "After compaction: number of mob cells");
   }
 
-  @Test
+  @TestTemplate
   public void testMajorCompactionAfterDelete() throws Exception {
     init(UTIL.getConfiguration(), 100);
     byte[] dummyData = makeDummyData(200); // larger than mob threshold
@@ -293,22 +289,22 @@ public class TestMobStoreCompaction {
       loader.put(p);
       region.flush(true);
     }
-    assertEquals("Before compaction: store files", numHfiles, countStoreFiles());
-    assertEquals("Before compaction: mob file count", numHfiles, countMobFiles());
-    assertEquals("Before compaction: rows", numHfiles, UTIL.countRows(region));
-    assertEquals("Before compaction: mob rows", numHfiles, countMobRows());
-    assertEquals("Before compaction: number of mob cells", numHfiles, countMobCellsInMetadata());
+    assertEquals(numHfiles, countStoreFiles(), "Before compaction: store files");
+    assertEquals(numHfiles, countMobFiles(), "Before compaction: mob file count");
+    assertEquals(numHfiles, UTIL.countRows(region), "Before compaction: rows");
+    assertEquals(numHfiles, countMobRows(), "Before compaction: mob rows");
+    assertEquals(numHfiles, countMobCellsInMetadata(), "Before compaction: number of mob cells");
     // now let's delete some cells that contain mobs
     Delete delete = new Delete(deleteRow);
     delete.addFamily(COLUMN_FAMILY);
     region.delete(delete);
     region.flush(true);
 
-    assertEquals("Before compaction: store files", numHfiles + 1, countStoreFiles());
-    assertEquals("Before compaction: mob files", numHfiles, countMobFiles());
+    assertEquals(numHfiles + 1, countStoreFiles(), "Before compaction: store files");
+    assertEquals(numHfiles, countMobFiles(), "Before compaction: mob files");
     // region.compactStores();
     region.compact(true);
-    assertEquals("After compaction: store files", 1, countStoreFiles());
+    assertEquals(1, countStoreFiles(), "After compaction: store files");
   }
 
   private int countStoreFiles() throws IOException {
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobStoreScanner.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobStoreScanner.java
index a5f4191df8d..311d5edea29 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobStoreScanner.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobStoreScanner.java
@@ -17,6 +17,12 @@
  */
 package org.apache.hadoop.hbase.mob;
 
+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 java.io.IOException;
 import java.util.List;
 import org.apache.hadoop.conf.Configuration;
@@ -25,7 +31,6 @@ import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hbase.Cell;
 import org.apache.hadoop.hbase.CellUtil;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.HColumnDescriptor;
 import org.apache.hadoop.hbase.HTableDescriptor;
@@ -48,22 +53,16 @@ import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.CommonFSUtils;
 import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
 import org.apache.hadoop.hbase.util.HFileArchiveUtil;
-import org.junit.AfterClass;
-import org.junit.Assert;
-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;
-
-@Category(MediumTests.class)
+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;
+
+@Tag(MediumTests.TAG)
 public class TestMobStoreScanner {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestMobStoreScanner.class);
-
   private final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
   private final static byte[] row1 = Bytes.toBytes("row1");
   private final static byte[] row2 = Bytes.toBytes("row2");
@@ -78,11 +77,9 @@ public class TestMobStoreScanner {
   private static long defaultThreshold = 10;
   private FileSystem fs;
   private Configuration conf;
+  private String testMethodName;
 
-  @Rule
-  public TestName name = new TestName();
-
-  @BeforeClass
+  @BeforeAll
   public static void setUpBeforeClass() throws Exception {
     TEST_UTIL.getConfiguration().setInt(ConnectionConfiguration.MAX_KEYVALUE_SIZE_KEY,
       100 * 1024 * 1024);
@@ -90,11 +87,16 @@ public class TestMobStoreScanner {
     TEST_UTIL.startMiniCluster(1);
   }
 
-  @AfterClass
+  @AfterAll
   public static void tearDownAfterClass() throws Exception {
     TEST_UTIL.shutdownMiniCluster();
   }
 
+  @BeforeEach
+  public void setUpTest(TestInfo testInfo) {
+    testMethodName = testInfo.getTestMethod().get().getName();
+  }
+
   public void setUp(long threshold, TableName tn) throws Exception {
     conf = TEST_UTIL.getConfiguration();
     fs = FileSystem.get(conf);
@@ -153,7 +155,7 @@ public class TestMobStoreScanner {
 
   @Test
   public void testGetMassive() throws Exception {
-    setUp(defaultThreshold, TableName.valueOf(name.getMethodName()));
+    setUp(defaultThreshold, TableName.valueOf(testMethodName));
 
     // Put some data 5 10, 15, 20 mb ok (this would be right below protobuf
     // default max size of 64MB.
@@ -180,7 +182,7 @@ public class TestMobStoreScanner {
 
   @Test
   public void testReadPt() throws Exception {
-    final TableName tableName = TableName.valueOf(name.getMethodName());
+    final TableName tableName = TableName.valueOf(testMethodName);
     setUp(0L, tableName);
     long ts = EnvironmentEdgeManager.currentTime();
     byte[] value1 = Bytes.toBytes("value1");
@@ -206,29 +208,29 @@ public class TestMobStoreScanner {
     table.put(put4);
 
     Cell cell = result.getColumnLatestCell(family, qf1);
-    Assert.assertArrayEquals(value1, CellUtil.cloneValue(cell));
+    assertArrayEquals(value1, CellUtil.cloneValue(cell));
 
     admin.flush(tableName);
     result = rs.next();
     cell = result.getColumnLatestCell(family, qf1);
-    Assert.assertArrayEquals(value2, CellUtil.cloneValue(cell));
+    assertArrayEquals(value2, CellUtil.cloneValue(cell));
   }
 
   @Test
   public void testReadFromCorruptMobFilesWithReadEmptyValueOnMobCellMiss() throws Exception {
-    final TableName tableName = TableName.valueOf(name.getMethodName());
+    final TableName tableName = TableName.valueOf(testMethodName);
     setUp(0, tableName);
     createRecordAndCorruptMobFile(tableName, row1, family, qf1, Bytes.toBytes("value1"));
     Get get = new Get(row1);
     get.setAttribute(MobConstants.EMPTY_VALUE_ON_MOBCELL_MISS, Bytes.toBytes(true));
     Result result = table.get(get);
     Cell cell = result.getColumnLatestCell(family, qf1);
-    Assert.assertEquals(0, cell.getValueLength());
+    assertEquals(0, cell.getValueLength());
   }
 
   @Test
   public void testReadFromCorruptMobFiles() throws Exception {
-    final TableName tableName = TableName.valueOf(name.getMethodName());
+    final TableName tableName = TableName.valueOf(testMethodName);
     setUp(0, tableName);
     createRecordAndCorruptMobFile(tableName, row1, family, qf1, Bytes.toBytes("value1"));
     Get get = new Get(row1);
@@ -238,8 +240,8 @@ public class TestMobStoreScanner {
     } catch (IOException e) {
       ioe = e;
     }
-    Assert.assertNotNull(ioe);
-    Assert.assertEquals(CorruptHFileException.class.getName(), ioe.getClass().getName());
+    assertNotNull(ioe);
+    assertEquals(CorruptHFileException.class.getName(), ioe.getClass().getName());
   }
 
   private void createRecordAndCorruptMobFile(TableName tn, byte[] row, byte[] family, byte[] qf,
@@ -249,7 +251,7 @@ public class TestMobStoreScanner {
     table.put(put1);
     admin.flush(tn);
     Path mobFile = getFlushedMobFile(conf, fs, tn, Bytes.toString(family));
-    Assert.assertNotNull(mobFile);
+    assertNotNull(mobFile);
     // create new corrupt mob file.
     Path corruptFile = new Path(mobFile.getParent(), "dummy");
     TestHFile.truncateFile(fs, mobFile, corruptFile);
@@ -308,7 +310,6 @@ public class TestMobStoreScanner {
     long ts2 = ts1 + 1;
     long ts3 = ts1 + 2;
     byte[] value = generateMobValue((int) defaultThreshold + 1);
-    ;
 
     Put put1 = new Put(row1);
     put1.addColumn(family, qf1, ts3, value);
@@ -332,7 +333,7 @@ public class TestMobStoreScanner {
       }
     }
     results.close();
-    Assert.assertEquals(3, count);
+    assertEquals(3, count);
   }
 
   private void testMobThreshold(boolean reversed) throws Exception {
@@ -378,7 +379,7 @@ public class TestMobStoreScanner {
         count++;
       }
     }
-    Assert.assertEquals(3, count);
+    assertEquals(3, count);
     assertNotMobReference(cellLess, row1, family, valueLess);
     assertNotMobReference(cellEqual, row1, family, valueEqual);
     assertIsMobReference(cellGreater, row1, family, valueGreater, tn);
@@ -392,7 +393,6 @@ public class TestMobStoreScanner {
     long ts2 = ts1 + 1;
     long ts3 = ts1 + 2;
     byte[] value = generateMobValue((int) defaultThreshold + 1);
-    ;
     // Put some data
     Put put1 = new Put(row1);
     put1.addColumn(family, qf1, ts3, value);
@@ -429,9 +429,9 @@ public class TestMobStoreScanner {
 
     // Verify the moving success
     FileStatus[] files1 = fs.listStatus(mobFamilyPath);
-    Assert.assertEquals(0, files1.length);
+    assertEquals(0, files1.length);
     FileStatus[] files2 = fs.listStatus(storeArchiveDir);
-    Assert.assertEquals(fileCount, files2.length);
+    assertEquals(fileCount, files2.length);
 
     // Scan from archive
     Scan scan = new Scan();
@@ -444,9 +444,9 @@ public class TestMobStoreScanner {
    */
   private static void assertNotMobReference(Cell cell, byte[] row, byte[] family, byte[] value)
     throws IOException {
-    Assert.assertArrayEquals(row, CellUtil.cloneRow(cell));
-    Assert.assertArrayEquals(family, CellUtil.cloneFamily(cell));
-    Assert.assertArrayEquals(value, CellUtil.cloneValue(cell));
+    assertArrayEquals(row, CellUtil.cloneRow(cell));
+    assertArrayEquals(family, CellUtil.cloneFamily(cell));
+    assertArrayEquals(value, CellUtil.cloneValue(cell));
   }
 
   /**
@@ -454,17 +454,17 @@ public class TestMobStoreScanner {
    */
   private static void assertIsMobReference(Cell cell, byte[] row, byte[] family, byte[] value,
     TableName tn) throws IOException {
-    Assert.assertArrayEquals(row, CellUtil.cloneRow(cell));
-    Assert.assertArrayEquals(family, CellUtil.cloneFamily(cell));
-    Assert.assertFalse(Bytes.equals(value, CellUtil.cloneValue(cell)));
+    assertArrayEquals(row, CellUtil.cloneRow(cell));
+    assertArrayEquals(family, CellUtil.cloneFamily(cell));
+    assertFalse(Bytes.equals(value, CellUtil.cloneValue(cell)));
     byte[] referenceValue = CellUtil.cloneValue(cell);
     String fileName = MobUtils.getMobFileName(cell);
     int valLen = Bytes.toInt(referenceValue, 0, Bytes.SIZEOF_INT);
-    Assert.assertEquals(value.length, valLen);
+    assertEquals(value.length, valLen);
     Path mobFamilyPath =
       MobUtils.getMobFamilyPath(TEST_UTIL.getConfiguration(), tn, hcd.getNameAsString());
     Path targetPath = new Path(mobFamilyPath, fileName);
     FileSystem fs = FileSystem.get(TEST_UTIL.getConfiguration());
-    Assert.assertTrue(fs.exists(targetPath));
+    assertTrue(fs.exists(targetPath));
   }
 }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobUtils.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobUtils.java
index 32170e98b35..709d8b7bbef 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobUtils.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobUtils.java
@@ -17,27 +17,20 @@
  */
 package org.apache.hadoop.hbase.mob;
 
-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.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.TableName;
 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.rules.TestName;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
 import org.apache.hbase.thirdparty.com.google.common.collect.ImmutableSet;
 import org.apache.hbase.thirdparty.com.google.common.collect.ImmutableSetMultimap;
 
-@Category(SmallTests.class)
+@Tag(SmallTests.TAG)
 public class TestMobUtils {
-
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestMobUtils.class);
   public static final TableName TEST_TABLE_1 = TableName.valueOf("testTable1");
   public static final TableName TEST_TABLE_2 = TableName.valueOf("testTable2");
   public static final TableName TEST_TABLE_3 = TableName.valueOf("testTable3");
@@ -91,7 +84,7 @@ public class TestMobUtils {
     assertTrue(testTable3Refs.contains("file3b"));
   }
 
-  public static String getTableName(TestName test) {
-    return test.getMethodName().replace("[", "-").replace("]", "");
+  public static String getTableName(String testMethodName) {
+    return testMethodName.replace("[", "-").replace("]", "");
   }
 }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobWithByteBuffAllocator.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobWithByteBuffAllocator.java
index 9d69d0eb90b..c0df659ad5f 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobWithByteBuffAllocator.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestMobWithByteBuffAllocator.java
@@ -17,10 +17,12 @@
  */
 package org.apache.hadoop.hbase.mob;
 
+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.Cell;
 import org.apache.hadoop.hbase.CellUtil;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.TableName;
@@ -34,25 +36,19 @@ import org.apache.hadoop.hbase.snapshot.MobSnapshotTestingUtils;
 import org.apache.hadoop.hbase.snapshot.SnapshotTestingUtils;
 import org.apache.hadoop.hbase.testclassification.MediumTests;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.junit.AfterClass;
-import org.junit.Assert;
-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;
 
 /**
  * Test the MOB feature when enable RPC ByteBuffAllocator (HBASE-22122)
  */
-@Category({ MediumTests.class })
+@Tag(MediumTests.TAG)
 public class TestMobWithByteBuffAllocator {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestMobWithByteBuffAllocator.class);
-
   private static final String TABLE_NAME = "TestMobWithByteBuffAllocator";
   private static final Logger LOG = LoggerFactory.getLogger(TestMobWithByteBuffAllocator.class);
 
@@ -60,7 +56,7 @@ public class TestMobWithByteBuffAllocator {
   private static final Configuration CONF = UTIL.getConfiguration();
   private static final byte[] FAMILY = Bytes.toBytes("f");
 
-  @BeforeClass
+  @BeforeAll
   public static void setUp() throws Exception {
     // Must use the ByteBuffAllocator here
     CONF.setBoolean(ByteBuffAllocator.ALLOCATOR_POOL_ENABLED_KEY, true);
@@ -73,7 +69,7 @@ public class TestMobWithByteBuffAllocator {
     UTIL.startMiniCluster();
   }
 
-  @AfterClass
+  @AfterAll
   public static void tearDown() throws Exception {
     UTIL.shutdownMiniCluster();
   }
@@ -104,12 +100,12 @@ public class TestMobWithByteBuffAllocator {
         while (res != null) {
           rows++;
           for (Cell cell : res.listCells()) {
-            Assert.assertTrue(CellUtil.cloneValue(cell).length > 0);
+            assertTrue(CellUtil.cloneValue(cell).length > 0);
           }
           res = scanner.next();
         }
       }
     }
-    Assert.assertEquals(expectedRows, rows);
+    assertEquals(expectedRows, rows);
   }
 }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestRSMobFileCleanerChore.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestRSMobFileCleanerChore.java
index d9470420e99..10ef902c7bb 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestRSMobFileCleanerChore.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/TestRSMobFileCleanerChore.java
@@ -17,9 +17,9 @@
  */
 package org.apache.hadoop.hbase.mob;
 
-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.util.Arrays;
@@ -31,7 +31,6 @@ import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.ServerName;
 import org.apache.hadoop.hbase.TableName;
@@ -52,11 +51,10 @@ import org.apache.hadoop.hbase.regionserver.HStore;
 import org.apache.hadoop.hbase.regionserver.HStoreFile;
 import org.apache.hadoop.hbase.testclassification.MediumTests;
 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.jupiter.api.AfterEach;
+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;
 
@@ -66,12 +64,9 @@ import org.slf4j.LoggerFactory;
  * a period of time larger than minimum age to archive 6. Runs Mob cleaner chore 7 Verifies that
  * every old MOB file referenced from current RS was archived
  */
-@Category(MediumTests.class)
+@Tag(MediumTests.TAG)
 public class TestRSMobFileCleanerChore {
   private static final Logger LOG = LoggerFactory.getLogger(TestRSMobFileCleanerChore.class);
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestRSMobFileCleanerChore.class);
 
   private HBaseTestingUtility HTU;
 
@@ -93,7 +88,7 @@ public class TestRSMobFileCleanerChore {
   public TestRSMobFileCleanerChore() {
   }
 
-  @Before
+  @BeforeEach
   public void setUp() throws Exception {
     HTU = new HBaseTestingUtility();
     conf = HTU.getConfiguration();
@@ -146,7 +141,7 @@ public class TestRSMobFileCleanerChore {
     }
   }
 
-  @After
+  @AfterEach
   public void tearDown() throws Exception {
     admin.disableTable(tableDescriptor.getTableName());
     admin.deleteTable(tableDescriptor.getTableName());
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.java
index 21e8d821d0a..9bef915abea 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.java
@@ -17,12 +17,13 @@
  */
 package org.apache.hadoop.hbase.namespace;
 
-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.io.IOException;
 import java.util.Collections;
@@ -37,7 +38,6 @@ import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hbase.Coprocessor;
 import org.apache.hadoop.hbase.CoprocessorEnvironment;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.HColumnDescriptor;
 import org.apache.hadoop.hbase.HConstants;
@@ -82,28 +82,23 @@ import org.apache.hadoop.hbase.testclassification.LargeTests;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.CommonFSUtils;
 import org.apache.zookeeper.KeeperException;
-import org.junit.After;
-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.AfterEach;
+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;
 
-@Category(LargeTests.class)
+@Tag(LargeTests.TAG)
 public class TestNamespaceAuditor {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestNamespaceAuditor.class);
-
   private static final Logger LOG = LoggerFactory.getLogger(TestNamespaceAuditor.class);
   private static final HBaseTestingUtility UTIL = new HBaseTestingUtility();
   private static Admin ADMIN;
   private String prefix = "TestNamespaceAuditor";
 
-  @BeforeClass
+  @BeforeAll
   public static void before() throws Exception {
     Configuration conf = UTIL.getConfiguration();
     conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, CustomObserver.class.getName());
@@ -119,12 +114,12 @@ public class TestNamespaceAuditor {
     ADMIN = UTIL.getAdmin();
   }
 
-  @AfterClass
+  @AfterAll
   public static void tearDown() throws Exception {
     UTIL.shutdownMiniCluster();
   }
 
-  @After
+  @AfterEach
   public void cleanup() throws Exception, KeeperException {
     for (HTableDescriptor table : ADMIN.listTables()) {
       ADMIN.disableTable(table.getTableName());
@@ -135,8 +130,8 @@ public class TestNamespaceAuditor {
         ADMIN.deleteNamespace(ns.getName());
       }
     }
-    assertTrue("Quota manager not initialized",
-      UTIL.getHBaseCluster().getMaster().getMasterQuotaManager().isQuotaInitialized());
+    assertTrue(UTIL.getHBaseCluster().getMaster().getMasterQuotaManager().isQuotaInitialized(),
+      "Quota manager not initialized");
   }
 
   @Test
@@ -146,7 +141,7 @@ public class TestNamespaceAuditor {
       NamespaceDescriptor.create(nsp).addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "5")
         .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();
     ADMIN.createNamespace(nspDesc);
-    assertNotNull("Namespace descriptor found null.", ADMIN.getNamespaceDescriptor(nsp));
+    assertNotNull(ADMIN.getNamespaceDescriptor(nsp), "Namespace descriptor found null.");
     assertEquals(3, ADMIN.listNamespaceDescriptors().length);
     HColumnDescriptor fam1 = new HColumnDescriptor("fam1");
 
@@ -167,8 +162,8 @@ public class TestNamespaceAuditor {
       assertTrue(exp instanceof IOException);
       constraintViolated = true;
     } finally {
-      assertTrue("Constraint not violated for table " + tableDescTwo.getTableName(),
-        constraintViolated);
+      assertTrue(constraintViolated,
+        "Constraint not violated for table " + tableDescTwo.getTableName());
     }
     ADMIN.createTable(tableDescTwo, Bytes.toBytes("AAA"), Bytes.toBytes("ZZZ"), 4);
     NamespaceTableAndRegionInfo nspState = getQuotaManager().getState(nsp);
@@ -182,8 +177,8 @@ public class TestNamespaceAuditor {
       assertTrue(exp instanceof IOException);
       constraintViolated = true;
     } finally {
-      assertTrue("Constraint not violated for table " + tableDescThree.getTableName(),
-        constraintViolated);
+      assertTrue(constraintViolated,
+        "Constraint not violated for table " + tableDescThree.getTableName());
     }
   }
 
@@ -249,9 +244,9 @@ public class TestNamespaceAuditor {
       .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "100")
       .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "3").build();
     ADMIN.createNamespace(nspDesc);
-    assertNotNull("Namespace descriptor found null.", ADMIN.getNamespaceDescriptor(namespace));
+    assertNotNull(ADMIN.getNamespaceDescriptor(namespace), "Namespace descriptor found null.");
     NamespaceTableAndRegionInfo stateInfo = getNamespaceState(nspDesc.getName());
-    assertNotNull("Namespace state found null for " + namespace, stateInfo);
+    assertNotNull(stateInfo, "Namespace state found null for " + namespace);
     HColumnDescriptor fam1 = new HColumnDescriptor("fam1");
     HTableDescriptor tableDescOne =
       new HTableDescriptor(TableName.valueOf(namespace + TableName.NAMESPACE_DELIM + "table1"));
@@ -262,21 +257,21 @@ public class TestNamespaceAuditor {
     ADMIN.createTable(tableDescOne);
     ADMIN.createTable(tableDescTwo, Bytes.toBytes("AAA"), Bytes.toBytes("ZZZ"), 5);
     stateInfo = getNamespaceState(nspDesc.getName());
-    assertNotNull("Namespace state found to be null.", stateInfo);
+    assertNotNull(stateInfo, "Namespace state found to be null.");
     assertEquals(2, stateInfo.getTables().size());
     assertEquals(5, stateInfo.getRegionCountOfTable(tableDescTwo.getTableName()));
     assertEquals(6, stateInfo.getRegionCount());
     ADMIN.disableTable(tableDescOne.getTableName());
     deleteTable(tableDescOne.getTableName());
     stateInfo = getNamespaceState(nspDesc.getName());
-    assertNotNull("Namespace state found to be null.", stateInfo);
+    assertNotNull(stateInfo, "Namespace state found to be null.");
     assertEquals(5, stateInfo.getRegionCount());
     assertEquals(1, stateInfo.getTables().size());
     ADMIN.disableTable(tableDescTwo.getTableName());
     deleteTable(tableDescTwo.getTableName());
     ADMIN.deleteNamespace(namespace);
     stateInfo = getNamespaceState(namespace);
-    assertNull("Namespace state not found to be null.", stateInfo);
+    assertNull(stateInfo, "Namespace state not found to be null.");
   }
 
   public static class CPRegionServerObserver
@@ -439,8 +434,8 @@ public class TestNamespaceAuditor {
       assertFalse(ADMIN.tableExists(tableOne));
 
       NamespaceTableAndRegionInfo nstate = getNamespaceState(nsp1);
-      assertEquals("First table creation failed in namespace so number of tables in namespace "
-        + "should be 0.", 0, nstate.getTables().size());
+      assertEquals(0, nstate.getTables().size(),
+        "First table creation failed in namespace so number of tables in namespace should be 0.");
 
       MasterSyncObserver.throwExceptionInPreCreateTableAction = false;
       try {
@@ -451,9 +446,8 @@ public class TestNamespaceAuditor {
       }
       assertTrue(ADMIN.tableExists(tableOne));
       nstate = getNamespaceState(nsp1);
-      assertEquals(
-        "First table was created successfully so table size in namespace should " + "be one now.",
-        1, nstate.getTables().size());
+      assertEquals(1, nstate.getTables().size(),
+        "First table was created successfully so table size in namespace should be one now.");
     } finally {
       MasterSyncObserver.throwExceptionInPreCreateTableAction = false;
       if (ADMIN.tableExists(tableOne)) {
@@ -522,8 +516,8 @@ public class TestNamespaceAuditor {
     NamespaceTableAndRegionInfo before = getNamespaceState(nsp1);
     killActiveMaster();
     NamespaceTableAndRegionInfo after = getNamespaceState(nsp1);
-    assertEquals("Expected: " + before.getTables() + " Found: " + after.getTables(),
-      before.getTables().size(), after.getTables().size());
+    assertEquals(before.getTables().size(), after.getTables().size(),
+      "Expected: " + before.getTables() + " Found: " + after.getTables());
   }
 
   public static void waitForQuotaInitialize(final HBaseTestingUtility util) throws Exception {
@@ -590,13 +584,13 @@ public class TestNamespaceAuditor {
     observer.tableDeletionLatch.await();
   }
 
-  @Test(expected = QuotaExceededException.class)
+  @Test
   public void testExceedTableQuotaInNamespace() throws Exception {
     String nsp = prefix + "_testExceedTableQuotaInNamespace";
     NamespaceDescriptor nspDesc = NamespaceDescriptor.create(nsp)
       .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "1").build();
     ADMIN.createNamespace(nspDesc);
-    assertNotNull("Namespace descriptor found null.", ADMIN.getNamespaceDescriptor(nsp));
+    assertNotNull(ADMIN.getNamespaceDescriptor(nsp), "Namespace descriptor found null.");
     assertEquals(3, ADMIN.listNamespaceDescriptors().length);
     HColumnDescriptor fam1 = new HColumnDescriptor("fam1");
     HTableDescriptor tableDescOne =
@@ -606,16 +600,18 @@ public class TestNamespaceAuditor {
       new HTableDescriptor(TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table2"));
     tableDescTwo.addFamily(fam1);
     ADMIN.createTable(tableDescOne);
-    ADMIN.createTable(tableDescTwo, Bytes.toBytes("AAA"), Bytes.toBytes("ZZZ"), 4);
+    assertThrows(QuotaExceededException.class, () -> {
+      ADMIN.createTable(tableDescTwo, Bytes.toBytes("AAA"), Bytes.toBytes("ZZZ"), 4);
+    });
   }
 
-  @Test(expected = QuotaExceededException.class)
+  @Test
   public void testCloneSnapshotQuotaExceed() throws Exception {
     String nsp = prefix + "_testTableQuotaExceedWithCloneSnapshot";
     NamespaceDescriptor nspDesc = NamespaceDescriptor.create(nsp)
       .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "1").build();
     ADMIN.createNamespace(nspDesc);
-    assertNotNull("Namespace descriptor found null.", ADMIN.getNamespaceDescriptor(nsp));
+    assertNotNull(ADMIN.getNamespaceDescriptor(nsp), "Namespace descriptor found null.");
     TableName tableName = TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table1");
     TableName cloneTableName = TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table2");
     HColumnDescriptor fam1 = new HColumnDescriptor("fam1");
@@ -624,7 +620,7 @@ public class TestNamespaceAuditor {
     ADMIN.createTable(tableDescOne);
     String snapshot = "snapshot_testTableQuotaExceedWithCloneSnapshot";
     ADMIN.snapshot(snapshot, tableName);
-    ADMIN.cloneSnapshot(snapshot, cloneTableName);
+    assertThrows(QuotaExceededException.class, () -> ADMIN.cloneSnapshot(snapshot, cloneTableName));
     ADMIN.deleteSnapshot(snapshot);
   }
 
@@ -635,7 +631,7 @@ public class TestNamespaceAuditor {
       NamespaceDescriptor.create(nsp).addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2")
         .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "20").build();
     ADMIN.createNamespace(nspDesc);
-    assertNotNull("Namespace descriptor found null.", ADMIN.getNamespaceDescriptor(nsp));
+    assertNotNull(ADMIN.getNamespaceDescriptor(nsp), "Namespace descriptor found null.");
     TableName tableName = TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table1");
     TableName cloneTableName = TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table2");
 
@@ -652,16 +648,16 @@ public class TestNamespaceAuditor {
     try (RegionLocator locator = ADMIN.getConnection().getRegionLocator(tableName)) {
       tableLength = locator.getStartKeys().length;
     }
-    assertEquals(tableName.getNameAsString() + " should have four regions.", 4, tableLength);
+    assertEquals(4, tableLength, tableName.getNameAsString() + " should have four regions.");
 
     try (RegionLocator locator = ADMIN.getConnection().getRegionLocator(cloneTableName)) {
       tableLength = locator.getStartKeys().length;
     }
-    assertEquals(cloneTableName.getNameAsString() + " should have four regions.", 4, tableLength);
+    assertEquals(4, tableLength, cloneTableName.getNameAsString() + " should have four regions.");
 
     NamespaceTableAndRegionInfo nstate = getNamespaceState(nsp);
-    assertEquals("Total tables count should be 2.", 2, nstate.getTables().size());
-    assertEquals("Total regions count should be.", 8, nstate.getRegionCount());
+    assertEquals(2, nstate.getTables().size(), "Total tables count should be 2.");
+    assertEquals(8, nstate.getRegionCount(), "Total regions count should be.");
 
     ADMIN.deleteSnapshot(snapshot);
   }
@@ -672,7 +668,7 @@ public class TestNamespaceAuditor {
     NamespaceDescriptor nspDesc = NamespaceDescriptor.create(nsp)
       .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "10").build();
     ADMIN.createNamespace(nspDesc);
-    assertNotNull("Namespace descriptor found null.", ADMIN.getNamespaceDescriptor(nsp));
+    assertNotNull(ADMIN.getNamespaceDescriptor(nsp), "Namespace descriptor found null.");
     TableName tableName1 = TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table1");
     HTableDescriptor tableDescOne = new HTableDescriptor(tableName1);
     HColumnDescriptor fam1 = new HColumnDescriptor("fam1");
@@ -680,7 +676,7 @@ public class TestNamespaceAuditor {
     ADMIN.createTable(tableDescOne, Bytes.toBytes("AAA"), Bytes.toBytes("ZZZ"), 4);
 
     NamespaceTableAndRegionInfo nstate = getNamespaceState(nsp);
-    assertEquals("Intial region count should be 4.", 4, nstate.getRegionCount());
+    assertEquals(4, nstate.getRegionCount(), "Intial region count should be 4.");
 
     String snapshot = "snapshot_testRestoreSnapshot";
     ADMIN.snapshot(snapshot, tableName1);
@@ -690,12 +686,12 @@ public class TestNamespaceAuditor {
 
     ADMIN.split(tableName1, Bytes.toBytes("JJJ"));
     Thread.sleep(2000);
-    assertEquals("Total regions count should be 5.", 5, nstate.getRegionCount());
+    assertEquals(5, nstate.getRegionCount(), "Total regions count should be 5.");
 
     ADMIN.disableTable(tableName1);
     ADMIN.restoreSnapshot(snapshot);
 
-    assertEquals("Total regions count should be 4 after restore.", 4, nstate.getRegionCount());
+    assertEquals(4, nstate.getRegionCount(), "Total regions count should be 4 after restore.");
 
     ADMIN.enableTable(tableName1);
     ADMIN.deleteSnapshot(snapshot);
@@ -708,7 +704,7 @@ public class TestNamespaceAuditor {
       .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "10").build();
     ADMIN.createNamespace(nspDesc);
     NamespaceDescriptor ndesc = ADMIN.getNamespaceDescriptor(nsp);
-    assertNotNull("Namespace descriptor found null.", ndesc);
+    assertNotNull(ndesc, "Namespace descriptor found null.");
     TableName tableName1 = TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table1");
     HTableDescriptor tableDescOne = new HTableDescriptor(tableName1);
     HColumnDescriptor fam1 = new HColumnDescriptor("fam1");
@@ -717,7 +713,7 @@ public class TestNamespaceAuditor {
     ADMIN.createTable(tableDescOne, Bytes.toBytes("AAA"), Bytes.toBytes("ZZZ"), 4);
 
     NamespaceTableAndRegionInfo nstate = getNamespaceState(nsp);
-    assertEquals("Intial region count should be 4.", 4, nstate.getRegionCount());
+    assertEquals(4, nstate.getRegionCount(), "Intial region count should be 4.");
 
     String snapshot = "snapshot_testRestoreSnapshotQuotaExceed";
     // snapshot has 4 regions