diff --git a/FirebaseAI/Tests/TestApp/Resources/TestApp.entitlements b/FirebaseAI/Tests/TestApp/Resources/TestApp.entitlements
index ee95ab7e582..225aa48bc8c 100644
--- a/FirebaseAI/Tests/TestApp/Resources/TestApp.entitlements
+++ b/FirebaseAI/Tests/TestApp/Resources/TestApp.entitlements
@@ -6,5 +6,7 @@
 	
 	com.apple.security.network.client
 	
+	keychain-access-groups
+	
 
 
diff --git a/FirebaseAI/Tests/TestApp/Tests/Integration/ServerPromptTemplateIntegrationTests.swift b/FirebaseAI/Tests/TestApp/Tests/Integration/ServerPromptTemplateIntegrationTests.swift
index deaa0985310..b9c266f7ca3 100644
--- a/FirebaseAI/Tests/TestApp/Tests/Integration/ServerPromptTemplateIntegrationTests.swift
+++ b/FirebaseAI/Tests/TestApp/Tests/Integration/ServerPromptTemplateIntegrationTests.swift
@@ -12,19 +12,25 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-import XCTest
-
 import FirebaseAI
-
-final class ServerPromptTemplateIntegrationTests: XCTestCase {
-  override func setUp() {
-    super.setUp()
-    continueAfterFailure = false
-  }
-
-  func testGenerateContentWithText() async throws {
-    let model = FirebaseAI.firebaseAI(backend: .vertexAI(location: "global"))
-      .templateGenerativeModel()
+import Testing
+#if canImport(UIKit)
+  import UIKit
+#endif
+
+struct ServerPromptTemplateIntegrationTests {
+  private static let testConfigs: [InstanceConfig] = [
+    .vertexAI_v1beta,
+    .vertexAI_v1beta_global,
+  ]
+  private static let imageGenerationTestConfigs: [InstanceConfig] = [.vertexAI_v1beta]
+
+  @Test(arguments: [
+    // The "greeting2" template is only available in the `global` location.
+    InstanceConfig.vertexAI_v1beta_global,
+  ])
+  func generateContentWithText(_ config: InstanceConfig) async throws {
+    let model = FirebaseAI.componentInstance(config).templateGenerativeModel()
     let userName = "paul"
     let response = try await model.generateContent(
       template: "greeting2",
@@ -33,12 +39,13 @@ final class ServerPromptTemplateIntegrationTests: XCTestCase {
         "language": "Spanish",
       ]
     )
-    let text = try XCTUnwrap(response.text)
-    XCTAssert(text.contains("Paul"))
+    let text = try #require(response.text)
+    #expect(text.contains("Paul"))
   }
 
-  func testGenerateContentStream() async throws {
-    let model = FirebaseAI.firebaseAI(backend: .vertexAI()).templateGenerativeModel()
+  @Test(arguments: testConfigs)
+  func generateContentStream(_ config: InstanceConfig) async throws {
+    let model = FirebaseAI.componentInstance(config).templateGenerativeModel()
     let userName = "paul"
     let stream = try model.generateContentStream(
       template: "greeting.prompt",
@@ -53,11 +60,12 @@ final class ServerPromptTemplateIntegrationTests: XCTestCase {
         resultText += text
       }
     }
-    XCTAssert(resultText.contains("Paul"))
+    #expect(resultText.contains("Paul"))
   }
 
-  func testGenerateImages() async throws {
-    let imagenModel = FirebaseAI.firebaseAI(backend: .vertexAI()).templateImagenModel()
+  @Test(arguments: imageGenerationTestConfigs)
+  func generateImages(_ config: InstanceConfig) async throws {
+    let imagenModel = FirebaseAI.componentInstance(config).templateImagenModel()
     let imagenPrompt = "A cat picture"
     let response = try await imagenModel.generateImages(
       template: "generate_images.prompt",
@@ -65,13 +73,17 @@ final class ServerPromptTemplateIntegrationTests: XCTestCase {
         "prompt": imagenPrompt,
       ]
     )
-    XCTAssertEqual(response.images.count, 3)
+    #expect(response.images.count == 3)
   }
 
-  func testGenerateContentWithMedia() async throws {
-    let model = FirebaseAI.firebaseAI(backend: .vertexAI()).templateGenerativeModel()
-    let image = UIImage(systemName: "photo")!
-    if let imageBytes = image.jpegData(compressionQuality: 0.8) {
+  #if canImport(UIKit)
+    @Test(arguments: testConfigs)
+    func generateContentWithMedia(_ config: InstanceConfig) async throws {
+      let model = FirebaseAI.componentInstance(config).templateGenerativeModel()
+      let image = UIImage(systemName: "photo")!
+      let imageBytes = try #require(
+        image.jpegData(compressionQuality: 0.8), "Could not get image data."
+      )
       let base64Image = imageBytes.base64EncodedString()
 
       let response = try await model.generateContent(
@@ -84,16 +96,19 @@ final class ServerPromptTemplateIntegrationTests: XCTestCase {
           ],
         ]
       )
-      XCTAssert(response.text?.isEmpty == false)
-    } else {
-      XCTFail("Could not get image data.")
+      let text = try #require(response.text)
+      #expect(!text.isEmpty)
     }
-  }
-
-  func testGenerateContentStreamWithMedia() async throws {
-    let model = FirebaseAI.firebaseAI(backend: .vertexAI()).templateGenerativeModel()
-    let image = UIImage(systemName: "photo")!
-    if let imageBytes = image.jpegData(compressionQuality: 0.8) {
+  #endif // canImport(UIKit)
+
+  #if canImport(UIKit)
+    @Test(arguments: testConfigs)
+    func generateContentStreamWithMedia(_ config: InstanceConfig) async throws {
+      let model = FirebaseAI.componentInstance(config).templateGenerativeModel()
+      let image = UIImage(systemName: "photo")!
+      let imageBytes = try #require(
+        image.jpegData(compressionQuality: 0.8), "Could not get image data."
+      )
       let base64Image = imageBytes.base64EncodedString()
 
       let stream = try model.generateContentStream(
@@ -112,14 +127,13 @@ final class ServerPromptTemplateIntegrationTests: XCTestCase {
           resultText += text
         }
       }
-      XCTAssert(resultText.isEmpty == false)
-    } else {
-      XCTFail("Could not get image data.")
+      #expect(!resultText.isEmpty)
     }
-  }
+  #endif // canImport(UIKit)
 
-  func testChat() async throws {
-    let model = FirebaseAI.firebaseAI(backend: .vertexAI()).templateGenerativeModel()
+  @Test(arguments: testConfigs)
+  func chat(_ config: InstanceConfig) async throws {
+    let model = FirebaseAI.componentInstance(config).templateGenerativeModel()
     let initialHistory = [
       ModelContent(role: "user", parts: "Hello!"),
       ModelContent(role: "model", parts: "Hi there! How can I help?"),
@@ -132,13 +146,16 @@ final class ServerPromptTemplateIntegrationTests: XCTestCase {
       userMessage,
       variables: ["message": userMessage]
     )
-    XCTAssert(response.text?.isEmpty == false)
-    XCTAssertEqual(chatSession.history.count, 4)
-    XCTAssertEqual((chatSession.history[2].parts.first as? TextPart)?.text, userMessage)
+    let text = try #require(response.text)
+    #expect(!text.isEmpty)
+    #expect(chatSession.history.count == 4)
+    let textPart = try #require(chatSession.history[2].parts.first as? TextPart)
+    #expect(textPart.text == userMessage)
   }
 
-  func testChatStream() async throws {
-    let model = FirebaseAI.firebaseAI(backend: .vertexAI()).templateGenerativeModel()
+  @Test(arguments: testConfigs)
+  func chatStream(_ config: InstanceConfig) async throws {
+    let model = FirebaseAI.componentInstance(config).templateGenerativeModel()
     let initialHistory = [
       ModelContent(role: "user", parts: "Hello!"),
       ModelContent(role: "model", parts: "Hi there! How can I help?"),
@@ -157,8 +174,9 @@ final class ServerPromptTemplateIntegrationTests: XCTestCase {
         resultText += text
       }
     }
-    XCTAssert(resultText.isEmpty == false)
-    XCTAssertEqual(chatSession.history.count, 4)
-    XCTAssertEqual((chatSession.history[2].parts.first as? TextPart)?.text, userMessage)
+    #expect(!resultText.isEmpty)
+    #expect(chatSession.history.count == 4)
+    let textPart = try #require(chatSession.history[2].parts.first as? TextPart)
+    #expect(textPart.text == userMessage)
   }
 }