Detox est un framework de tests E2E gray-box pour applications mobiles, créé par l’équipe Wix spécifiquement pour les projets React Native. Contrairement aux approches black-box, Detox a accès à l’état interne de l’application, ce qui permet une synchronisation automatique sans délais manuels. Selon Wix Engineering, 2026, la synchronisation automatique réduit le temps d’exécution des tests de 40% par rapport aux pauses traditionnelles.
Points clés
Detox est un framework de tests de bout en bout (E2E) pour applications mobiles, développé par Wix en 2017. Il est conçu pour les projets React Native mais prend également en charge les applications purement natives sur iOS et Android. Detox fonctionne selon un modèle gray-box, ce qui signifie qu’il a accès aux mécanismes internes de l’application.
La principale différence entre Detox et Appium ou Calabash est la synchronisation automatique avec l’application. Le framework attend la fin des animations, des requêtes réseau et du traitement des événements avant d’exécuter l’action suivante. Cela élimine complètement le besoin de Thread.sleep() ou waitForElement, qui ralentissent les tests.
Detox prend en charge iOS (via XCTest et Xcode) et Android (via Espresso et UI Automator). Pour les applications React Native, une prise en charge complète est fournie pour Fabric et l’ancienne architecture. Sur iOS, les tests s’exécutent sur le simulateur ; sur Android, sur l’émulateur ou un appareil réel.
L’architecture de Detox se compose de trois composants clés : Detox CLI, l’exécuteur de tests Detox et Detox Native Driver. Detox CLI gère la compilation, l’installation et l’exécution des tests de l’application. L’exécuteur de tests (Jest ou Mocha) exécute les scénarios de test et communique avec l’application via WebSocket.
Les tests gray-box signifient que Detox a accès à l’état interne de l’application via un pont natif. Le framework surveille les requêtes réseau, les animations, les temporisateurs et la file d’opérations. Lorsque toutes les files sont vides, Detox considère l’application prête pour l’étape suivante.
La synchronisation est basée sur la surveillance du thread principal de l’application. Detox attend que toutes les animations soient terminées, que les requêtes HTTP aient renvoyé des réponses et que les gestionnaires d’événements aient fini de s’exécuter. Si un test se bloque à cause d’une animation infinie, vous pouvez désactiver manuellement la synchronisation pour un bloc de code spécifique.
// Désactiver la synchronisation pour une section problématique
await device.disableSynchronization();
// Action avec animation longue
await element(by.id('loader')).swipe('down');
await device.enableSynchronization();
L’installation de Detox commence par l’ajout du package via npm ou yarn. Après l’installation, vous devez créer un fichier de configuration .detoxrc.js, qui décrit les paramètres de compilation et d’exécution pour chaque plateforme. Detox utilise son propre type de compilation pour iOS, basé sur la configuration Xcode.
La configuration inclut le chemin vers l’application (app), le type de compilateur (build), les arguments de compilation et les paramètres de l’appareil (device). Pour iOS, appleSimulator est utilisé ; pour Android, androidEmulator. Vous pouvez également spécifier des arguments de lancement comme la langue ou la région du simulateur.
// .detoxrc.js — exemple de configuration
module.exports = {
testRunner: { args: { '$0': 'jest', config: 'e2e/config.json' } },
apps: {
'ios.debug': { type: 'ios.app', build: 'xcodebuild ...' },
'android.debug': { type: 'android.apk', build: 'cd android && ./gradlew ...' }
},
devices: {
simulator: { type: 'ios.simulator', device: { type: 'iPhone 15' } },
emulator: { type: 'android.emulator', device: { avdName: 'Pixel_4_API_34' } }
}
};
Après la configuration, les commandes suivantes sont disponibles : detox build — compile l’application avec les flags de test, et detox test — exécute les tests. Detox prend en charge l’exécution parallèle sur plusieurs appareils via le flag --workers.
Les tests Detox sont écrits en JavaScript ou TypeScript avec une API basée sur la recherche d’éléments (matchers) et les actions (actions). Les matchers permettent de trouver un élément par identifiant, texte, type ou position sur l’écran. Les actions effectuent des tap, saisie de texte, swipe et scroll.
Un test typique suit cette séquence : trouver un élément → effectuer une action → vérifier le résultat. Pour les vérifications, l’API expect est utilisée avec des matchers de présence, visibilité ou texte de l’élément. Detox prend en charge la syntaxe describe/it via l’intégration avec Jest.
describe('Login flow', () => {
beforeEach(async () => {
await device.reloadReactNative();
});
it('should log in with valid credentials', async () => {
await element(by.id('emailInput')).typeText('user@test.com');
await element(by.id('passwordInput')).typeText('password123');
await element(by.id('loginButton')).tap();
await expect(element(by.id('homeScreen'))).toBeVisible();
});
});
Detox prend en charge tous les gestes populaires : tap, longPress, swipe, scroll, pinch, multiTap. Pour scroll, vous pouvez spécifier la direction, la vitesse et la position d’arrêt. Cela permet de tester des scénarios complexes comme le pull-to-refresh ou les carrousels.
Detox s’intègre bien avec les systèmes CI populaires : GitHub Actions, CircleCI, Bitrise et Jenkins. Pour l’exécution dans CI, vous devez configurer un simulateur iOS virtuel (sans interface graphique) et un émulateur Android avec accélération matérielle. Detox fournit des artefacts — captures d’écran et journaux — pour analyser les tests échoués.
Pour accélérer l’exécution des tests dans CI, il est recommandé d’utiliser le sharding (parallélisation) avec le flag --workers. Detox distribue automatiquement les fichiers de test entre plusieurs simulateurs. Il est également utile de mettre en cache les compilations de l’application entre les exécutions pour réduire le temps de compilation.
# GitHub Actions — exécuter Detox sur iOS
- name: Install Dependencies
run: npm ci
- name: Build Detox App
run: npx detox build --configuration ios.sim
- name: Run Detox Tests
run: npx detox test --configuration ios.sim --workers 2
timeout-minutes: 30
Pour des tests E2E stables et rapides, il est recommandé de suivre plusieurs règles. Évitez sleep() — Detox fournit une synchronisation automatique, et les délais explicites ne font que ralentir les tests et les rendre instables. Si un test échoue en raison de problèmes de temporisation, vérifiez d’abord si la synchronisation est désactivée. Il est également utile de regrouper les tests par fonctionnalité et de les exécuter indépendamment — cela simplifie la recherche de la cause de l’échec.
Detox fournit plusieurs méthodes device pour la gestion d’état : device.reloadReactNative() recharge le bundle, device.launchNewApp() lance l’application avec de nouveaux paramètres, device.sendToHome() minimise l’application. device.setURLBlacklist() permet d’exclure certaines URL de la synchronisation, ce qui est utile pour les analyses et les connexions long-polling.
Pour chaque test, il est recommandé de créer un état isolé. Utilisez beforeEach pour recharger l’application via device.reloadReactNative(). Pour les tests nécessitant des données spécifiques, créez des fabriques ou des clients API pour préparer les données sur le serveur. Évitez les dépendances entre les tests — chaque test doit être indépendant.
Detox prend en charge les tests WebView via les méthodes web.element() et web.invoke(). Pour interagir avec les éléments web, by.web](:id, css ou className est utilisé. Il est important de se rappeler que WebView nécessite un temps de chargement supplémentaire — si la synchronisation ne fonctionne pas, ajoutez une attente de chargement avec waitFor.
// Test WebView dans Detox
const webView = web(by.id('webview'));
await webView.element(by.web.cssSelector('#submit-btn')).tap();
const result = await webView.element(
by.web.cssSelector('.result-text')
).getText();
await expect(result).toEqual('Success');
Detox prend en charge la comparaison de captures d’écran via le plugin detox-image-matching. Les captures d’écran permettent de détecter les régressions visuelles : éléments déplacés, couleurs incorrectes, icônes manquantes. Pour des captures stables, désactivez les animations et utilisez une taille de simulateur fixe.
Les problèmes les plus courants de Detox sont liés à la synchronisation : animations infinies, longues requêtes réseau ou temporisateurs bloqués. La journalisation avec le flag --loglevel trace montre les ressources que Detox attend. Si Detox se bloque, utilisez device.disableSynchronization() pour le bloc de code problématique.
Sur le simulateur iOS, Detox nécessite que l’application soit d’abord compilée via xcodebuild avec la configuration iphonesimulator. Une erreur courante est d’utiliser un schéma Release au lieu de Debug, ce qui désactive les flags de test. Pour Android, assurez-vous que l’AVD a été créé avec une API compatible avec votre application et que l’accélération Intel HAXM est activée. Pour les environnements CI sur macOS, il est pratique d’utiliser GitHub Actions avec un runner macOS, où Xcode et les simulateurs sont déjà préinstallés.
Si les tests échouent régulièrement en raison d’un délai d’attente, vérifiez : si la synchronisation est désactivée globalement, si setTimeout ou setInterval sont utilisés dans le code de l’application sans nettoyage, et si le thread principal est bloqué par une opération longue. Parfois, l’augmentation du délai d’attente dans detoxrc.js via testRunner.args.jest.$.testTimeout aide. Pour trouver les zones à problème, activez la journalisation de trace de Detox — elle montre les ressources et temporisateurs que le framework attend actuellement.
Après l’exécution des tests, Detox crée des artefacts : captures d’écran des tests échoués, journaux d’application et rapports XML JUnit. Les captures d’écran sont prises automatiquement en cas d’échec d’un test et aident à identifier visuellement le problème. Pour CI, les artefacts sont téléchargés dans le stockage cloud et disponibles via une interface web pour analyser les causes de l’échec.
Questions fréquentes
Detox utilise une approche gray-box avec accès à l’état interne de l’application et synchronisation automatique. Appium fonctionne selon un modèle black-box via WebDriver et nécessite des attentes manuelles. Detox est plus rapide et plus stable pour les projets React Native.
Les tests Detox sont écrits en JavaScript ou TypeScript. Le framework s’intègre avec Jest et Mocha comme exécuteurs de tests. Le moteur natif pour iOS est écrit en Swift, pour Android en Kotlin et Java.
Oui, Detox prend en charge les applications natives sur iOS (via XCTest) et Android (via Espresso). Cependant, le principal public de Detox est les développeurs React Native, car il existe des solutions plus matures pour les projets natifs.
Detox fournit des artefacts : captures d’écran, journaux d’application et rapports HTML. Pour le débogage local, utilisez le flag --loglevel trace, et pour CI, un collecteur d’artefacts automatique avec téléchargement cloud.
C’est une méthode de l’API Detox qui recharge le bundle JavaScript de React Native sans réinstaller l’application. Elle est utilisée dans beforeEach pour réinitialiser l’état de l’application vers l’écran initial avant chaque test.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi