diff --git a/src/firmware/lib/zbi/test/BUILD.gn b/src/firmware/lib/zbi/test/BUILD.gn
index 6ade6c2..4c04210 100644
--- a/src/firmware/lib/zbi/test/BUILD.gn
+++ b/src/firmware/lib/zbi/test/BUILD.gn
@@ -34,15 +34,14 @@
     "//zircon/public/lib/fbl",
     "//zircon/public/lib/pretty",
     "//zircon/public/lib/zbi",
+    "//zircon/public/lib/zxtest",
   ]
   if (is_fuchsia) {
     deps += [
       "//sdk/lib/fdio",
       "//zircon/public/lib/zx",
-      "//zircon/system/ulib/unittest",
     ]
   } else {
-    deps += [ "//zircon/system/ulib/unittest:unittest-static" ]
     output_dir = "$root_out_dir/zircon-migrated"
   }
 }
diff --git a/src/firmware/lib/zbi/test/zbi.cc b/src/firmware/lib/zbi/test/zbi.cc
index 604abf5..97be556 100644
--- a/src/firmware/lib/zbi/test/zbi.cc
+++ b/src/firmware/lib/zbi/test/zbi.cc
@@ -14,7 +14,7 @@
 
 #include <fbl/auto_call.h>
 #include <pretty/hexdump.h>
-#include <unittest/unittest.h>
+#include <zxtest/zxtest.h>
 
 #ifdef __Fuchsia__
 #include <lib/zbi/zbi-zx.h>
@@ -161,156 +161,102 @@
   }
 }
 
-static bool ZbiTestInit() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestInit) {
   alignas(ZBI_ALIGNMENT) uint8_t buffer[sizeof(zbi_header_t)];
 
   ASSERT_EQ(zbi_init(buffer, sizeof(buffer)), ZBI_RESULT_OK);
 
   auto* zbi = reinterpret_cast<zbi_header_t*>(buffer);
   ASSERT_EQ(zbi->type, ZBI_TYPE_CONTAINER);
-
-  END_TEST;
 }
 
-static bool ZbiTestInitTooSmall() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestInitTooSmall) {
   alignas(ZBI_ALIGNMENT) uint8_t buffer[sizeof(zbi_header_t) - 1];
 
   ASSERT_EQ(zbi_init(buffer, sizeof(buffer)), ZBI_RESULT_TOO_BIG);
-
-  END_TEST;
 }
 
-static bool ZbiTestInitNotAligned() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestInitNotAligned) {
   alignas(ZBI_ALIGNMENT) uint8_t buffer[sizeof(zbi_header_t) + 1];
   void* misaligned_buffer = &buffer[1];
 
   ASSERT_EQ(zbi_init(misaligned_buffer, sizeof(zbi_header_t)), ZBI_RESULT_BAD_ALIGNMENT);
-
-  END_TEST;
 }
 
-static bool ZbiTestInitNullBuffer() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestInitNullBuffer) {
   ASSERT_EQ(zbi_init(nullptr, sizeof(zbi_header_t)), ZBI_RESULT_ERROR);
-
-  END_TEST;
 }
 
 // TODO(fxb/52665): Consider pulling out the check logic into a common helper.
-static bool ZbiTestCheckEmptyContainer() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckEmptyContainer) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
 
   ASSERT_EQ(zbi_check(&container, nullptr), ZBI_RESULT_OK);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckEmptyContainerWithErr() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckEmptyContainerWithErr) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
   zbi_header_t* err = nullptr;
 
   EXPECT_EQ(zbi_check(&container, &err), ZBI_RESULT_OK);
   ASSERT_EQ(err, nullptr);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckContainerBadType() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckContainerBadType) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
   container.type = 0;
 
   ASSERT_EQ(zbi_check(&container, nullptr), ZBI_RESULT_BAD_TYPE);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckContainerBadTypeWithErr() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckContainerBadTypeWithErr) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
   container.type = 0;
   zbi_header_t* err = nullptr;
 
   EXPECT_EQ(zbi_check(&container, &err), ZBI_RESULT_BAD_TYPE);
   ASSERT_EQ(err, &container);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckContainerBadExtra() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckContainerBadExtra) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
   container.extra = 0;
 
   ASSERT_EQ(zbi_check(&container, nullptr), ZBI_RESULT_BAD_MAGIC);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckContainerBadMagic() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckContainerBadMagic) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
   container.magic = 0;
 
   ASSERT_EQ(zbi_check(&container, nullptr), ZBI_RESULT_BAD_MAGIC);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckContainerBadVersion() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckContainerBadVersion) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
   container.flags &= ~ZBI_FLAG_VERSION;
 
   ASSERT_EQ(zbi_check(&container, nullptr), ZBI_RESULT_BAD_VERSION);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckContainerBadCrc32() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckContainerBadCrc32) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
   // Entries with no checksum must have the crc32 field set to ZBI_ITEM_NO_CRC32.
   container.flags &= ~ZBI_FLAG_CRC32;
   container.crc32 = 0;
 
   ASSERT_EQ(zbi_check(&container, nullptr), ZBI_RESULT_BAD_CRC);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckTestZbi() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckTestZbi) {
   test_zbi_t* zbi = reinterpret_cast<test_zbi_t*>(get_test_zbi());
 
   ASSERT_EQ(zbi_check(zbi, nullptr), ZBI_RESULT_OK);
 
   free(zbi);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckTestZbiWithErr() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckTestZbiWithErr) {
   test_zbi_t* zbi = reinterpret_cast<test_zbi_t*>(get_test_zbi());
   zbi_header_t* err = nullptr;
 
@@ -318,21 +264,13 @@
   ASSERT_EQ(err, nullptr);
 
   free(zbi);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckTestZbiNull() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckTestZbiNull) {
   ASSERT_EQ(zbi_check(nullptr, nullptr), ZBI_RESULT_ERROR);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckFirstBadEntryIsMarked() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckFirstBadEntryIsMarked) {
   test_zbi_t* zbi = reinterpret_cast<test_zbi_t*>(get_test_zbi());
   zbi->cmdline_hdr.magic = 0;
   zbi->ramdisk_hdr.magic = 0;
@@ -343,26 +281,18 @@
   ASSERT_EQ(err, &zbi->cmdline_hdr);
 
   free(zbi);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckTestZbiBadMagic() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckTestZbiBadMagic) {
   test_zbi_t* zbi = reinterpret_cast<test_zbi_t*>(get_test_zbi());
   zbi->cmdline_hdr.magic = 0;
 
   EXPECT_EQ(zbi_check(zbi, nullptr), ZBI_RESULT_BAD_MAGIC);
 
   free(zbi);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckTestZbiBadMagicWithErr() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckTestZbiBadMagicWithErr) {
   test_zbi_t* zbi = reinterpret_cast<test_zbi_t*>(get_test_zbi());
   zbi->cmdline_hdr.magic = 0;
   zbi_header_t* err = nullptr;
@@ -372,26 +302,18 @@
   ASSERT_EQ(err, &zbi->cmdline_hdr);
 
   free(zbi);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckTestZbiBadVersion() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckTestZbiBadVersion) {
   test_zbi_t* zbi = reinterpret_cast<test_zbi_t*>(get_test_zbi());
   zbi->cmdline_hdr.flags &= ~ZBI_FLAG_VERSION;
 
   EXPECT_EQ(zbi_check(zbi, nullptr), ZBI_RESULT_BAD_VERSION);
 
   free(zbi);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckTestZbiBadCrc32() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckTestZbiBadCrc32) {
   test_zbi_t* zbi = reinterpret_cast<test_zbi_t*>(get_test_zbi());
   zbi->cmdline_hdr.flags &= ~ZBI_FLAG_CRC32;
   zbi->cmdline_hdr.crc32 = 0;
@@ -399,38 +321,26 @@
   ASSERT_EQ(zbi_check(zbi, nullptr), ZBI_RESULT_BAD_CRC);
 
   free(zbi);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckTestZbiTruncated() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckTestZbiTruncated) {
   test_zbi_t* zbi = reinterpret_cast<test_zbi_t*>(get_test_zbi());
   zbi->header.length = 1;
 
   ASSERT_EQ(zbi_check(zbi, nullptr), ZBI_RESULT_ERR_TRUNCATED);
 
   free(zbi);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckCompleteTestZbi() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckCompleteTestZbi) {
   test_zbi_t* zbi = reinterpret_cast<test_zbi_t*>(get_test_zbi());
 
   ASSERT_EQ(zbi_check_complete(zbi, nullptr), ZBI_RESULT_OK);
 
   free(zbi);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckCompleteTestZbiWithErr() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckCompleteTestZbiWithErr) {
   test_zbi_t* zbi = reinterpret_cast<test_zbi_t*>(get_test_zbi());
   zbi_header_t* err = nullptr;
 
@@ -439,45 +349,29 @@
   ASSERT_EQ(err, nullptr);
 
   free(zbi);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckCompleteTestZbiNull() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckCompleteTestZbiNull) {
   ASSERT_EQ(zbi_check_complete(nullptr, nullptr), ZBI_RESULT_ERROR);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckCompleteTestZbiTruncated() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckCompleteTestZbiTruncated) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
   container.length = 0;
 
   ASSERT_EQ(zbi_check_complete(&container, nullptr), ZBI_RESULT_ERR_TRUNCATED);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckCompleteTestZbiWrongArch() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckCompleteTestZbiWrongArch) {
   test_zbi_t* zbi = reinterpret_cast<test_zbi_t*>(get_test_zbi());
   zbi->kernel_hdr.type = 0;
 
   ASSERT_EQ(zbi_check_complete(zbi, nullptr), ZBI_RESULT_INCOMPLETE_KERNEL);
 
   free(zbi);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckCompleteTestZbiWrongArchWithErr() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckCompleteTestZbiWrongArchWithErr) {
   test_zbi_t* zbi = reinterpret_cast<test_zbi_t*>(get_test_zbi());
   zbi->kernel_hdr.type = 0;
   zbi_header_t* err = nullptr;
@@ -487,21 +381,15 @@
   ASSERT_EQ(err, &zbi->kernel_hdr);
 
   free(zbi);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckCompleteTestZbiMissingBootfs() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckCompleteTestZbiMissingBootfs) {
   test_zbi_t* zbi = reinterpret_cast<test_zbi_t*>(get_test_zbi());
   zbi->bootfs_hdr.type = ZBI_TYPE_CMDLINE;
 
   ASSERT_EQ(zbi_check_complete(zbi, nullptr), ZBI_RESULT_INCOMPLETE_BOOTFS);
 
   free(zbi);
-
-  END_TEST;
 }
 
 static zbi_result_t count_items_callback(zbi_header_t* header, void* payload, void* cookie) {
@@ -510,40 +398,26 @@
   return ZBI_RESULT_OK;
 }
 
