Lliçó 9 de 10 · 11 min de lectura · Revisada el 26/10/2026
L'accessibilitat en el flux de desenvolupament: components, previsualitzacions i proves automatitzades
Estàs llegint una lliçó oberta. Matricula't per fer els tests i els exercicis, desar el teu progrés i aconseguir el certificat.
Matricula-m'hi · nivell 6 (119 €)Tot el que has après en aquest curs es perd a l'sprint següent si ningú no ho protegeix: un component nou sense etiqueta, una refactorització que fixa l'alçada d'una cel·la, una biblioteca actualitzada que deixa d'anunciar el canvi de pantalla. Aquesta lliçó se centra en la feina diària de l'equip de desenvolupament: construir una capa de components que faci difícil equivocar-se, revisar l'accessibilitat mentre es programa i automatitzar les comprovacions a les proves d'iOS, Android, React Native i Flutter. L'auditoria formal d'aplicacions, amb Accessibility Inspector, Accessibility Scanner i el protocol de proves manuals, la veuràs al curs «Avaluació d'aplicacions mòbils» d'aquest mateix nivell.
Components que obliguen a fer-ho bé
A la lliçó d'aplicacions híbrides es recomanava una capa de components accessibles pròpia. La versió més eficaç d'aquesta idea és dissenyar les signatures dels components perquè l'error no compili: si el nom accessible és un paràmetre obligatori, ningú no el pot oblidar.
// Compose: el botó d'icona exigeix una descripció
@Composable
fun BotonIcono(icono: ImageVector, descripcion: String, onClick: () -> Unit) {
IconButton(onClick = onClick) { // rol de botó i 48 dp de sèrie
Icon(icono, contentDescription = descripcion)
}
}
// SwiftUI: el títol és obligatori encara que només es vegi la icona
struct BotonIcono: View {
let titulo: LocalizedStringKey
let simbolo: String
let accion: () -> Void
var body: some View {
Button(action: accion) { Label(titulo, systemImage: simbolo) }
.labelStyle(.iconOnly) // el títol continua sent el nom accessible
}
} Aplica la mateixa idea a la fila de llista (nom compost i accions com a paràmetres), a la capçalera de secció (que sempre marca l'encapçalament), al camp de formulari (etiqueta visible obligatòria, propòsit de l'entrada i missatge d'error) i al diàleg (títol obligatori i focus gestionat). Documenta a cada component què garanteix i què queda en mans de qui el fa servir.
Punt clau
Un component ben dissenyat corregeix cent pantalles alhora; un component mal dissenyat propaga el mateix error a totes. Per això la revisió d'accessibilitat més rendible és la de la biblioteca de components, abans que es faci servir.
Revisar mentre programes: anàlisi estàtica i previsualitzacions
L'anàlisi estàtica detecta omissions evidents sense executar l'aplicació:
- Android Lint inclou comprovacions d'accessibilitat com
ContentDescription(imatge sense descripció),ClickableViewAccessibility,KeyboardInaccessibleWidgetiLabelFor. Eleva-les a error a la configuració del projecte perquè bloquegin la integració. - SwiftLint ofereix regles opcionals com
accessibility_label_for_imageiaccessibility_trait_for_buttonper a SwiftUI. - React Native: eslint-plugin-react-native-a11y, que ja vas conèixer a la lliçó d'aplicacions híbrides.
Les previsualitzacions permeten veure cada pantalla amb text gran o contrast augmentat sense obrir el simulador:
// SwiftUI
#Preview("Text AX5") {
FichaCita(cita: .ejemplo)
.environment(\.dynamicTypeSize, .accessibility5)
}
// Compose: diverses escales de lletra en una sola anotació
@PreviewFontScale
@Composable
fun FichaCitaPreview() { FichaCita(cita = citaEjemplo) }
@Preview(fontScale = 2f, uiMode = Configuration.UI_MODE_NIGHT_YES)
@Composable
fun FichaCitaGrandeOscuroPreview() { FichaCita(cita = citaEjemplo) } Durant l'execució, el panell Environment Overrides de Xcode canvia al moment Dynamic Type, Augmentar el contrast o Text en negreta, i el mode UI Check de les previsualitzacions de Compose a Android Studio assenyala problemes d'accessibilitat i d'adaptació. Són revisions de minuts que detecten textos truncats i contrastos insuficients abans d'arribar a les proves.
Infografia · Nivells
Capes de protecció de l'accessibilitat en una aplicació
De la base, que prevé errors, al cim, que confirma l'experiència real
- Nivell 1 (base): Components accessiblesEl botó, el camp, la fila i la capçalera ja porten nom, rol, estat i 48 dp
- Nivell 2: Anàlisi estàticaAndroid Lint, SwiftLint i eslint detecten etiquetes i rols absents
- Nivell 3: PrevisualitzacionsText gran, mode fosc i contrast a cada pantalla abans d'executar
- Nivell 4: Proves de semànticaTests que verifiquen el nom, el rol, l'estat i les accions de cada component
- Nivell 5: Auditoria a les proves d'UIperformAccessibilityAudit, AccessibilityChecks i les guies de Flutter a la CI
- Nivell 6 (cim): Proves manualsVoiceOver, TalkBack, Switch i teclat en dispositiu real, i usuaris
Llegir la infografia com a text
Sis capes apilades, de la base al cim, que protegeixen l'accessibilitat d'una aplicació durant el seu desenvolupament. Base, components accessibles: el botó, el camp, la fila i la capçalera ja porten nom, rol, estat i 48 dp. Segona capa, anàlisi estàtica: Android Lint, SwiftLint i eslint detecten etiquetes i rols absents. Tercera, previsualitzacions: cada pantalla es revisa amb text gran, mode fosc i contrast abans d'executar-la. Quarta, proves de semàntica: tests que verifiquen el nom, el rol, l'estat i les accions. Cinquena, auditories a les proves d'interfície: performAccessibilityAudit, AccessibilityChecks i les guies de Flutter a la integració contínua. Cim, proves manuals amb VoiceOver, TalkBack, Switch Access i teclat en dispositiu real, i amb persones usuàries. Cada capa detecta el que les inferiors no poden veure.
Proves de semàntica
Una prova de semàntica comprova que un component exposa el nom, el rol, l'estat i les accions que ha d'exposar. És ràpida, estable i documenta el comportament esperat.
// Compose
@get:Rule val compose = createComposeRule()
@Test fun botonBuscarTieneNombreRolYAccion() {
compose.setContent { BarraSuperior() }
compose.onNodeWithContentDescription("Cerca")
.assertHasClickAction()
.assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Button))
compose.onNodeWithText("Moviments de març")
.assert(SemanticsMatcher.keyIsDefined(SemanticsProperties.Heading))
}
// React Native Testing Library
expect(screen.getByRole('button', { name: 'Cerca' })).toBeOnTheScreen();
// Flutter: cerca per etiqueta semàntica
expect(find.bySemanticsLabel('Cerca'), findsOneWidget); A iOS, les proves d'UI localitzen els elements per mitjà de la informació d'accessibilitat: app.buttons["Cerca"] busca un botó pel seu identificador o la seva etiqueta, i pots comprovar que label té el valor esperat.
Error freqüent
Perquè les proves d'UI trobin els elements, algú assigna als botons etiquetes com "btn_buscar_test". Les proves passen i VoiceOver llegeix «btn buscar test». Per localitzar elements a les proves fes servir accessibilityIdentifier a iOS, testTag a Compose o testID a React Native, que no s'anuncien; reserva l'etiqueta per al nom que ha de sentir la persona, i comprova-la al test.
Auditories automàtiques dins de les proves d'UI
Les plataformes permeten executar comprovacions automàtiques d'accessibilitat sobre cada pantalla que recorren les proves:
// iOS 17 / Xcode 15: auditoria de la pantalla actual
func testAuditoriaMisCitas() throws {
let app = XCUIApplication()
app.launch()
app.buttons["Les meves cites"].tap()
try app.performAccessibilityAudit(for: [.dynamicType, .contrast, .hitRegion,
.sufficientElementDescription, .textClipped]) { incidencia in
// Retorna true només per a les incidències revisades i documentades
incidencia.auditType == .contrast && incidencia.element?.identifier == "logo-municipal"
}
}
// Android amb Espresso: comprovacions de l'Accessibility Test Framework a cada acció
@BeforeClass @JvmStatic
fun activarComprobaciones() {
AccessibilityChecks.enable().setRunChecksFromRootView(true)
}
// Flutter: guies incloses a flutter_test
testWidgets('la pantalla de cites compleix les guies bàsiques', (tester) async {
final handle = tester.ensureSemantics();
await tester.pumpWidget(const MiApp());
await expectLater(tester, meetsGuideline(androidTapTargetGuideline));
await expectLater(tester, meetsGuideline(labeledTapTargetGuideline));
await expectLater(tester, meetsGuideline(textContrastGuideline));
handle.dispose();
}); Les versions recents de la biblioteca de proves de Compose permeten activar també les comprovacions de l'Accessibility Test Framework; consulta la documentació de la teva versió. Aquestes auditories detecten elements sense descripció, objectius tàctils petits, contrast insuficient o text retallat amb text gran. No detecten si una etiqueta és correcta, si l'ordre de lectura té sentit, si el focus torna al lloc adequat en tancar un diàleg ni si una tasca completa es pot dur a terme: com vas veure al curs d'eines automàtiques del nivell 4, l'automatització cobreix només una part dels problemes.
Criteris d'acceptació i definició de fet
L'automatització se sosté amb acords d'equip. Inclou a la definició de fet de cada història amb interfície uns pocs criteris verificables:
- Recorregut complet de la funcionalitat amb VoiceOver i TalkBack en dispositiu real, sense elements muts ni duplicats.
- Pantalles revisades amb el text al màxim i amb text en negreta, sense truncaments.
- Gestos amb alternativa i accions d'accessibilitat; objectius de 44 pt o 48 dp.
- Focus gestionat als canvis de pantalla, als diàlegs i als errors.
- Proves de semàntica i auditoria automàtica en verd a la integració contínua.
Prova-ho tu
Si tens accés al codi d'una aplicació, executa Android Lint o SwiftLint amb les regles d'accessibilitat activades i compta els advertiments. Si no, obre una previsualització o el simulador amb la mida de text més gran i anota quantes pantalles trunquen textos. Aquest nombre és un bon punt de partida per a la teva primera definició de fet.
Resum
- Dissenya components les signatures dels quals exigeixin el nom accessible, l'etiqueta visible i el títol: l'error deixa de compilar.
- Fes servir l'anàlisi estàtica (Android Lint, SwiftLint, eslint) i previsualitzacions amb text gran i contrast mentre programes.
- Les proves de semàntica verifiquen el nom, el rol, l'estat i les accions; localitza els elements amb identificadors de prova, mai amb etiquetes falses.
performAccessibilityAudit,AccessibilityChecksi les guies deflutter_testautomatitzen comprovacions a cada pantalla, però no substitueixen la prova manual.- Una definició de fet amb criteris d'accessibilitat verificables protegeix la feina a cada lliurament.
Portes 2 lliçons d'aquest curs: que no es perdin
Crea el teu compte i desa el que ja has llegit i segueix el curs amb tot:
- El test d'aquesta lliçó (3 preguntes) per comprovar el que has après
- Exercicis pràctics amb pàgines reals
- El teu progrés desat: continues on ho vas deixar, des de qualsevol dispositiu
- Constància del curs amb les hores i certificat del nivell 6 quan aprovis l'examen
Entres amb el teu compte de Google o només amb el teu correu electrònic. No cal contrasenya.
Matricula-m'hi · nivell 6 (119 €)