-
Valide a implementação do App Intents com AppIntentsTesting
Conheça o AppIntentsTesting, um novo framework para validar o App Intents por meio da mesma infraestrutura usada pela Siri, pelo Atalhos e pelo Spotlight. Aprenda a executar intents, inspecionar resultados e testar entidades e consultas, tudo isso sem precisar de automação da interface. Descubra como verificar integrações, como anotações de visualização e indexação do Spotlight, ajudando a identificar bugs logo no início do seu fluxo de trabalho de desenvolvimento.
Capítulos
- 0:16 - Introduction
- 2:01 - Meet CometCal: your first test
- 2:29 - How AppIntentsTesting works
- 9:39 - Testing entity queries
- 13:49 - Combining multiple intents
- 16:27 - Test-only intents
- 18:22 - Testing Spotlight indexing
- 20:56 - Testing view annotations
- 24:00 - The App Intents testing workflow
- 25:19 - Next steps
Recursos
-
Buscar neste vídeo...
-
-
6:48 - Your first test: execute an intent
import AppIntentsTesting func testCreateCalendar() async throws { let definitions = IntentDefinitions(bundleIdentifier: "com.example.apple-samplecode.CometCal") let createCalendar = definitions.intents["CreateCalendarIntent"] let result = try await createCalendar.makeIntent( name: "Occupy Saturn", color: "red" ).run() XCTAssertEqual(try result.value.title, "Occupy Saturn") } -
12:25 - Test an entity string query
// Testing Entity string queries func testEventStringQuery() async throws { let results = try await eventEntityDefinition .entities(matching: "Cosmic Ray") XCTAssertEqual(results.count, 1) XCTAssertEqual(try results[0].title, "Cosmic Ray Calibration") } -
13:00 - Implement the EntityStringQuery under test
// Updated query implementation struct EventEntityQuery: EntityStringQuery { func entities(for identifiers: [EventEntity.ID]) async throws -> [EventEntity] { } func suggestedEntities() async throws -> [EventEntity] { } func entities(matching string: String) async throws -> [EventEntity] { try calendarManager.fetchEvents() .filter { $0.title.localizedCaseInsensitiveContains(string) } .map(\.entity) } } -
15:42 - Chain multiple intents in one test
// Test event creation followed by update func testCreateAndUpdateEvent() async throws { let createResult = try await createEventDefinition.makeIntent( title: "Asteroid Dodgeball Practice", startDate: Date(), isAllDay: false, calendar: "Deep Space" ).run() XCTAssertEqual(try createResult.value.title, "Asteroid Dodgeball Practice") let updateResult = try await updateEventDefinition.makeIntent( title: "Asteroid Dodgeball Rules Overview", event: createResult.value ).run() XCTAssertEqual(try updateResult.value.title, "Asteroid Dodgeball Rules Overview") } -
17:45 - Make an intent test-only
// Test-only intent: SeedSampleEventsIntent #if DEBUG struct SeedSampleEventsIntent: AppIntent { static let isDiscoverable = false func perform() async throws -> some IntentResult { // Create known list of events return .result() } } #endif -
20:27 - Test Spotlight indexing
// Testing Spotlight indexing func testNewEventIndexedInSpotlight() async throws { let before = try await eventEntityDefinition.spotlightQuery("Supernova Viewing Party") XCTAssertTrue(before.isEmpty, "Event should not exist in Spotlight yet") // ... Create "Supernova Viewing Party" Event let after = try await eventEntityDefinition.spotlightQuery("Supernova Viewing Party") XCTAssertEqual(after.count, 1) XCTAssertEqual(try after[0].title, "Supernova Viewing Party") } -
22:33 - Test view annotations
/ Testing view annotations func testEventViewAnnotation() async throws { try await openEventDefinition.makeIntent(target: "Morning Launch Briefing").run() // Confirm correct event page let app = XCUIApplication() let title = app.staticTexts["Morning Launch Briefing"] XCTAssertTrue(title.waitForExistence(timeout: 5)) let annotations = try await eventEntityDefinition.viewAnnotations() XCTAssertEqual(annotations.count, 1, "Expected exactly one view annotation") XCTAssertEqual(try annotations[0].entity.title, "Morning Launch Briefing") }
-
-
- 0:16 - Introduction
AppIntentsTesting, a new framework for testing App Intents, which power Siri, Shortcuts, Spotlight, and Widgets. Outlines the agenda: getting started, framework overview, testing intents and entities, and system integrations.
- 2:01 - Meet CometCal: your first test
Introduces the CometCal sample calendar app and writes a first test for CreateCalendarIntent: create a UI testing bundle, build an IntentDefinitions from the bundle id, call makeIntent with parameters, run() it on-device, and assert on the returned entity via dynamic member lookup.
- 2:29 - How AppIntentsTesting works
An integration testing framework that runs your tests in a standard XCUITest bundle while the app runs in a separate process, executing intents through the full App Intents stack, with no mocks and no app-code imports (just a bundle id), giving stable, CI-friendly tests.
- 9:39 - Testing entity queries
Test-driven development of an EntityStringQuery: call entities(matching:) on the entity definition, watch it fail, implement the entities(matching:) conformance on EventEntityQuery, and rerun to green, verified against Shortcuts on device.
- 13:49 - Combining multiple intents
Chain intents in one test as people compose Shortcuts: run CreateEventIntent (with the runtime resolving a CalendarEntity from a string), then pass the returned EventEntity straight into UpdateEventIntent and assert the updated title.
- 16:27 - Test-only intents
Focused intents that exist only for tests, to seed known state, jump directly to a view, or wrap not-yet-adopted functionality. Make any intent test-only with isDiscoverable: false and an #if DEBUG guard.
- 18:22 - Testing Spotlight indexing
Write a regression test for Spotlight: spotlightQuery() returns nothing before the event exists, create it with CreateEventIntent, then assert exactly one indexed result, catching the real bug where indexing was commented out.
- 20:56 - Testing view annotations
Verify the entity Siri sees on screen: open an event via OpenEventIntent, use XCUI to confirm the page, call viewAnnotations(), and assert the single ViewAnnotation's entity, surfacing a bug where the wrong EntityIdentifier (calendar id) was used.
- 24:00 - The App Intents testing workflow
Where AppIntentsTesting fits: unit-test the fundamental types (actions, data, queries) first, then integration-test deeper system reaches (view annotations, Spotlight, cross-app), and still test manually with Siri and Shortcuts.
- 25:19 - Next steps
Download the CometCal sample project and its full test suite, consult the AppIntentsTesting documentation for the complete API, and explore the talk on building Siri experiences with App Intents.