-static bool ZbiTestForEachTestZbiNull() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestForEachTestZbiNull) {
   ASSERT_EQ(zbi_for_each(nullptr, count_items_callback, nullptr), ZBI_RESULT_ERROR);
-
-  END_TEST;
 }
 
-static bool ZbiTestForEachTestZbiNullCallback() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestForEachTestZbiNullCallback) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
 
   ASSERT_EQ(zbi_for_each(&container, nullptr, nullptr), ZBI_RESULT_ERROR);
-
-  END_TEST;
 }
 
-static bool ZbiTestForEachTestZbiContainer() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestForEachTestZbiContainer) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
   uint32_t count = 0;
 
   // The callback should be invoked with ZBI items and not the container.
   EXPECT_EQ(zbi_for_each(&container, count_items_callback, &count), ZBI_RESULT_OK);
   ASSERT_EQ(count, 0);
-
-  END_TEST;
 }
 
-static bool ZbiTestForEachTestZbiTruncated() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestForEachTestZbiTruncated) {
   test_zbi_t* zbi = reinterpret_cast<test_zbi_t*>(get_test_zbi());
   // Container length does not include the size of the container header
   zbi->header.length = offsetof(test_zbi_t, cmdline_payload) - sizeof(zbi_header_t);
@@ -554,13 +428,9 @@
   ASSERT_EQ(count, 2);
 
   free(zbi);
-
-  END_TEST;
 }
 
-static bool ZbiTestForEachTestZbiItems() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestForEachTestZbiItems) {
   test_zbi_t* zbi = reinterpret_cast<test_zbi_t*>(get_test_zbi());
   uint32_t count = 0;
 
@@ -568,8 +438,6 @@
   ASSERT_EQ(count, 4);
 
   free(zbi);
-
-  END_TEST;
 }
 
 static zbi_result_t modify_payload_callback(zbi_header_t* header, void* payload, void* cookie) {
@@ -581,9 +449,7 @@
   return ZBI_RESULT_OK;
 }
 
-static bool ZbiTestForEachTestZbiItemsNoCookie() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestForEachTestZbiItemsNoCookie) {
   test_zbi_t* zbi = reinterpret_cast<test_zbi_t*>(get_test_zbi());
   std::memset(zbi->kernel_payload, 'A', 1);
   std::memset(zbi->cmdline_payload, 'A', 1);
@@ -598,8 +464,6 @@
   EXPECT_EQ(zbi->bootfs_payload[0], 'B');
 
   free(zbi);
-
-  END_TEST;
 }
 
 static zbi_result_t modify_payload_then_error_callback(zbi_header_t* header, void* payload,
@@ -615,9 +479,7 @@
   return ZBI_RESULT_OK;
 }
 
-static bool ZbiTestForEachTestZbiItemsCallbackError() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestForEachTestZbiItemsCallbackError) {
   test_zbi_t* zbi = reinterpret_cast<test_zbi_t*>(get_test_zbi());
   std::memset(zbi->kernel_payload, 'A', 1);
   std::memset(zbi->cmdline_payload, 'A', 1);
@@ -635,13 +497,9 @@
   EXPECT_EQ(zbi->bootfs_payload[0], 'A');
 
   free(zbi);
-
-  END_TEST;
 }
 
-static bool ZbiTestCreateEntryTestZbi() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCreateEntryTestZbi) {
   // The ZBI has space for the container and an entry with an 8-byte payload.
   single_entry_test_zbi_t zbi;
   void* payload = nullptr;
@@ -655,82 +513,54 @@
 
   // Verify the pointer points to the newly created entry payload.
   EXPECT_EQ(payload, zbi.entry_payload);
-
-  END_TEST;
 }
 
-static bool ZbiTestCreateEntryTestZbiNull() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCreateEntryTestZbiNull) {
   void* payload = nullptr;
 
   ASSERT_EQ(zbi_create_entry(nullptr, 0, 0, 0, 0, 0, &payload), ZBI_RESULT_ERROR);
-
-  END_TEST;
 }
 
-static bool ZbiTestCreateEntryTestZbiNullPayload() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCreateEntryTestZbiNullPayload) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
 
   ASSERT_EQ(zbi_create_entry(&container, 0, 0, 0, 0, 0, nullptr), ZBI_RESULT_ERROR);
-
-  END_TEST;
 }
 
-static bool ZbiTestCreateEntryTestZbiCrc32NotSupported() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCreateEntryTestZbiCrc32NotSupported) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
   void* payload = nullptr;
 
   ASSERT_EQ(zbi_create_entry(&container, 0, 0, 0, ZBI_FLAG_CRC32, 0, &payload), ZBI_RESULT_ERROR);
-
-  END_TEST;
 }
 
-static bool ZbiTestCreateEntryTestZbiNotContainer() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCreateEntryTestZbiNotContainer) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
   container.type = 0;
   void* payload = nullptr;
 
   ASSERT_EQ(zbi_create_entry(&container, 0, 0, 0, 0, 0, &payload), ZBI_RESULT_BAD_TYPE);
-
-  END_TEST;
 }
 
 // create entry tests
-static bool ZbiTestCreateEntryTestZbiCapacitySmallerThanCurrentSize() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCreateEntryTestZbiCapacitySmallerThanCurrentSize) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
   container.length = 2;
   void* payload = nullptr;
 
   ASSERT_EQ(zbi_create_entry(&container, /*capacity=*/1, 0, 0, 0, 0, &payload), ZBI_RESULT_TOO_BIG);
-
-  END_TEST;
 }
 
-static bool ZbiTestCreateEntryTestZbiFull() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCreateEntryTestZbiFull) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
   void* payload = nullptr;
 
   ASSERT_EQ(zbi_create_entry(&container, /*capacity=*/sizeof(container), 0, 0, 0,
                              /*payload_length=*/1, &payload),
             ZBI_RESULT_TOO_BIG);
-
-  END_TEST;
 }
 
-static bool ZbiTestCreateEntryTestZbiPayloadTooLarge() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCreateEntryTestZbiPayloadTooLarge) {
   single_entry_test_zbi_t zbi;
   uint32_t capacity = sizeof(zbi);
   void* payload = nullptr;
@@ -739,13 +569,9 @@
   ASSERT_EQ(zbi_create_entry(&zbi, capacity, 0, 0, 0,
                              /*payload_length=*/capacity, &payload),
             ZBI_RESULT_TOO_BIG);
-
-  END_TEST;
 }
 
-static bool ZbiTestCreateEntryWithPayloadTestZbi() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCreateEntryWithPayloadTestZbi) {
   // The ZBI will have space for the container and an entry with a small payload.
   single_entry_test_zbi_t zbi;
   uint32_t payload = 0xABCDABCD;
@@ -757,84 +583,56 @@
   // Verify the contents of the payload.
   ASSERT_BYTES_EQ(reinterpret_cast<uint8_t*>(zbi.entry_payload),
                   reinterpret_cast<uint8_t*>(&payload), sizeof(payload), "Mismatched payloads.");
-
-  END_TEST;
 }
 
-static bool ZbiTestCreateEntryWithPayloadTestZbiNull() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCreateEntryWithPayloadTestZbiNull) {
   void* payload = nullptr;
 
   ASSERT_EQ(zbi_create_entry_with_payload(nullptr, 0, 0, 0, 0, &payload, 0), ZBI_RESULT_ERROR);
-
-  END_TEST;
 }
 
-static bool ZbiTestCreateEntryWithPayloadTestZbiNullPayload() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCreateEntryWithPayloadTestZbiNullPayload) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
 
   ASSERT_EQ(zbi_create_entry_with_payload(&container, 0, 0, 0, 0, nullptr, 0), ZBI_RESULT_ERROR);
-
-  END_TEST;
 }
 
-static bool ZbiTestCreateEntryWithPayloadTestZbiCrc32NotSupported() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCreateEntryWithPayloadTestZbiCrc32NotSupported) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
   void* payload = nullptr;
 
   ASSERT_EQ(zbi_create_entry_with_payload(&container, 0, 0, 0, ZBI_FLAG_CRC32, &payload, 0),
             ZBI_RESULT_ERROR);
-
-  END_TEST;
 }
 
