diff --git a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTests.java b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTests.java
new file mode 100644
index 0000000000000000000000000000000000000000..e430ee8a60d2a288376dbf2dcac0e41f07bb411c
--- /dev/null
+++ b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTests.java
@@ -0,0 +1,131 @@
+package gov.usgs.earthquake.nshmp.model;
+
+import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.EnumSet;
+import java.util.List;
+import java.util.Set;
+
+import org.junit.jupiter.api.Test;
+
+import gov.usgs.earthquake.nshmp.NamedLocation;
+import gov.usgs.earthquake.nshmp.gmm.Imt;
+import gov.usgs.earthquake.nshmp.site.NshmpSite;
+
+/**
+ * Test NSHMs.
+ */
+class NshmTests {
+  /* Alaska test sites */
+  private static final List<NamedLocation> ALASKA_LOCATIONS = List.of(
+      NshmpSite.ANCHORAGE_AK,
+      NshmpSite.FAIRBANKS_AK,
+      NshmpSite.JUNEAU_AK,
+      NshmpSite.KODIAK_AK,
+      NshmpSite.VALDEZ_AK);
+
+  /* CONUS test sites */
+  private static final List<NamedLocation> CONUS_LOCATIONS = List.of(
+      NshmpSite.LOS_ANGELES_CA,
+      NshmpSite.SAN_FRANCISCO_CA,
+      NshmpSite.SEATTLE_WA,
+      NshmpSite.SALT_LAKE_CITY_UT,
+      NshmpSite.RENO_NV,
+      NshmpSite.NEW_MADRID_MO,
+      NshmpSite.BOSTON_MA,
+      NshmpSite.NEW_YORK_NY,
+      NshmpSite.CHICAGO_IL);
+
+  /* Hawaii test sites */
+  private static final List<NamedLocation> HAWAII_LOCATIONS = List.of(
+      NshmpSite.HILO_HI,
+      NshmpSite.HONOLULU_HI,
+      NshmpSite.KAILUA_KONA_HI);
+
+  private static final Set<Imt> IMTS = EnumSet.of(Imt.PGA, Imt.SA0P2, Imt.SA1P0, Imt.SA5P0);
+
+  /**
+   * Test Alaska 2023 NSHM, {@link Nshm.ALASKA_2023}.
+   *
+   * To run test: ./gradlew testAlaska2023
+   */
+  @Test
+  final void testAlaska2023() throws IOException {
+    NshmTestUtils.testNshm(Nshm.ALASKA_2023);
+  }
+
+  /**
+   * Test CONUS 2018 NSHM, {@link Nshm.CONUS_2018}.
+   *
+   * To run test: ./gradlew testConus2018
+   */
+  @Test
+  final void testConus2018() throws IOException {
+    NshmTestUtils.testNshm(Nshm.CONUS_2018);
+  }
+
+  /**
+   * Test CONUS 2023 NSHM, {@link Nshm.CONUS_2023}.
+   *
+   * To run test: ./gradlew testConus2023
+   */
+  @Test
+  final void testConus2023() throws IOException {
+    NshmTestUtils.testNshm(Nshm.CONUS_2023);
+  }
+
+  /**
+   * Test Hawaii 2021 NSHM, {@link Nshm.HAWAII_2021}.
+   *
+   * To run test: ./gradlew testHawaii2021
+   */
+  @Test
+  final void testHawaii2021() throws IOException {
+    NshmTestUtils.testNshm(Nshm.HAWAII_2021);
+  }
+
+  static enum Nshm {
+    ALASKA_2023("nshm-alaska-3.a.0", ALASKA_LOCATIONS, IMTS),
+
+    CONUS_2018("nshm-conus-5.2.0", CONUS_LOCATIONS, IMTS),
+
+    CONUS_2023("nshm-conus-6.a.3", CONUS_LOCATIONS, IMTS),
+
+    HAWAII_2021("nshm-hawaii-2.0.2", HAWAII_LOCATIONS, IMTS);
+
+    private final String modelName;
+    private final List<NamedLocation> locations;
+    private final Set<Imt> imts;
+
+    Nshm(String modelName, List<NamedLocation> locations, Set<Imt> imts) {
+      this.locations = locations;
+      this.imts = imts;
+      this.modelName = modelName;
+    }
+
+    Path modelPath() {
+      return Paths.get("nshms", modelName);
+    }
+
+    String modelName() {
+      return modelName;
+    }
+
+    List<NamedLocation> locations() {
+      return List.copyOf(locations);
+    }
+
+    Set<Imt> imts() {
+      return Set.copyOf(imts);
+    }
+
+    int year() {
+      return Integer.parseInt(name().split("_")[1]);
+    }
+
+    String resultFilename(NamedLocation location) {
+      return String.format("%s-%s-%s.json", modelName, year(), location.name());
+    }
+  }
+}
diff --git a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestsConus2018.java b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestsConus2018.java
deleted file mode 100644
index 76cafffd02e4114c5fd6f999598a1955374d6521..0000000000000000000000000000000000000000
--- a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestsConus2018.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package gov.usgs.earthquake.nshmp.model;
-
-import org.junit.jupiter.api.Test;
-
-import gov.usgs.earthquake.nshmp.model.NshmTestUtils.Nshm;
-
-/**
- * Test CONUS 2018 NSHM, {@link Nshm.CONUS_2018}.
- *
- * To run test: ./gradlew testConus2018
- */
-class NshmTestsConus2018 {
-
-  @Test
-  final void testNshm() {
-    NshmTestUtils.testNshm(Nshm.CONUS_2018);
-  }
-}
diff --git a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestsHawaii2021.java b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestsHawaii2021.java
deleted file mode 100644
index f90ecec48fe61761e7786153e77f21d9d20e271c..0000000000000000000000000000000000000000
--- a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestsHawaii2021.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package gov.usgs.earthquake.nshmp.model;
-
-import org.junit.jupiter.api.Test;
-
-import gov.usgs.earthquake.nshmp.model.NshmTestUtils.Nshm;
-
-/**
- * Test Hawaii 2021 NSHM, {@link Nshm.HAWAII_2021}.
- *
- * To run test: ./gradlew testHawaii2021
- */
-class NshmTestsHawaii2021 {
-
-  @Test
-  final void testNshm() {
-    NshmTestUtils.testNshm(Nshm.HAWAII_2021);
-  }
-}