Detox: ano ito, mga prinsipyo ng paggana at E2E-testing

May-akda: IT Sectr Nai-publish: 2026-04-09 Oras ng pagbabasa: 8 min

Ang Detox ay isang framework para sa gray-box E2E-testing ng mga mobile application, na ginawa ng Wix team para sa React Native projects. Hindi tulad ng black-box approach, ang Detox ay may access sa internal state ng application, na nagbibigay-daan sa awtomatikong pag-sync nang walang manual timeout. Ayon sa datos ng Wix Engineering, 2026, ang awtomatikong pag-sync ay nagbabawas ng oras ng pagtakbo ng test ng 40% kumpara sa tradisyonal na pag-pause.

Mga pangunahing punto

  • Detox — gray-box E2E-framework para sa React Native at native na application
  • Awtomatikong pag-sync ay nag-aalis ng pangangailangan para sa manual na pagkaantala at sleep calls
  • Test ay isinusulat sa JavaScript o TypeScript gamit ang matcher at action API
  • Pagpapatakbo ay posible sa iOS simulator at Android emulator o device
  • Integrasyon ng CI/CD ay ginagawa sa pamamagitan ng Detox CLI at config file

Ano ang Detox

Detox ay isang framework para sa komprehensibong (E2E) testing ng mobile application, na binuo ng Wix noong 2017. Ito ay para sa React Native projects, ngunit sumusuporta rin sa purong native application sa iOS at Android. Gumagana ang Detox sa gray-box model, ibig sabihin ay may access ito sa internal na mekanismo ng application.

Pagkakaiba sa ibang E2E-framework

Ang pangunahing pagkakaiba ng Detox sa Appium o Calabash ay awtomatikong pag-sync sa application. Hinihintay ng framework ang pagkumpleto ng animation, network request, at pagproseso ng event bago isagawa ang susunod na aksyon. Ito ay ganap na nag-aalis ng pangangailangan para sa Thread.sleep() o waitForElement na nagpapabagal sa test.

Mga sinusuportahang platform

Sinusuportahan ng Detox ang iOS (sa pamamagitan ng XCTest at Xcode) at Android (sa pamamagitan ng Espresso at UI Automator). Para sa React Native application, buong suporta ay ibinibigay para sa Fabric at lumang arkitektura. Sa iOS, test ay pinapatakbo sa simulator, sa Android — sa emulator o aktwal na device.

Arkitektura ng Detox at gray-box model

Ang arkitektura ng Detox ay binubuo ng tatlong pangunahing component: Detox CLI, Detox test runner, at Detox Native Driver. Detox CLI ay namamahala sa pagbuo ng application, pag-install, at pagpapatakbo ng test. Ang test runner (Jest o Mocha) ay nagpapatupad ng test scenario at nakikipag-ugnayan sa application sa pamamagitan ng WebSocket.

Gray-box approach

Ang gray-box testing ay nangangahulugan na ang Detox ay may access sa internal state ng application sa pamamagitan ng native bridge. Sinusubaybayan ng framework ang network request, animation, timer, at operation queue. Kapag ang lahat ng queue ay walang laman — itinuturing ng Detox na handa na ang application para sa susunod na hakbang.

Mekanismo ng pag-sync

Ang pag-sync ay batay sa pagsubaybay sa main thread ng application. Hinihintay ng Detox ang pagkumpleto ng lahat ng animation, pagbalik ng HTTP request, at pag-execute ng event handler. Kung ang test ay mag-freeze dahil sa walang katapusang animation — maaaring puwersahang i-off ang pag-sync para sa isang partikular na code block.

javascript
// Pag-off ng pag-sync para sa problematikong bahagi
await device.disableSynchronization();
// Aksyon na may mahabang animation
await element(by.id('loader')).swipe('down');
await device.enableSynchronization();

Pag-install at configuration ng Detox

Ang pag-install ng Detox ay nagsisimula sa pagdagdag ng package sa pamamagitan ng npm o yarn. Pagkatapos ng pag-install, dapat gumawa ng configuration file na .detoxrc.js na naglalarawan sa build at run settings para sa bawat platform. Ang Detox ay gumagamit ng sarili nitong build type para sa iOS, batay sa Xcode configuration.

Basic configuration

Kasama sa configuration ang path sa application (app), uri ng builder (build), build argumento, at setting ng device (device). Para sa iOS ginagamit ang appleSimulator, para sa Android — androidEmulator. Maaari ring tukuyin ang launch argument tulad ng wika o rehiyon ng simulator.

javascript
// .detoxrc.js — halimbawa ng 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' } }
  }
};

Mga command sa pagpapatakbo

Pagkatapos ng configuration, available ang mga command: detox build — pagbuo ng application na may test flag at detox test — pagpapatakbo ng test. Sinusuportahan ng Detox ang parallel na pagpapatakbo sa maraming device sa pamamagitan ng --workers flag.

Pagsusulat ng test gamit ang Detox

Ang Detox test ay isinusulat sa JavaScript o TypeScript gamit ang API na batay sa paghahanap ng element (matchers) at aksyon (actions). Matchers ay nagbibigay-daan upang makahanap ng elemento ayon sa ID, text, uri, o posisyon sa screen. Ang Actions ay gumagawa ng tap, text input, swipe, at scroll.

Structure ng test scenario

Ang tipikal na test ay mukhang isang sequence: hanapin ang element → gawin ang aksyon → suriin ang resulta. Para sa pagsusuri, ginagamit ang expect-API na may matchers ayon sa presensya, visibility, o text ng element. Sinusuportahan ng Detox ang describe/it syntax sa pamamagitan ng integrasyon sa Jest.

javascript
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();
  });
});

Paggawa gamit ang gestures

Sinusuportahan ng Detox ang lahat ng sikat na gesture: tap, longPress, swipe, scroll, pinch, multiTap. Para sa scroll maaaring tukuyin ang direksyon, bilis, at posisyon ng paghinto. Ito ay nagbibigay-daan sa pagtest ng mga kumplikadong scenario tulad ng pull-to-refresh o carousel.

Integrasyon ng Detox sa CI/CD

Mahusay na naka-integrate ang Detox sa mga sikat na CI system: GitHub Actions, CircleCI, Bitrise, at Jenkins. Para sa pagpapatakbo sa CI, kailangan i-configure ang virtual simulator iOS (walang GUI) at Android emulator na may hardware acceleration. Nagbibigay ang Detox ng artifacts — screenshot at log — para sa pagsusuri ng mga bagsak na test.

Rekomendasyon para sa CI

Para mapabilis ang pagpapatakbo ng test sa CI, inirerekomenda ang paggamit ng sharding (parallelization) na may --workers flag. Awtomatikong namamahagi ang Detox ng test file sa maraming simulator. Kapaki-pakinabang din ang pag-cache ng build ng application sa pagitan ng pagpapatakbo upang bawasan ang oras ng pagbuo.

yaml
# GitHub Actions — pagpapatakbo ng Detox sa 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

Pinakamahusay na kasanayan sa Detox

Para sa matatag at mabilis na E2E test, inirerekomenda na sundin ang ilang patakaran. Iwasan ang sleep() — nagbibigay ang Detox ng awtomatikong pag-sync, at ang explicit na pagkaantala ay nagpapabagal lamang ng test at ginagawa itong hindi matatag. Kung ang test ay bumagsak dahil sa timing, suriin muna kung hindi naka-off ang pag-sync. Kapaki-pakinabang din ang paggrupo ng test ayon sa feature at pagpapatakbo ng mga ito nang independyente — pinapadali nito ang paghahanap ng dahilan ng pagbagsak.

Paggamit ng device method

Nagbibigay ang Detox ng ilang device method para sa pamamahala ng estado: device.reloadReactNative() ay nagre-reload ng bundle, device.launchNewApp() ay naglulunsad ng application na may bagong parameter, device.sendToHome() ay nagmi-minimize ng application. device.setURLBlacklist() ay nagbibigay-daan upang ibukod ang partikular na URL mula sa pag-sync, na kapaki-pakinabang para sa analytics at long-polling na koneksyon.

Organisasyon ng test data

Para sa bawat test, inirerekomenda na gumawa ng isolated state. Gamitin ang beforeEach para i-reload ang application sa pamamagitan ng device.reloadReactNative(). Para sa test na nangangailangan ng partikular na data, gumawa ng factory o API client para ihanda ang data sa server. Iwasan ang dependency sa pagitan ng test — bawat test ay dapat maging independyente.

Paggawa gamit ang WebView

Sinusuportahan ng Detox ang pagtest ng WebView sa pamamagitan ng web.element() at web.invoke() method. Para sa pakikipag-ugnayan sa web element, ginagamit ang by.web(id, css, o className). Mahalagang tandaan na ang WebView ay nangangailangan ng karagdagang oras para mag-load — kung hindi gumagana ang pag-sync, magdagdag ng paghihintay sa pag-load sa pamamagitan ng waitFor.

javascript
// Pagtest ng WebView sa 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');

Screenshot testing

Sinusuportahan ng Detox ang paghahambing ng screenshot sa pamamagitan ng detox-image-matching plugin. Screenshot ay nagbibigay-daan upang makita ang visual regression: mga elementong lumipat, maling kulay, nawawalang icon. Para sa matatag na screenshot, i-off ang animation at gumamit ng fixed na laki ng simulator.