-static bool ZbiTestCreateEntryWithPayloadTestZbiNotContainer() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCreateEntryWithPayloadTestZbiNotContainer) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
   container.type = 0;
   void* payload = nullptr;
 
   ASSERT_EQ(zbi_create_entry_with_payload(&container, 0, 0, 0, 0, &payload, 0),
             ZBI_RESULT_BAD_TYPE);
-
-  END_TEST;
 }
 
-static bool ZbiTestCreateEntryWithPayloadTestZbiCapacitySmallerThanCurrentSize() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCreateEntryWithPayloadTestZbiCapacitySmallerThanCurrentSize) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
   container.length = 2;
   void* payload = nullptr;
 
   ASSERT_EQ(zbi_create_entry_with_payload(&container, /*capacity=*/1, 0, 0, 0, &payload, 0),
             ZBI_RESULT_TOO_BIG);
-
-  END_TEST;
 }
 
-static bool ZbiTestCreateEntryWithPayloadTestZbiSectionTooLarge() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCreateEntryWithPayloadTestZbiSectionTooLarge) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
   void* payload = nullptr;
 
   ASSERT_EQ(zbi_create_entry_with_payload(&container, /*capacity=*/1, 0, 0, 0, &payload,
                                           /*payload_length=*/2),
             ZBI_RESULT_TOO_BIG);
-
-  END_TEST;
 }
 
-static bool ZbiTestExtendTestZbi() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestExtendTestZbi) {
   single_entry_test_zbi_t dst_zbi;
   single_entry_test_zbi_t src_zbi;
 
@@ -847,94 +645,63 @@
   ASSERT_EQ(zbi_extend(&dst_zbi, sizeof(dst_zbi), &src_zbi), ZBI_RESULT_OK);
   ASSERT_BYTES_EQ(reinterpret_cast<uint8_t*>(dst_zbi.entry_payload),
                   reinterpret_cast<uint8_t*>(&payload), sizeof(payload), "Mismatched payload.");
-
-  END_TEST;
 }
 
-static bool ZbiTestExtendTestZbiDstNull() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestExtendTestZbiDstNull) {
   zbi_header_t zbi = ZBI_CONTAINER_HEADER(0);
 
   ASSERT_EQ(zbi_extend(nullptr, 0, &zbi), ZBI_RESULT_ERROR);
-
-  END_TEST;
 }
 
-static bool ZbiTestExtendTestZbiSrcNull() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestExtendTestZbiSrcNull) {
   zbi_header_t zbi = ZBI_CONTAINER_HEADER(0);
 
   ASSERT_EQ(zbi_extend(&zbi, 0, nullptr), ZBI_RESULT_ERROR);
-
-  END_TEST;
 }
 
-static bool ZbiTestExtendTestZbiDstNotContainer() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestExtendTestZbiDstNotContainer) {
   zbi_header_t src = ZBI_CONTAINER_HEADER(0);
   zbi_header_t dst = ZBI_CONTAINER_HEADER(0);
   dst.type = 0;
 
   ASSERT_EQ(zbi_extend(&dst, 0, &src), ZBI_RESULT_BAD_TYPE);
-
-  END_TEST;
 }
 
-static bool ZbiTestExtendTestZbiSrcNotContainer() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestExtendTestZbiSrcNotContainer) {
   zbi_header_t src = ZBI_CONTAINER_HEADER(0);
   src.type = 0;
   zbi_header_t dst = ZBI_CONTAINER_HEADER(0);
 
   ASSERT_EQ(zbi_extend(&dst, 0, &src), ZBI_RESULT_BAD_TYPE);
-
-  END_TEST;
 }
 
-static bool ZbiTestExtendTestZbiCapacitySmallerThanDstLength() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestExtendTestZbiCapacitySmallerThanDstLength) {
   zbi_header_t src = ZBI_CONTAINER_HEADER(0);
   zbi_header_t dst = ZBI_CONTAINER_HEADER(1);
 
   ASSERT_EQ(zbi_extend(&dst, 0, &src), ZBI_RESULT_TOO_BIG);
-
-  END_TEST;
 }
 
-static bool ZbiTestExtendTestZbiCapacitySmallerThanDstAlignedLength() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestExtendTestZbiCapacitySmallerThanDstAlignedLength) {
   zbi_header_t src = ZBI_CONTAINER_HEADER(0);
   zbi_header_t dst = ZBI_CONTAINER_HEADER(6);
 
   ASSERT_EQ(zbi_extend(&dst, /*capacity=*/7, &src), ZBI_RESULT_TOO_BIG);
-
-  END_TEST;
 }
 
-static bool ZbiTestExtendTestZbiSrcTooLarge() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestExtendTestZbiSrcTooLarge) {
   zbi_header_t src = ZBI_CONTAINER_HEADER(ZBI_ALIGNMENT + 1);
   zbi_header_t dst = ZBI_CONTAINER_HEADER(ZBI_ALIGNMENT);
 
   ASSERT_EQ(zbi_extend(&dst, /*capacity=*/ZBI_ALIGNMENT, &src), ZBI_RESULT_TOO_BIG);
-
-  END_TEST;
 }
 
-static bool ZbiTestBasic(void) {
-  BEGIN_TEST;
+TEST(ZbiTests, ZbiTestBasic) {
   uint8_t* test_zbi = get_test_zbi();
 
   auto cleanup = fbl::MakeAutoCall([test_zbi]() { free(test_zbi); });
 
-  ASSERT_NONNULL(test_zbi, "failed to alloc test image");
+  ASSERT_NOT_NULL(test_zbi, "failed to alloc test image");
 
   zbi::Zbi image(test_zbi);
 
@@ -951,18 +718,14 @@
   ASSERT_EQ(result, ZBI_RESULT_OK, "content check failed");
 
   ASSERT_EQ(count, 4, "bad bootdata item count");
-
-  END_TEST;
 }
 
-static bool ZbiTestBadContainer(void) {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestBadContainer) {
   uint8_t* test_zbi = get_test_zbi();
 
   auto cleanup = fbl::MakeAutoCall([test_zbi]() { free(test_zbi); });
 
-  ASSERT_NONNULL(test_zbi, "failed to alloc test image");
+  ASSERT_NOT_NULL(test_zbi, "failed to alloc test image");
 
   zbi_header_t* bootdata_header = reinterpret_cast<zbi_header_t*>(test_zbi);
   // Set to something arbitrary
@@ -976,17 +739,14 @@
   // Make sure that the diagnostic information tells us that the container is
   // bad.
   ASSERT_EQ(problem_header, bootdata_header);
-
-  END_TEST;
 }
 
-static bool ZbiTestTruncated(void) {
-  BEGIN_TEST;
+TEST(ZbiTests, ZbiTestTruncated) {
   uint8_t* test_zbi = get_test_zbi();
 
   auto cleanup = fbl::MakeAutoCall([test_zbi]() { free(test_zbi); });
 
-  ASSERT_NONNULL(test_zbi, "failed to alloc test image");
+  ASSERT_NOT_NULL(test_zbi, "failed to alloc test image");
 
   zbi::Zbi image(test_zbi);
 
@@ -998,7 +758,7 @@
 
   // zbi.Check should only give us diagnostics about the error if there was
   // an error in the first place.
-  ASSERT_NONNULL(trace, "Bad image with no trace diagnostics?");
+  ASSERT_NOT_NULL(trace, "Bad image with no trace diagnostics?");
 
   int count = 0;
   zbi_result_t result = image.ForEach(check_contents, &count);
@@ -1006,12 +766,9 @@
   ASSERT_NE(result, ZBI_RESULT_OK, "Truncated image not reported as truncated");
 
   ASSERT_EQ(count, 4, "bad bootdata item count");
-
-  END_TEST;
 }
 
-static bool ZbiTestAppend(void) {
-  BEGIN_TEST;
+TEST(ZbiTests, ZbiTestAppend) {
   // Allocate an additional kExtraBytes at the end of the ZBI to test
   // appending.
   const size_t kExtraBytes = sizeof(zbi_header_t) + sizeof(kAppendRD);
@@ -1026,7 +783,7 @@
     free(reference_zbi);
   });
 
-  ASSERT_NONNULL(test_zbi, "failed to alloc test image");
+  ASSERT_NOT_NULL(test_zbi, "failed to alloc test image");
 
   const size_t kBufferSize = sizeof(test_zbi_t) + kExtraBytes;
   zbi::Zbi image(test_zbi, kBufferSize);
@@ -1047,14 +804,10 @@
   // Verify the integrity of the data.
   reference_image->header.length = test_image->header.length;
   ASSERT_EQ(memcmp(test_zbi, reference_zbi, sizeof(test_zbi_t)), 0, "Append corrupted image");
-
-  END_TEST;
 }
 
 // Make sure we never overflow the ZBI's buffer by appending.
-static bool ZbiTestAppendFull(void) {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestAppendFull) {
   // Enough space for a small payload
   const size_t kMaxAppendPayloadSize = ZBI_ALIGN(5);
   const size_t kExtraBytes = sizeof(zbi_header_t) + kMaxAppendPayloadSize;
@@ -1063,7 +816,7 @@
 
   uint8_t* test_zbi = get_test_zbi_extra(kExtraBytes + kExtraSentinelLength);
 
-  ASSERT_NONNULL(test_zbi, "failed to alloc test image");
+  ASSERT_NOT_NULL(test_zbi, "failed to alloc test image");
 
   auto cleanup = fbl::MakeAutoCall([test_zbi] { free(test_zbi); });
 
@@ -1101,15 +854,12 @@
     ASSERT_EQ(test_zbi[kZbiSize + i], kSentinelByte,
               "corrupt sentinel bytes, append section overflowed.");
   }
-
-  END_TEST;
 }
 
 // Test that appending multiple sections to a ZBI works
-static bool ZbiTestAppendMulti(void) {
-  BEGIN_TEST;
+TEST(ZbiTests, ZbiTestAppendMulti) {
   uint8_t* reference_zbi = get_test_zbi();
-  ASSERT_NONNULL(reference_zbi);
+  ASSERT_NOT_NULL(reference_zbi);
   auto cleanup = fbl::MakeAutoCall([reference_zbi]() { free(reference_zbi); });
 
   alignas(ZBI_ALIGNMENT) uint8_t test_zbi[sizeof(test_zbi_t)];
@@ -1147,15 +897,11 @@
   ASSERT_EQ(result, ZBI_RESULT_OK);
 
   ASSERT_EQ(memcmp(reference_zbi, test_zbi, image.Length()), 0);
-
-  END_TEST;
 }
 
 constexpr size_t kTestBufferSize = 1024;
 // Test that we can initialize empty buffers as ZBI containers.
-static bool ZbiTestCppInit(void) {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCppInit) {
   std::unique_ptr<uint8_t[]> buffer;
   buffer.reset(new uint8_t[kTestBufferSize]);
 
@@ -1168,14 +914,10 @@
 
   result = image.CreateEntryWithPayload(ZBI_TYPE_CMDLINE, 0, 0, kTestCmdline, sizeof(kTestCmdline));
   ASSERT_EQ(result, ZBI_RESULT_OK);
-
-  END_TEST;
 }
 
 // Test that we don't try to create a ZBI in a container that's not big enough.
-static bool ZbiTestCppInitTooSmall(void) {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCppInitTooSmall) {
   constexpr uint8_t kSentinel = 0xab;
 
   // If all goes well, we should never write to this buffer.
@@ -1197,16 +939,12 @@
   for (size_t i = 0; i < kTestBufferSize; i++) {
     EXPECT_EQ(buffer.get()[i], kSentinel);
   }
-
-  END_TEST;
 }
 
 // Test the happy case.
 // Make two zbi containers, extend the first by tacking the second to the back
 // of it. Observe that everything went okay.
-static bool ZbiTestExtendOkay(void) {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestExtendOkay) {
   // Create a dst zbi that has enough space to contain the src zbi.
   uint8_t* src_buf = get_test_zbi();
 
@@ -1232,12 +970,9 @@
 
   ASSERT_EQ(zbi_for_each(dst_buf, check_contents, &combined_sections), ZBI_RESULT_OK);
   ASSERT_EQ(src_sections + dst_sections, combined_sections);
-
-  END_TEST;
 }
 
-static bool ZbiTestNoOverflow(void) {
-  BEGIN_TEST;
+TEST(ZbiTests, ZbiTestNoOverflow) {
   constexpr size_t kBufferSize = 1024;
   constexpr size_t kUsableBufferSize = kBufferSize / 2;
   constexpr uint8_t kSentinel = 0xab;
@@ -1294,14 +1029,10 @@
             ZBI_RESULT_OK);
 
   ASSERT_NE(zbi_extend(dst_buffer, kUsableBufferSize, src_buffer), ZBI_RESULT_OK);
-
-  END_TEST;
 }
 
 #ifdef __Fuchsia__
-static bool ZbiZxTestOverflowAtPageBoundary() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiZxTestOverflowAtPageBoundary) {
   // Make a VMO, and fill it with a zbi that's "kernel + data".
   constexpr size_t kInitialAlloc = 16384;
   zx_handle_t bootdata;
@@ -1351,95 +1082,5 @@
             ZBI_RESULT_OK);
   EXPECT_EQ(data.AppendSection(sizeof(append_data), ZBI_TYPE_CMDLINE, 0, 0, append_data),
             ZBI_RESULT_OK);
-
-  END_TEST;
 }
 #endif
-
-BEGIN_TEST_CASE(zbi_tests)
-RUN_TEST(ZbiTestInit)
-RUN_TEST(ZbiTestInitTooSmall)
-RUN_TEST(ZbiTestInitNotAligned)
-RUN_TEST(ZbiTestInitNullBuffer)
-
-RUN_TEST(ZbiTestCheckEmptyContainer)
-RUN_TEST(ZbiTestCheckEmptyContainerWithErr)
-RUN_TEST(ZbiTestCheckContainerBadType)
-RUN_TEST(ZbiTestCheckContainerBadTypeWithErr)
-RUN_TEST(ZbiTestCheckContainerBadExtra)
-RUN_TEST(ZbiTestCheckContainerBadMagic)
-RUN_TEST(ZbiTestCheckContainerBadVersion)
-RUN_TEST(ZbiTestCheckContainerBadCrc32)
-
-RUN_TEST(ZbiTestCheckTestZbi)
-RUN_TEST(ZbiTestCheckTestZbiWithErr)
-RUN_TEST(ZbiTestCheckTestZbiNull)
-RUN_TEST(ZbiTestCheckFirstBadEntryIsMarked)
-RUN_TEST(ZbiTestCheckTestZbiBadMagic)
-RUN_TEST(ZbiTestCheckTestZbiBadMagicWithErr)
-RUN_TEST(ZbiTestCheckTestZbiBadVersion)
-RUN_TEST(ZbiTestCheckTestZbiBadCrc32)
-RUN_TEST(ZbiTestCheckTestZbiTruncated)
-
-RUN_TEST(ZbiTestCheckCompleteTestZbi)
-RUN_TEST(ZbiTestCheckCompleteTestZbiWithErr)
-RUN_TEST(ZbiTestCheckCompleteTestZbiNull)
-RUN_TEST(ZbiTestCheckCompleteTestZbiTruncated)
-RUN_TEST(ZbiTestCheckCompleteTestZbiWrongArch)
-RUN_TEST(ZbiTestCheckCompleteTestZbiWrongArchWithErr)
-RUN_TEST(ZbiTestCheckCompleteTestZbiMissingBootfs)
-
-RUN_TEST(ZbiTestForEachTestZbiNull)
-RUN_TEST(ZbiTestForEachTestZbiNullCallback)
-RUN_TEST(ZbiTestForEachTestZbiContainer)
-RUN_TEST(ZbiTestForEachTestZbiTruncated)
-RUN_TEST(ZbiTestForEachTestZbiItems)
-RUN_TEST(ZbiTestForEachTestZbiItemsNoCookie)
-RUN_TEST(ZbiTestForEachTestZbiItemsCallbackError)
-
-RUN_TEST(ZbiTestCreateEntryTestZbi)
-RUN_TEST(ZbiTestCreateEntryTestZbiNull)
-RUN_TEST(ZbiTestCreateEntryTestZbiNullPayload)
-RUN_TEST(ZbiTestCreateEntryTestZbiCrc32NotSupported)
-RUN_TEST(ZbiTestCreateEntryTestZbiNotContainer)
-RUN_TEST(ZbiTestCreateEntryTestZbiCapacitySmallerThanCurrentSize)
-RUN_TEST(ZbiTestCreateEntryTestZbiFull)
-RUN_TEST(ZbiTestCreateEntryTestZbiPayloadTooLarge)
-
-RUN_TEST(ZbiTestCreateEntryWithPayloadTestZbi)
-RUN_TEST(ZbiTestCreateEntryWithPayloadTestZbiNull)
-RUN_TEST(ZbiTestCreateEntryWithPayloadTestZbiNullPayload)
-RUN_TEST(ZbiTestCreateEntryWithPayloadTestZbiCrc32NotSupported)
-RUN_TEST(ZbiTestCreateEntryWithPayloadTestZbiNotContainer)
-RUN_TEST(ZbiTestCreateEntryWithPayloadTestZbiCapacitySmallerThanCurrentSize)
-RUN_TEST(ZbiTestCreateEntryWithPayloadTestZbiSectionTooLarge)
-
-RUN_TEST(ZbiTestExtendTestZbi)
-RUN_TEST(ZbiTestExtendTestZbiDstNull)
-RUN_TEST(ZbiTestExtendTestZbiSrcNull)
-RUN_TEST(ZbiTestExtendTestZbiDstNotContainer)
-RUN_TEST(ZbiTestExtendTestZbiSrcNotContainer)
-RUN_TEST(ZbiTestExtendTestZbiCapacitySmallerThanDstLength)
-RUN_TEST(ZbiTestExtendTestZbiCapacitySmallerThanDstAlignedLength)
-RUN_TEST(ZbiTestExtendTestZbiSrcTooLarge)
-
-// Basic tests.
-RUN_TEST(ZbiTestBasic)
-RUN_TEST(ZbiTestBadContainer)
-RUN_TEST(ZbiTestTruncated)
-
-RUN_TEST(ZbiTestCppInit)
-RUN_TEST(ZbiTestCppInitTooSmall)
-
-// Append tests.
-RUN_TEST(ZbiTestAppend)
-RUN_TEST(ZbiTestAppendFull)
-RUN_TEST(ZbiTestAppendMulti)
-
-// Extend tests.
-RUN_TEST(ZbiTestExtendOkay)
-RUN_TEST(ZbiTestNoOverflow)
-#ifdef __Fuchsia__
-RUN_TEST(ZbiZxTestOverflowAtPageBoundary)
-#endif
-END_TEST_CASE(zbi_tests)
diff --git a/zircon/system/ulib/zbi/test/BUILD.gn b/zircon/system/ulib/zbi/test/BUILD.gn
index 6ade6c2..4c04210 100644
--- a/zircon/system/ulib/zbi/test/BUILD.gn
+++ b/zircon/system/ulib/zbi/test/BUILD.gn
@@ -34,15 +34,14 @@
     "//zircon/public/lib/fbl",
     "//zircon/public/lib/pretty",
     "//zircon/public/lib/zbi",