Diagnosis ng problema sa Detox

Ang pinakakaraniwang problema sa Detox ay nauugnay sa pag-sync: walang katapusang animation, mahabang network request, o natigil na timer. Logging na may --loglevel trace flag ay nagpapakita kung anong resources ang hinihintay ng Detox. Kung mag-freeze ang Detox — gamitin ang device.disableSynchronization() para sa problematikong bahagi ng code.

Problema sa simulator

Sa iOS simulator, ang Detox ay nangangailangan ng paunang pagbuo ng application sa pamamagitan ng xcodebuild na may iphonesimulator configuration. Karaniwang pagkakamali ay paggamit ng Release scheme sa halip na Debug, na nag-o-off ng test flag. Para sa Android, tiyakin na ang AVD ay ginawa gamit ang API na tugma sa iyong application at ang Intel HAXM acceleration ay naka-enable. Para sa CI environment sa macOS, maginhawang gamitin ang GitHub Actions na may macOS runner, kung saan pre-installed na ang Xcode at simulator.

Timeout ng test

Kung ang test ay regular na bumagsak dahil sa timeout, suriin: kung ang pag-sync ay hindi naka-off globally, kung sa code ng application ay hindi ginagamit ang setTimeout o setInterval nang walang paglilinis, at kung ang main thread ay hindi naka-block ng mahabang operasyon. Minsan nakakatulong ang pagtaas ng timeout sa detoxrc.js sa pamamagitan ng testRunner.args.jest.$.testTimeout. Para sa paghahanap ng problematikong bahagi, i-enable ang Detox tracing logging — ipinapakita nito kung anong resources at timer ang kasalukuyang hinihintay ng framework.

Artifacts at report

Pagkatapos ng pagpapatakbo ng test, gumagawa ang Detox ng artifacts: screenshot ng bagsak na test, log ng application, at XML JUnit report. Screenshot ay awtomatikong ginagawa kapag bumagsak ang test at tumutulong na makita ang problema nang biswal. Para sa CI, ang artifacts ay ina-upload sa cloud storage at accessible sa pamamagitan ng web interface para sa pagsusuri ng dahilan ng pagbagsak.

Mga madalas itanong

Ano ang pagkakaiba ng Detox sa Appium?

Gumagamit ang Detox ng gray-box approach na may access sa internal state ng application at awtomatikong pag-sync. Gumagana ang Appium sa black-box model sa pamamagitan ng WebDriver at nangangailangan ng manual na paghihintay. Ang Detox ay mas mabilis at mas matatag para sa React Native projects.

Anong mga wika ang sinusuportahan ng Detox?

Ang Detox test ay isinusulat sa JavaScript o TypeScript. Ang framework ay naka-integrate sa Jest at Mocha bilang test runner. Ang native engine para sa iOS ay isinulat sa Swift, para sa Android — sa Kotlin at Java.

Maaari bang gamitin ang Detox para sa native application?

Oo, sinusuportahan ng Detox ang native application sa iOS (sa pamamagitan ng XCTest) at Android (sa pamamagitan ng Espresso). Gayunpaman, ang pangunahing audience ng Detox ay React Native developers, dahil para sa native projects ay may mas mature na solusyon.

Paano i-debug ang bagsak na Detox test?

Nagbibigay ang Detox ng artifacts: screenshot, log ng application, at HTML report. Para sa local debugging, ginagamit ang --loglevel trace flag, at para sa CI — automatic artifact collector na may upload sa cloud.

Ano ang device.reloadReactNative?

Ito ay isang Detox API method na nagre-reload ng JavaScript bundle ng React Native application nang walang muling pag-install. Ginagamit ito sa beforeEach para i-reset ang estado ng application sa initial screen bago ang bawat test.

Buod

  • Detox — gray-box E2E-framework mula sa Wix para sa pagtest ng React Native at native application
  • Awtomatikong pag-sync ay nag-aalis ng manual timeout at ginagawang mas matatag ang test
  • Arkitektura ay kinabibilangan ng CLI, test runner, at native driver na may WebSocket connection
  • Test ay isinusulat sa JavaScript gamit ang matcher, action, at expect API
  • Pag-install ay nangangailangan ng configuration ng .detoxrc.js at pag-setup ng simulator
  • CI/CD ay sumusuporta sa sharding, artifacts, at parallel execution sa maraming device
  • Gray-box approach ay nagbibigay ng access sa internal state ng application at operation queue

Gagawa kami ng mobile application na turnkey

Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.

Pag-usapan ang proyekto

Basahin din