+    "//zircon/public/lib/zxtest",
   ]
   if (is_fuchsia) {
     deps += [
       "//sdk/lib/fdio",
       "//zircon/public/lib/zx",
-      "//zircon/system/ulib/unittest",
     ]
   } else {
-    deps += [ "//zircon/system/ulib/unittest:unittest-static" ]
     output_dir = "$root_out_dir/zircon-migrated"
   }
 }
diff --git a/zircon/system/ulib/zbi/test/zbi.cc b/zircon/system/ulib/zbi/test/zbi.cc
index 604abf5..97be556 100644
--- a/zircon/system/ulib/zbi/test/zbi.cc
+++ b/zircon/system/ulib/zbi/test/zbi.cc
@@ -14,7 +14,7 @@
 
 #include <fbl/auto_call.h>
 #include <pretty/hexdump.h>
-#include <unittest/unittest.h>
+#include <zxtest/zxtest.h>
 
 #ifdef __Fuchsia__
 #include <lib/zbi/zbi-zx.h>
@@ -161,156 +161,102 @@
   }
 }
 
-static bool ZbiTestInit() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestInit) {
   alignas(ZBI_ALIGNMENT) uint8_t buffer[sizeof(zbi_header_t)];
 
   ASSERT_EQ(zbi_init(buffer, sizeof(buffer)), ZBI_RESULT_OK);
 
   auto* zbi = reinterpret_cast<zbi_header_t*>(buffer);
   ASSERT_EQ(zbi->type, ZBI_TYPE_CONTAINER);
-
-  END_TEST;
 }
 
-static bool ZbiTestInitTooSmall() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestInitTooSmall) {
   alignas(ZBI_ALIGNMENT) uint8_t buffer[sizeof(zbi_header_t) - 1];
 
   ASSERT_EQ(zbi_init(buffer, sizeof(buffer)), ZBI_RESULT_TOO_BIG);
-
-  END_TEST;
 }
 
-static bool ZbiTestInitNotAligned() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestInitNotAligned) {
   alignas(ZBI_ALIGNMENT) uint8_t buffer[sizeof(zbi_header_t) + 1];
   void* misaligned_buffer = &buffer[1];
 
   ASSERT_EQ(zbi_init(misaligned_buffer, sizeof(zbi_header_t)), ZBI_RESULT_BAD_ALIGNMENT);
-
-  END_TEST;
 }
 
-static bool ZbiTestInitNullBuffer() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestInitNullBuffer) {
   ASSERT_EQ(zbi_init(nullptr, sizeof(zbi_header_t)), ZBI_RESULT_ERROR);
-
-  END_TEST;
 }
 
 // TODO(fxb/52665): Consider pulling out the check logic into a common helper.
-static bool ZbiTestCheckEmptyContainer() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckEmptyContainer) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
 
   ASSERT_EQ(zbi_check(&container, nullptr), ZBI_RESULT_OK);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckEmptyContainerWithErr() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckEmptyContainerWithErr) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
   zbi_header_t* err = nullptr;
 
   EXPECT_EQ(zbi_check(&container, &err), ZBI_RESULT_OK);
   ASSERT_EQ(err, nullptr);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckContainerBadType() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckContainerBadType) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
   container.type = 0;
 
   ASSERT_EQ(zbi_check(&container, nullptr), ZBI_RESULT_BAD_TYPE);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckContainerBadTypeWithErr() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckContainerBadTypeWithErr) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
   container.type = 0;
   zbi_header_t* err = nullptr;
 
   EXPECT_EQ(zbi_check(&container, &err), ZBI_RESULT_BAD_TYPE);
   ASSERT_EQ(err, &container);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckContainerBadExtra() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckContainerBadExtra) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
   container.extra = 0;
 
   ASSERT_EQ(zbi_check(&container, nullptr), ZBI_RESULT_BAD_MAGIC);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckContainerBadMagic() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckContainerBadMagic) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
   container.magic = 0;
 
   ASSERT_EQ(zbi_check(&container, nullptr), ZBI_RESULT_BAD_MAGIC);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckContainerBadVersion() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckContainerBadVersion) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
   container.flags &= ~ZBI_FLAG_VERSION;
 
   ASSERT_EQ(zbi_check(&container, nullptr), ZBI_RESULT_BAD_VERSION);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckContainerBadCrc32() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckContainerBadCrc32) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
   // Entries with no checksum must have the crc32 field set to ZBI_ITEM_NO_CRC32.
   container.flags &= ~ZBI_FLAG_CRC32;
   container.crc32 = 0;
 
   ASSERT_EQ(zbi_check(&container, nullptr), ZBI_RESULT_BAD_CRC);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckTestZbi() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckTestZbi) {
   test_zbi_t* zbi = reinterpret_cast<test_zbi_t*>(get_test_zbi());
 
   ASSERT_EQ(zbi_check(zbi, nullptr), ZBI_RESULT_OK);
 
   free(zbi);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckTestZbiWithErr() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckTestZbiWithErr) {
   test_zbi_t* zbi = reinterpret_cast<test_zbi_t*>(get_test_zbi());
   zbi_header_t* err = nullptr;
 
@@ -318,21 +264,13 @@
   ASSERT_EQ(err, nullptr);
 
   free(zbi);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckTestZbiNull() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckTestZbiNull) {
   ASSERT_EQ(zbi_check(nullptr, nullptr), ZBI_RESULT_ERROR);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckFirstBadEntryIsMarked() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckFirstBadEntryIsMarked) {
   test_zbi_t* zbi = reinterpret_cast<test_zbi_t*>(get_test_zbi());
   zbi->cmdline_hdr.magic = 0;
   zbi->ramdisk_hdr.magic = 0;
@@ -343,26 +281,18 @@
   ASSERT_EQ(err, &zbi->cmdline_hdr);
 
   free(zbi);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckTestZbiBadMagic() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckTestZbiBadMagic) {
   test_zbi_t* zbi = reinterpret_cast<test_zbi_t*>(get_test_zbi());
   zbi->cmdline_hdr.magic = 0;
 
   EXPECT_EQ(zbi_check(zbi, nullptr), ZBI_RESULT_BAD_MAGIC);
 
   free(zbi);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckTestZbiBadMagicWithErr() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckTestZbiBadMagicWithErr) {
   test_zbi_t* zbi = reinterpret_cast<test_zbi_t*>(get_test_zbi());
   zbi->cmdline_hdr.magic = 0;
   zbi_header_t* err = nullptr;
@@ -372,26 +302,18 @@
   ASSERT_EQ(err, &zbi->cmdline_hdr);
 
   free(zbi);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckTestZbiBadVersion() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckTestZbiBadVersion) {
   test_zbi_t* zbi = reinterpret_cast<test_zbi_t*>(get_test_zbi());
   zbi->cmdline_hdr.flags &= ~ZBI_FLAG_VERSION;
 
   EXPECT_EQ(zbi_check(zbi, nullptr), ZBI_RESULT_BAD_VERSION);
 
   free(zbi);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckTestZbiBadCrc32() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckTestZbiBadCrc32) {
   test_zbi_t* zbi = reinterpret_cast<test_zbi_t*>(get_test_zbi());
   zbi->cmdline_hdr.flags &= ~ZBI_FLAG_CRC32;
   zbi->cmdline_hdr.crc32 = 0;
@@ -399,38 +321,26 @@
   ASSERT_EQ(zbi_check(zbi, nullptr), ZBI_RESULT_BAD_CRC);
 
   free(zbi);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckTestZbiTruncated() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckTestZbiTruncated) {
   test_zbi_t* zbi = reinterpret_cast<test_zbi_t*>(get_test_zbi());
   zbi->header.length = 1;
 
   ASSERT_EQ(zbi_check(zbi, nullptr), ZBI_RESULT_ERR_TRUNCATED);
 
   free(zbi);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckCompleteTestZbi() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckCompleteTestZbi) {
   test_zbi_t* zbi = reinterpret_cast<test_zbi_t*>(get_test_zbi());
 
   ASSERT_EQ(zbi_check_complete(zbi, nullptr), ZBI_RESULT_OK);
 
   free(zbi);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckCompleteTestZbiWithErr() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckCompleteTestZbiWithErr) {
   test_zbi_t* zbi = reinterpret_cast<test_zbi_t*>(get_test_zbi());
   zbi_header_t* err = nullptr;
 
@@ -439,45 +349,29 @@
   ASSERT_EQ(err, nullptr);
 
   free(zbi);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckCompleteTestZbiNull() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckCompleteTestZbiNull) {
   ASSERT_EQ(zbi_check_complete(nullptr, nullptr), ZBI_RESULT_ERROR);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckCompleteTestZbiTruncated() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckCompleteTestZbiTruncated) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
   container.length = 0;
 
   ASSERT_EQ(zbi_check_complete(&container, nullptr), ZBI_RESULT_ERR_TRUNCATED);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckCompleteTestZbiWrongArch() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckCompleteTestZbiWrongArch) {
   test_zbi_t* zbi = reinterpret_cast<test_zbi_t*>(get_test_zbi());
   zbi->kernel_hdr.type = 0;
 
   ASSERT_EQ(zbi_check_complete(zbi, nullptr), ZBI_RESULT_INCOMPLETE_KERNEL);
 
   free(zbi);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckCompleteTestZbiWrongArchWithErr() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckCompleteTestZbiWrongArchWithErr) {
   test_zbi_t* zbi = reinterpret_cast<test_zbi_t*>(get_test_zbi());
   zbi->kernel_hdr.type = 0;
   zbi_header_t* err = nullptr;
@@ -487,21 +381,15 @@
   ASSERT_EQ(err, &zbi->kernel_hdr);
 
   free(zbi);
-
-  END_TEST;
 }
 
-static bool ZbiTestCheckCompleteTestZbiMissingBootfs() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCheckCompleteTestZbiMissingBootfs) {
   test_zbi_t* zbi = reinterpret_cast<test_zbi_t*>(get_test_zbi());
   zbi->bootfs_hdr.type = ZBI_TYPE_CMDLINE;
 
   ASSERT_EQ(zbi_check_complete(zbi, nullptr), ZBI_RESULT_INCOMPLETE_BOOTFS);
 
   free(zbi);
-
-  END_TEST;
 }
 
 static zbi_result_t count_items_callback(zbi_header_t* header, void* payload, void* cookie) {
@@ -510,40 +398,26 @@
   return ZBI_RESULT_OK;
 }
 
-static bool ZbiTestForEachTestZbiNull() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestForEachTestZbiNull) {
   ASSERT_EQ(zbi_for_each(nullptr, count_items_callback, nullptr), ZBI_RESULT_ERROR);
-
-  END_TEST;
 }
 
-static bool ZbiTestForEachTestZbiNullCallback() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestForEachTestZbiNullCallback) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
 
   ASSERT_EQ(zbi_for_each(&container, nullptr, nullptr), ZBI_RESULT_ERROR);
-
-  END_TEST;
 }
 
-static bool ZbiTestForEachTestZbiContainer() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestForEachTestZbiContainer) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
   uint32_t count = 0;
 
   // The callback should be invoked with ZBI items and not the container.
   EXPECT_EQ(zbi_for_each(&container, count_items_callback, &count), ZBI_RESULT_OK);
   ASSERT_EQ(count, 0);
-
-  END_TEST;
 }
 
-static bool ZbiTestForEachTestZbiTruncated() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestForEachTestZbiTruncated) {
   test_zbi_t* zbi = reinterpret_cast<test_zbi_t*>(get_test_zbi());
   // Container length does not include the size of the container header
   zbi->header.length = offsetof(test_zbi_t, cmdline_payload) - sizeof(zbi_header_t);
@@ -554,13 +428,9 @@
   ASSERT_EQ(count, 2);
 
   free(zbi);
-
-  END_TEST;
 }
 
-static bool ZbiTestForEachTestZbiItems() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestForEachTestZbiItems) {
   test_zbi_t* zbi = reinterpret_cast<test_zbi_t*>(get_test_zbi());
   uint32_t count = 0;
 
@@ -568,8 +438,6 @@
   ASSERT_EQ(count, 4);
 
   free(zbi);
-
-  END_TEST;
 }
 
 static zbi_result_t modify_payload_callback(zbi_header_t* header, void* payload, void* cookie) {
@@ -581,9 +449,7 @@
   return ZBI_RESULT_OK;
 }
 
-static bool ZbiTestForEachTestZbiItemsNoCookie() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestForEachTestZbiItemsNoCookie) {
   test_zbi_t* zbi = reinterpret_cast<test_zbi_t*>(get_test_zbi());
   std::memset(zbi->kernel_payload, 'A', 1);
   std::memset(zbi->cmdline_payload, 'A', 1);
@@ -598,8 +464,6 @@
   EXPECT_EQ(zbi->bootfs_payload[0], 'B');
 
   free(zbi);
-
-  END_TEST;
 }
 
 static zbi_result_t modify_payload_then_error_callback(zbi_header_t* header, void* payload,
@@ -615,9 +479,7 @@
   return ZBI_RESULT_OK;
 }
 
-static bool ZbiTestForEachTestZbiItemsCallbackError() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestForEachTestZbiItemsCallbackError) {
   test_zbi_t* zbi = reinterpret_cast<test_zbi_t*>(get_test_zbi());
   std::memset(zbi->kernel_payload, 'A', 1);
   std::memset(zbi->cmdline_payload, 'A', 1);
@@ -635,13 +497,9 @@
   EXPECT_EQ(zbi->bootfs_payload[0], 'A');
 
   free(zbi);
-
-  END_TEST;
 }
 
-static bool ZbiTestCreateEntryTestZbi() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCreateEntryTestZbi) {
   // The ZBI has space for the container and an entry with an 8-byte payload.
   single_entry_test_zbi_t zbi;
   void* payload = nullptr;
@@ -655,82 +513,54 @@
 
   // Verify the pointer points to the newly created entry payload.
   EXPECT_EQ(payload, zbi.entry_payload);
-
-  END_TEST;
 }
 
-static bool ZbiTestCreateEntryTestZbiNull() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCreateEntryTestZbiNull) {
   void* payload = nullptr;
 
   ASSERT_EQ(zbi_create_entry(nullptr, 0, 0, 0, 0, 0, &payload), ZBI_RESULT_ERROR);
-
-  END_TEST;
 }
 
-static bool ZbiTestCreateEntryTestZbiNullPayload() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCreateEntryTestZbiNullPayload) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
 
   ASSERT_EQ(zbi_create_entry(&container, 0, 0, 0, 0, 0, nullptr), ZBI_RESULT_ERROR);
-
-  END_TEST;
 }
 
-static bool ZbiTestCreateEntryTestZbiCrc32NotSupported() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCreateEntryTestZbiCrc32NotSupported) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
   void* payload = nullptr;
 
   ASSERT_EQ(zbi_create_entry(&container, 0, 0, 0, ZBI_FLAG_CRC32, 0, &payload), ZBI_RESULT_ERROR);
-
-  END_TEST;
 }
 
-static bool ZbiTestCreateEntryTestZbiNotContainer() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCreateEntryTestZbiNotContainer) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
   container.type = 0;
   void* payload = nullptr;
 
   ASSERT_EQ(zbi_create_entry(&container, 0, 0, 0, 0, 0, &payload), ZBI_RESULT_BAD_TYPE);
-
-  END_TEST;
 }
 
 // create entry tests
-static bool ZbiTestCreateEntryTestZbiCapacitySmallerThanCurrentSize() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCreateEntryTestZbiCapacitySmallerThanCurrentSize) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
   container.length = 2;
   void* payload = nullptr;
 
   ASSERT_EQ(zbi_create_entry(&container, /*capacity=*/1, 0, 0, 0, 0, &payload), ZBI_RESULT_TOO_BIG);
-
-  END_TEST;
 }
 
-static bool ZbiTestCreateEntryTestZbiFull() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCreateEntryTestZbiFull) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
   void* payload = nullptr;
 
   ASSERT_EQ(zbi_create_entry(&container, /*capacity=*/sizeof(container), 0, 0, 0,
                              /*payload_length=*/1, &payload),
             ZBI_RESULT_TOO_BIG);
-
-  END_TEST;
 }
 
-static bool ZbiTestCreateEntryTestZbiPayloadTooLarge() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCreateEntryTestZbiPayloadTooLarge) {
   single_entry_test_zbi_t zbi;
   uint32_t capacity = sizeof(zbi);
   void* payload = nullptr;
@@ -739,13 +569,9 @@
   ASSERT_EQ(zbi_create_entry(&zbi, capacity, 0, 0, 0,
                              /*payload_length=*/capacity, &payload),
             ZBI_RESULT_TOO_BIG);
-
-  END_TEST;
 }
 
-static bool ZbiTestCreateEntryWithPayloadTestZbi() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCreateEntryWithPayloadTestZbi) {
   // The ZBI will have space for the container and an entry with a small payload.
   single_entry_test_zbi_t zbi;
   uint32_t payload = 0xABCDABCD;
@@ -757,84 +583,56 @@
   // Verify the contents of the payload.
   ASSERT_BYTES_EQ(reinterpret_cast<uint8_t*>(zbi.entry_payload),
                   reinterpret_cast<uint8_t*>(&payload), sizeof(payload), "Mismatched payloads.");
-
-  END_TEST;
 }
 
-static bool ZbiTestCreateEntryWithPayloadTestZbiNull() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCreateEntryWithPayloadTestZbiNull) {
   void* payload = nullptr;
 
   ASSERT_EQ(zbi_create_entry_with_payload(nullptr, 0, 0, 0, 0, &payload, 0), ZBI_RESULT_ERROR);
-
-  END_TEST;
 }
 
-static bool ZbiTestCreateEntryWithPayloadTestZbiNullPayload() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCreateEntryWithPayloadTestZbiNullPayload) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
 
   ASSERT_EQ(zbi_create_entry_with_payload(&container, 0, 0, 0, 0, nullptr, 0), ZBI_RESULT_ERROR);
-
-  END_TEST;
 }
 
-static bool ZbiTestCreateEntryWithPayloadTestZbiCrc32NotSupported() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCreateEntryWithPayloadTestZbiCrc32NotSupported) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
   void* payload = nullptr;
 
   ASSERT_EQ(zbi_create_entry_with_payload(&container, 0, 0, 0, ZBI_FLAG_CRC32, &payload, 0),
             ZBI_RESULT_ERROR);
-
-  END_TEST;
 }
 
-static bool ZbiTestCreateEntryWithPayloadTestZbiNotContainer() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCreateEntryWithPayloadTestZbiNotContainer) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
   container.type = 0;
   void* payload = nullptr;
 
   ASSERT_EQ(zbi_create_entry_with_payload(&container, 0, 0, 0, 0, &payload, 0),
             ZBI_RESULT_BAD_TYPE);
-
-  END_TEST;
 }
 
-static bool ZbiTestCreateEntryWithPayloadTestZbiCapacitySmallerThanCurrentSize() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCreateEntryWithPayloadTestZbiCapacitySmallerThanCurrentSize) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
   container.length = 2;
   void* payload = nullptr;
 
   ASSERT_EQ(zbi_create_entry_with_payload(&container, /*capacity=*/1, 0, 0, 0, &payload, 0),
             ZBI_RESULT_TOO_BIG);
-
-  END_TEST;
 }
 
-static bool ZbiTestCreateEntryWithPayloadTestZbiSectionTooLarge() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCreateEntryWithPayloadTestZbiSectionTooLarge) {
   zbi_header_t container = ZBI_CONTAINER_HEADER(0);
   void* payload = nullptr;
 
   ASSERT_EQ(zbi_create_entry_with_payload(&container, /*capacity=*/1, 0, 0, 0, &payload,
                                           /*payload_length=*/2),
             ZBI_RESULT_TOO_BIG);
-
-  END_TEST;
 }
 
-static bool ZbiTestExtendTestZbi() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestExtendTestZbi) {
   single_entry_test_zbi_t dst_zbi;
   single_entry_test_zbi_t src_zbi;
 
@@ -847,94 +645,63 @@
   ASSERT_EQ(zbi_extend(&dst_zbi, sizeof(dst_zbi), &src_zbi), ZBI_RESULT_OK);
   ASSERT_BYTES_EQ(reinterpret_cast<uint8_t*>(dst_zbi.entry_payload),
                   reinterpret_cast<uint8_t*>(&payload), sizeof(payload), "Mismatched payload.");
-
-  END_TEST;
 }
 
-static bool ZbiTestExtendTestZbiDstNull() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestExtendTestZbiDstNull) {
   zbi_header_t zbi = ZBI_CONTAINER_HEADER(0);
 
   ASSERT_EQ(zbi_extend(nullptr, 0, &zbi), ZBI_RESULT_ERROR);
-
-  END_TEST;
 }
 
-static bool ZbiTestExtendTestZbiSrcNull() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestExtendTestZbiSrcNull) {
   zbi_header_t zbi = ZBI_CONTAINER_HEADER(0);
 
   ASSERT_EQ(zbi_extend(&zbi, 0, nullptr), ZBI_RESULT_ERROR);
-
-  END_TEST;
 }
 
-static bool ZbiTestExtendTestZbiDstNotContainer() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestExtendTestZbiDstNotContainer) {
   zbi_header_t src = ZBI_CONTAINER_HEADER(0);
   zbi_header_t dst = ZBI_CONTAINER_HEADER(0);
   dst.type = 0;
 
   ASSERT_EQ(zbi_extend(&dst, 0, &src), ZBI_RESULT_BAD_TYPE);
-
-  END_TEST;
 }
 
-static bool ZbiTestExtendTestZbiSrcNotContainer() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestExtendTestZbiSrcNotContainer) {
   zbi_header_t src = ZBI_CONTAINER_HEADER(0);
   src.type = 0;
   zbi_header_t dst = ZBI_CONTAINER_HEADER(0);
 
   ASSERT_EQ(zbi_extend(&dst, 0, &src), ZBI_RESULT_BAD_TYPE);
-
-  END_TEST;
 }
 
-static bool ZbiTestExtendTestZbiCapacitySmallerThanDstLength() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestExtendTestZbiCapacitySmallerThanDstLength) {
   zbi_header_t src = ZBI_CONTAINER_HEADER(0);
   zbi_header_t dst = ZBI_CONTAINER_HEADER(1);
 
   ASSERT_EQ(zbi_extend(&dst, 0, &src), ZBI_RESULT_TOO_BIG);
-
-  END_TEST;
 }
 
-static bool ZbiTestExtendTestZbiCapacitySmallerThanDstAlignedLength() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestExtendTestZbiCapacitySmallerThanDstAlignedLength) {
   zbi_header_t src = ZBI_CONTAINER_HEADER(0);
   zbi_header_t dst = ZBI_CONTAINER_HEADER(6);
 
   ASSERT_EQ(zbi_extend(&dst, /*capacity=*/7, &src), ZBI_RESULT_TOO_BIG);
-
-  END_TEST;
 }
 
-static bool ZbiTestExtendTestZbiSrcTooLarge() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestExtendTestZbiSrcTooLarge) {
   zbi_header_t src = ZBI_CONTAINER_HEADER(ZBI_ALIGNMENT + 1);
   zbi_header_t dst = ZBI_CONTAINER_HEADER(ZBI_ALIGNMENT);
 
   ASSERT_EQ(zbi_extend(&dst, /*capacity=*/ZBI_ALIGNMENT, &src), ZBI_RESULT_TOO_BIG);
-
-  END_TEST;
 }
 
-static bool ZbiTestBasic(void) {
-  BEGIN_TEST;
+TEST(ZbiTests, ZbiTestBasic) {
   uint8_t* test_zbi = get_test_zbi();
 
   auto cleanup = fbl::MakeAutoCall([test_zbi]() { free(test_zbi); });
 
-  ASSERT_NONNULL(test_zbi, "failed to alloc test image");
+  ASSERT_NOT_NULL(test_zbi, "failed to alloc test image");
 
   zbi::Zbi image(test_zbi);
 
@@ -951,18 +718,14 @@
   ASSERT_EQ(result, ZBI_RESULT_OK, "content check failed");
 
   ASSERT_EQ(count, 4, "bad bootdata item count");
-
-  END_TEST;
 }
 
-static bool ZbiTestBadContainer(void) {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestBadContainer) {
   uint8_t* test_zbi = get_test_zbi();
 
   auto cleanup = fbl::MakeAutoCall([test_zbi]() { free(test_zbi); });
 
-  ASSERT_NONNULL(test_zbi, "failed to alloc test image");
+  ASSERT_NOT_NULL(test_zbi, "failed to alloc test image");
 
   zbi_header_t* bootdata_header = reinterpret_cast<zbi_header_t*>(test_zbi);
   // Set to something arbitrary
@@ -976,17 +739,14 @@
   // Make sure that the diagnostic information tells us that the container is
   // bad.
   ASSERT_EQ(problem_header, bootdata_header);
-
-  END_TEST;
 }
 
-static bool ZbiTestTruncated(void) {
-  BEGIN_TEST;
+TEST(ZbiTests, ZbiTestTruncated) {
   uint8_t* test_zbi = get_test_zbi();
 
   auto cleanup = fbl::MakeAutoCall([test_zbi]() { free(test_zbi); });
 
-  ASSERT_NONNULL(test_zbi, "failed to alloc test image");
+  ASSERT_NOT_NULL(test_zbi, "failed to alloc test image");
 
   zbi::Zbi image(test_zbi);
 
@@ -998,7 +758,7 @@
 
   // zbi.Check should only give us diagnostics about the error if there was
   // an error in the first place.
-  ASSERT_NONNULL(trace, "Bad image with no trace diagnostics?");
+  ASSERT_NOT_NULL(trace, "Bad image with no trace diagnostics?");
 
   int count = 0;
   zbi_result_t result = image.ForEach(check_contents, &count);
@@ -1006,12 +766,9 @@
   ASSERT_NE(result, ZBI_RESULT_OK, "Truncated image not reported as truncated");
 
   ASSERT_EQ(count, 4, "bad bootdata item count");
-
-  END_TEST;
 }
 
-static bool ZbiTestAppend(void) {
-  BEGIN_TEST;
+TEST(ZbiTests, ZbiTestAppend) {
   // Allocate an additional kExtraBytes at the end of the ZBI to test
   // appending.
   const size_t kExtraBytes = sizeof(zbi_header_t) + sizeof(kAppendRD);
@@ -1026,7 +783,7 @@
     free(reference_zbi);
   });
 
-  ASSERT_NONNULL(test_zbi, "failed to alloc test image");
+  ASSERT_NOT_NULL(test_zbi, "failed to alloc test image");
 
   const size_t kBufferSize = sizeof(test_zbi_t) + kExtraBytes;
   zbi::Zbi image(test_zbi, kBufferSize);
@@ -1047,14 +804,10 @@
   // Verify the integrity of the data.
   reference_image->header.length = test_image->header.length;
   ASSERT_EQ(memcmp(test_zbi, reference_zbi, sizeof(test_zbi_t)), 0, "Append corrupted image");
-
-  END_TEST;
 }
 
 // Make sure we never overflow the ZBI's buffer by appending.
-static bool ZbiTestAppendFull(void) {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestAppendFull) {
   // Enough space for a small payload
   const size_t kMaxAppendPayloadSize = ZBI_ALIGN(5);
   const size_t kExtraBytes = sizeof(zbi_header_t) + kMaxAppendPayloadSize;
@@ -1063,7 +816,7 @@
 
   uint8_t* test_zbi = get_test_zbi_extra(kExtraBytes + kExtraSentinelLength);
 
-  ASSERT_NONNULL(test_zbi, "failed to alloc test image");
+  ASSERT_NOT_NULL(test_zbi, "failed to alloc test image");
 
   auto cleanup = fbl::MakeAutoCall([test_zbi] { free(test_zbi); });
 
@@ -1101,15 +854,12 @@
     ASSERT_EQ(test_zbi[kZbiSize + i], kSentinelByte,
               "corrupt sentinel bytes, append section overflowed.");
   }
-
-  END_TEST;
 }
 
 // Test that appending multiple sections to a ZBI works
-static bool ZbiTestAppendMulti(void) {
-  BEGIN_TEST;
+TEST(ZbiTests, ZbiTestAppendMulti) {
   uint8_t* reference_zbi = get_test_zbi();
-  ASSERT_NONNULL(reference_zbi);
+  ASSERT_NOT_NULL(reference_zbi);
   auto cleanup = fbl::MakeAutoCall([reference_zbi]() { free(reference_zbi); });
 
   alignas(ZBI_ALIGNMENT) uint8_t test_zbi[sizeof(test_zbi_t)];
@@ -1147,15 +897,11 @@
   ASSERT_EQ(result, ZBI_RESULT_OK);
 
   ASSERT_EQ(memcmp(reference_zbi, test_zbi, image.Length()), 0);
-
-  END_TEST;
 }
 
 constexpr size_t kTestBufferSize = 1024;
 // Test that we can initialize empty buffers as ZBI containers.
-static bool ZbiTestCppInit(void) {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCppInit) {
   std::unique_ptr<uint8_t[]> buffer;
   buffer.reset(new uint8_t[kTestBufferSize]);
 
@@ -1168,14 +914,10 @@
 
   result = image.CreateEntryWithPayload(ZBI_TYPE_CMDLINE, 0, 0, kTestCmdline, sizeof(kTestCmdline));
   ASSERT_EQ(result, ZBI_RESULT_OK);
-
-  END_TEST;
 }
 
 // Test that we don't try to create a ZBI in a container that's not big enough.
-static bool ZbiTestCppInitTooSmall(void) {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestCppInitTooSmall) {
   constexpr uint8_t kSentinel = 0xab;
 
   // If all goes well, we should never write to this buffer.
@@ -1197,16 +939,12 @@
   for (size_t i = 0; i < kTestBufferSize; i++) {
     EXPECT_EQ(buffer.get()[i], kSentinel);
   }
-
-  END_TEST;
 }
 
 // Test the happy case.
 // Make two zbi containers, extend the first by tacking the second to the back
 // of it. Observe that everything went okay.
-static bool ZbiTestExtendOkay(void) {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiTestExtendOkay) {
   // Create a dst zbi that has enough space to contain the src zbi.
   uint8_t* src_buf = get_test_zbi();
 
@@ -1232,12 +970,9 @@
 
   ASSERT_EQ(zbi_for_each(dst_buf, check_contents, &combined_sections), ZBI_RESULT_OK);
   ASSERT_EQ(src_sections + dst_sections, combined_sections);
-
-  END_TEST;
 }
 
-static bool ZbiTestNoOverflow(void) {
-  BEGIN_TEST;
+TEST(ZbiTests, ZbiTestNoOverflow) {
   constexpr size_t kBufferSize = 1024;
   constexpr size_t kUsableBufferSize = kBufferSize / 2;
   constexpr uint8_t kSentinel = 0xab;
@@ -1294,14 +1029,10 @@
             ZBI_RESULT_OK);
 
   ASSERT_NE(zbi_extend(dst_buffer, kUsableBufferSize, src_buffer), ZBI_RESULT_OK);
-
-  END_TEST;
 }
 
 #ifdef __Fuchsia__
-static bool ZbiZxTestOverflowAtPageBoundary() {
-  BEGIN_TEST;
-
+TEST(ZbiTests, ZbiZxTestOverflowAtPageBoundary) {
   // Make a VMO, and fill it with a zbi that's "kernel + data".
   constexpr size_t kInitialAlloc = 16384;
   zx_handle_t bootdata;
@@ -1351,95 +1082,5 @@
             ZBI_RESULT_OK);
   EXPECT_EQ(data.AppendSection(sizeof(append_data), ZBI_TYPE_CMDLINE, 0, 0, append_data),
             ZBI_RESULT_OK);
-
-  END_TEST;
 }
 #endif
-
-BEGIN_TEST_CASE(zbi_tests)
-RUN_TEST(ZbiTestInit)
-RUN_TEST(ZbiTestInitTooSmall)
-RUN_TEST(ZbiTestInitNotAligned)
-RUN_TEST(ZbiTestInitNullBuffer)
-
-RUN_TEST(ZbiTestCheckEmptyContainer)
-RUN_TEST(ZbiTestCheckEmptyContainerWithErr)
-RUN_TEST(ZbiTestCheckContainerBadType)
-RUN_TEST(ZbiTestCheckContainerBadTypeWithErr)
-RUN_TEST(ZbiTestCheckContainerBadExtra)
-RUN_TEST(ZbiTestCheckContainerBadMagic)
-RUN_TEST(ZbiTestCheckContainerBadVersion)
-RUN_TEST(ZbiTestCheckContainerBadCrc32)
-
-RUN_TEST(ZbiTestCheckTestZbi)
-RUN_TEST(ZbiTestCheckTestZbiWithErr)
-RUN_TEST(ZbiTestCheckTestZbiNull)
-RUN_TEST(ZbiTestCheckFirstBadEntryIsMarked)
-RUN_TEST(ZbiTestCheckTestZbiBadMagic)
-RUN_TEST(ZbiTestCheckTestZbiBadMagicWithErr)
-RUN_TEST(ZbiTestCheckTestZbiBadVersion)
-RUN_TEST(ZbiTestCheckTestZbiBadCrc32)
-RUN_TEST(ZbiTestCheckTestZbiTruncated)
-
-RUN_TEST(ZbiTestCheckCompleteTestZbi)
-RUN_TEST(ZbiTestCheckCompleteTestZbiWithErr)
-RUN_TEST(ZbiTestCheckCompleteTestZbiNull)
-RUN_TEST(ZbiTestCheckCompleteTestZbiTruncated)
-RUN_TEST(ZbiTestCheckCompleteTestZbiWrongArch)
-RUN_TEST(ZbiTestCheckCompleteTestZbiWrongArchWithErr)
-RUN_TEST(ZbiTestCheckCompleteTestZbiMissingBootfs)
-
-RUN_TEST(ZbiTestForEachTestZbiNull)
-RUN_TEST(ZbiTestForEachTestZbiNullCallback)
-RUN_TEST(ZbiTestForEachTestZbiContainer)
-RUN_TEST(ZbiTestForEachTestZbiTruncated)
-RUN_TEST(ZbiTestForEachTestZbiItems)
-RUN_TEST(ZbiTestForEachTestZbiItemsNoCookie)
-RUN_TEST(ZbiTestForEachTestZbiItemsCallbackError)
-
-RUN_TEST(ZbiTestCreateEntryTestZbi)
-RUN_TEST(ZbiTestCreateEntryTestZbiNull)
-RUN_TEST(ZbiTestCreateEntryTestZbiNullPayload)
-RUN_TEST(ZbiTestCreateEntryTestZbiCrc32NotSupported)
-RUN_TEST(ZbiTestCreateEntryTestZbiNotContainer)
-RUN_TEST(ZbiTestCreateEntryTestZbiCapacitySmallerThanCurrentSize)
-RUN_TEST(ZbiTestCreateEntryTestZbiFull)
-RUN_TEST(ZbiTestCreateEntryTestZbiPayloadTooLarge)
-
-RUN_TEST(ZbiTestCreateEntryWithPayloadTestZbi)
-RUN_TEST(ZbiTestCreateEntryWithPayloadTestZbiNull)
-RUN_TEST(ZbiTestCreateEntryWithPayloadTestZbiNullPayload)
-RUN_TEST(ZbiTestCreateEntryWithPayloadTestZbiCrc32NotSupported)
-RUN_TEST(ZbiTestCreateEntryWithPayloadTestZbiNotContainer)
-RUN_TEST(ZbiTestCreateEntryWithPayloadTestZbiCapacitySmallerThanCurrentSize)
-RUN_TEST(ZbiTestCreateEntryWithPayloadTestZbiSectionTooLarge)
-
-RUN_TEST(ZbiTestExtendTestZbi)
-RUN_TEST(ZbiTestExtendTestZbiDstNull)
-RUN_TEST(ZbiTestExtendTestZbiSrcNull)
-RUN_TEST(ZbiTestExtendTestZbiDstNotContainer)
-RUN_TEST(ZbiTestExtendTestZbiSrcNotContainer)
-RUN_TEST(ZbiTestExtendTestZbiCapacitySmallerThanDstLength)
-RUN_TEST(ZbiTestExtendTestZbiCapacitySmallerThanDstAlignedLength)
-RUN_TEST(ZbiTestExtendTestZbiSrcTooLarge)
-
-// Basic tests.
-RUN_TEST(ZbiTestBasic)
-RUN_TEST(ZbiTestBadContainer)
-RUN_TEST(ZbiTestTruncated)
-
-RUN_TEST(ZbiTestCppInit)
-RUN_TEST(ZbiTestCppInitTooSmall)
-
-// Append tests.
-RUN_TEST(ZbiTestAppend)
-RUN_TEST(ZbiTestAppendFull)
-RUN_TEST(ZbiTestAppendMulti)
-
-// Extend tests.
-RUN_TEST(ZbiTestExtendOkay)
-RUN_TEST(ZbiTestNoOverflow)
-#ifdef __Fuchsia__
-RUN_TEST(ZbiZxTestOverflowAtPageBoundary)
-#endif
-END_TEST_CASE(zbi_tests)
