{"componentChunkName":"component---src-templates-post-js","path":"/blog/setup-detox-tests-android","result":{"data":{"markdownRemark":{"html":"<p class=\"intro\"><a href=\"https://github.com/wix/Detox\" target=\"_blank\">Detox</a> is an end to end testing library for your react native app that enables you to emulate user behavior and test how your app reacts to it, automatically.</p>\n<p>In this blog post, I will be going over setting up Detox from scratch in a React Native project for Android. In the future, I am planning to write another post where I will go through the <code class=\"language-text\">iOS</code> setup. </p>\n<h3>Setting up the Project</h3>\n<p>The first step is to set up our React Native project. I am assuming you already have your development environment setup for react native and android. If not, then you can go through the <a href=\"https://reactnative.dev/docs/environment-setup\" target=\"_blank\">official documentation</a> to set up your environment. </p>\n<p>We will be using <code class=\"language-text\">react-native</code> cli for this. The following steps should bootstrap a react-native app.</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\">$ npx react-native init ReactNativeDetox\n$ <span class=\"token builtin class-name\">cd</span> ReactNativeDetox</code></pre></div>\n<p>First, you should have your android emulator running, and then you can run the following to start the <code class=\"language-text\">ReactNativeDetox</code> app in your emulator. </p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\">$ <span class=\"token function\">yarn</span> android\n$ <span class=\"token function\">yarn</span> start</code></pre></div>\n<p><code class=\"language-text\">yarn android</code> will take a while to complete and it should ask you to run the metro bundler but in case it doesn't you can do that manually by running <code class=\"language-text\">yarn start</code>. After running those command the app should look like the following screenshot.</p>\n<figure>\n&#xA0; <span class=\"gatsby-resp-image-wrapper\" style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 327px; \">\n      <span class=\"gatsby-resp-image-background-image\" style=\"padding-bottom: 202.45398773006133%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,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&apos;); background-size: cover; display: block;\"></span>\n  <img class=\"gatsby-resp-image-image\" alt=\"start screen\" title=\"start screen\" src=\"/static/df858f77d05877d5b8f114c4faca46b4/00e65/start-screen.png\" srcset=\"/static/df858f77d05877d5b8f114c4faca46b4/222b7/start-screen.png 163w,\n/static/df858f77d05877d5b8f114c4faca46b4/ff46a/start-screen.png 325w,\n/static/df858f77d05877d5b8f114c4faca46b4/00e65/start-screen.png 327w\" sizes=\"(max-width: 327px) 100vw, 327px\" style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\" loading=\"lazy\">\n    </span>\n&#xA0; <figcaption>Startup screen of ReactNativeDetox App</figcaption>\n</figure>\n<h3>Adding Detox</h3>\n<p>Detox needs to be set up with a test runner like <code class=\"language-text\">Jest</code> or <code class=\"language-text\">Mocha</code>. It supports both but I am going to be using <code class=\"language-text\">Jest</code> for this tutorial since its recommended by Detox themselves.</p>\n<p>First, we need to install detox locally from npm.</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\">$ <span class=\"token function\">yarn</span> <span class=\"token function\">add</span> detox</code></pre></div>\n<p>Now we need to setup Detox with Jest. Thankfully, we don't have to do this on our own. The Detox cli can do this for us. </p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\">$ npx detox init -r jest\n\ndetox<span class=\"token punctuation\">[</span><span class=\"token number\">43072</span><span class=\"token punctuation\">]</span> INFO:  <span class=\"token punctuation\">[</span>init.js<span class=\"token punctuation\">]</span> Created a <span class=\"token function\">file</span> at path: e2e/config.json\ndetox<span class=\"token punctuation\">[</span><span class=\"token number\">43072</span><span class=\"token punctuation\">]</span> INFO:  <span class=\"token punctuation\">[</span>init.js<span class=\"token punctuation\">]</span> Created a <span class=\"token function\">file</span> at path: e2e/environment.js\ndetox<span class=\"token punctuation\">[</span><span class=\"token number\">43072</span><span class=\"token punctuation\">]</span> INFO:  <span class=\"token punctuation\">[</span>init.js<span class=\"token punctuation\">]</span> Created a <span class=\"token function\">file</span> at path: e2e/firstTest.e2e.js\ndetox<span class=\"token punctuation\">[</span><span class=\"token number\">43072</span><span class=\"token punctuation\">]</span> INFO:  <span class=\"token punctuation\">[</span>init.js<span class=\"token punctuation\">]</span> Created a <span class=\"token function\">file</span> at path: e2e/config.json</code></pre></div>\n<p>After running the above command, Detox will create four files for us. For the scope of this tutorial, we don't need to be concerned with <code class=\"language-text\">e2e/config.json</code> and <code class=\"language-text\">e2e/environment.js</code>. But if you are interested you can read about them  <a href=\"https://github.com/wix/Detox/blob/master/docs/Guide.Jest.md#e2econfigjson\" target=\"_blank\">here</a>.</p>\n<p>You will also need to install <code class=\"language-text\">jest</code> and <code class=\"language-text\">jest-circus</code> as dev dependencies.</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\">$ <span class=\"token function\">yarn</span> <span class=\"token function\">add</span> jest jest-circus</code></pre></div>\n<h3>Editing <code class=\"language-text\">.detoxrc.json</code></h3>\n<p>First, you need to find out the name of the emulator you are running. You can do that by running the following - </p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\">$ emulator -list-avds\n\nPixel_2_API_29</code></pre></div>\n<p>As you can see, my emulator name is <code class=\"language-text\">Pixel_2_API_29</code>.</p>\n<p>Now, you will need to replace the <code class=\"language-text\">configuration</code> object in <code class=\"language-text\">.detoxrc.json</code> file with the following - </p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\">  <span class=\"token string\">\"configurations\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token string\">\"android.emu.debug\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token string\">\"binaryPath\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"android/app/build/outputs/apk/debug/app-debug.apk\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">\"build\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"cd android ; ./gradlew assembleDebug assembleAndroidTest -DtestBuildType=debug ; cd -\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"android.emulator\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">\"device\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token string\">\"avdName\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"YOUR_EMULATOR_NAME\"</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"android.emu.release\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token string\">\"binaryPath\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"android/app/build/outputs/apk/release/app-release.apk\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">\"build\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"cd android ; ./gradlew assembleRelease assembleAndroidTest -DtestBuildType=release ; cd -\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"android.emulator\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">\"device\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token string\">\"avdName\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"YOUR_EMULATOR_NAME\"</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span></code></pre></div>\n<p>For me, it would look like the following -</p>\n<figure>\n&#xA0; <span class=\"gatsby-resp-image-wrapper\" style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; \">\n      <span class=\"gatsby-resp-image-background-image\" style=\"padding-bottom: 75.4601226993865%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAABYlAAAWJQFJUiTwAAAB8UlEQVQ4y41UW5KjMAzkMpPwsMHmlUAAG0gIIZOabO1W7f1P0luWgTCz8zEfXUiF1LRaShxV98iaK/LTE1E2QmTTC/mEUv0m1N1flOrP5/dr3R2H6gmZ3+G4vAGXGslhABMafqgsIg2PNdgHFVxWr1jff0EQaXDZwuGih8sUAtGgOl/RDCOS8gJZTuDZhRCIlsi8DfF38HgDR8Yj/NAqK/QAfbsRcX4awNMzgriDHyl4oUFDdd4WvFnJiDAQek4UorRDdbnhoEfk7QOJekBWd6TdB8Vp90TaflC+QBTjZ0Im2zUJsx7H/g5ZvVNjrB6IjldQjVFnfJ2VLd59Vekw0a4jM6HsuFUPlvTg+UCEZorVq7l569sCk5PCZas81kTKpEVgvOOKCvd+ZRHM8F9YyFmk4Vjpmhrjoqctm+Uc1IiknhDmA/kUFSNEeYMobpTb2D6NqOWkHPM18oIrhGlHHibNO9LuFxLjY21zM7ppjo7jKy5sbKZbPXRZtSoMkxb1MCGrr5BGwWmyDWGDvX+asYx6+m9kIjQKzZUbUuNffOwg8xa+0GBxR8vZntZ2Cd9h9ZDTJiu8uQXevBI7v8TOPL3Cxj/A3i/hhHEHl5lfQIWd//Nmi039/GEnjM/Ww1lpELWE5Vy+g/0zsHX2hvUcK/wDlPXlCIK1YjAAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;\"></span>\n  <img class=\"gatsby-resp-image-image\" alt=\"screenshot detoxrc config\" title=\"screenshot detoxrc config\" src=\"/static/351942e842d30caa33a4a2c7b0d616ce/a6d36/screenshot-detoxrc-config.png\" srcset=\"/static/351942e842d30caa33a4a2c7b0d616ce/222b7/screenshot-detoxrc-config.png 163w,\n/static/351942e842d30caa33a4a2c7b0d616ce/ff46a/screenshot-detoxrc-config.png 325w,\n/static/351942e842d30caa33a4a2c7b0d616ce/a6d36/screenshot-detoxrc-config.png 650w,\n/static/351942e842d30caa33a4a2c7b0d616ce/e548f/screenshot-detoxrc-config.png 975w,\n/static/351942e842d30caa33a4a2c7b0d616ce/3c492/screenshot-detoxrc-config.png 1300w,\n/static/351942e842d30caa33a4a2c7b0d616ce/6297e/screenshot-detoxrc-config.png 2044w\" sizes=\"(max-width: 650px) 100vw, 650px\" style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\" loading=\"lazy\">\n    </span>\n&#xA0; <figcaption>.detoxrc.json file</figcaption>\n</figure>\n<p>We have added the detox configurations for the <code class=\"language-text\">debug</code> and <code class=\"language-text\">release</code> builds of our app. We told Detox about the <code class=\"language-text\">binaryPath</code> of our app and also the emulator which Detox will use to run the tests.</p>\n<h3>Adding Detox dependency to the Android project</h3>\n<ol>\n<li>Open your root buildscript (i.e. <code class=\"language-text\">android/build.gradle</code>) and register both <code class=\"language-text\">google()</code> and <code class=\"language-text\">detox</code> as repository lookup points in all projects:</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">allprojects <span class=\"token punctuation\">{</span>\n    repositories <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">mavenLocal</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        maven <span class=\"token punctuation\">{</span>\n            <span class=\"token comment\">// All of React Native (JS, Obj-C sources, Android binaries) is installed from npm</span>\n            <span class=\"token function\">url</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"$rootDir/../node_modules/react-native/android\"</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span>\n        maven <span class=\"token punctuation\">{</span>\n            <span class=\"token comment\">// Android JSC is installed from npm</span>\n            <span class=\"token function\">url</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"$rootDir/../node_modules/jsc-android/dist\"</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token comment\">/* 👇 */</span>\n        maven <span class=\"token punctuation\">{</span>\n            <span class=\"token comment\">// All of Detox' artifacts are provided via the npm module</span>\n            url <span class=\"token string\">\"$rootDir/../node_modules/detox/Detox-android\"</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token function\">google</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n        <span class=\"token comment\">/* 👆 */</span>\n        <span class=\"token function\">jcenter</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        maven <span class=\"token punctuation\">{</span> url <span class=\"token string\">'https://www.jitpack.io'</span> <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>We also need to update our <code class=\"language-text\">minSdkVersion</code> to <code class=\"language-text\">18</code> as required by detox and add <code class=\"language-text\">Kotlin</code>. As of now, the latest version of Kotlin is <code class=\"language-text\">1.3.70</code> so, I will use that.</p>\n<p>In <code class=\"language-text\">android/build.gradle</code> file, add the following code - </p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">buildscript <span class=\"token punctuation\">{</span>\n    ext <span class=\"token punctuation\">{</span>\n        buildToolsVersion <span class=\"token operator\">=</span> <span class=\"token string\">\"28.0.3\"</span>\n        ext<span class=\"token punctuation\">.</span>kotlinVersion <span class=\"token operator\">=</span> <span class=\"token string\">\"1.3.70\"</span> <span class=\"token comment\">/* 👈 */</span>\n        minSdkVersion <span class=\"token operator\">=</span> <span class=\"token number\">18</span>  <span class=\"token comment\">/* 👈 */</span>\n        compileSdkVersion <span class=\"token operator\">=</span> <span class=\"token number\">28</span>\n        targetSdkVersion <span class=\"token operator\">=</span> <span class=\"token number\">28</span>\n    <span class=\"token punctuation\">}</span>\n    repositories <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">google</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        <span class=\"token function\">jcenter</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n    \n    dependencies <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">classpath</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"com.android.tools.build:gradle:3.5.2\"</span><span class=\"token punctuation\">)</span>\n        classpath <span class=\"token string\">\"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion\"</span> <span class=\"token comment\">/* 👈 */</span>\n\n        <span class=\"token comment\">// NOTE: Do not place your application dependencies here; they belong</span>\n        <span class=\"token comment\">// in the individual module build.gradle files</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<ol start=\"2\">\n<li>We need to add the following dependencies in our app's buildscript. Open up <code class=\"language-text\">android/app/build.gradle</code> file and update the <code class=\"language-text\">dependencies</code> section as follows - </li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">dependencies <span class=\"token punctuation\">{</span>\n   <span class=\"token comment\">//...</span>\n   <span class=\"token comment\">//...</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>enableHermes<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        def hermesPath <span class=\"token operator\">=</span> <span class=\"token string\">\"../../node_modules/hermes-engine/android/\"</span><span class=\"token punctuation\">;</span>\n        debugImplementation <span class=\"token function\">files</span><span class=\"token punctuation\">(</span>hermesPath <span class=\"token operator\">+</span> <span class=\"token string\">\"hermes-debug.aar\"</span><span class=\"token punctuation\">)</span>\n        releaseImplementation <span class=\"token function\">files</span><span class=\"token punctuation\">(</span>hermesPath <span class=\"token operator\">+</span> <span class=\"token string\">\"hermes-release.aar\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n        implementation jscFlavor\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token function\">androidTestImplementation</span><span class=\"token punctuation\">(</span><span class=\"token string\">'com.wix:detox:+'</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">/* 👈 */</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>We also need to add the following to the <code class=\"language-text\">defaultConfig</code> subsection in the same file -</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">    defaultConfig <span class=\"token punctuation\">{</span>\n        applicationId <span class=\"token string\">\"com.demorntester\"</span>\n        minSdkVersion rootProject<span class=\"token punctuation\">.</span>ext<span class=\"token punctuation\">.</span>minSdkVersion\n        targetSdkVersion rootProject<span class=\"token punctuation\">.</span>ext<span class=\"token punctuation\">.</span>targetSdkVersion\n        versionCode <span class=\"token number\">1</span>\n        versionName <span class=\"token string\">\"1.0\"</span>\n        testBuildType <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span><span class=\"token function\">getProperty</span><span class=\"token punctuation\">(</span><span class=\"token string\">'testBuildType'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'debug'</span><span class=\"token punctuation\">)</span>  <span class=\"token comment\">/* 👈 */</span> \n        testInstrumentationRunner <span class=\"token string\">'androidx.test.runner.AndroidJUnitRunner'</span> <span class=\"token comment\">/* 👈 */</span>\n    <span class=\"token punctuation\">}</span></code></pre></div>\n<ol start=\"3\">\n<li>We need to create an Android Test class. Add the file <code class=\"language-text\">android/app/src/androidTest/java/com/reactnativedetox/DetoxTest.java</code> with the following code - </li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">package</span> <span class=\"token namespace\">com<span class=\"token punctuation\">.</span>reactnativedetox</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">com<span class=\"token punctuation\">.</span>wix<span class=\"token punctuation\">.</span>detox<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">Detox</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">org<span class=\"token punctuation\">.</span>junit<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">Rule</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">org<span class=\"token punctuation\">.</span>junit<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">Test</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">org<span class=\"token punctuation\">.</span>junit<span class=\"token punctuation\">.</span>runner<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">RunWith</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">androidx<span class=\"token punctuation\">.</span>test<span class=\"token punctuation\">.</span>ext<span class=\"token punctuation\">.</span>junit<span class=\"token punctuation\">.</span>runners<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">AndroidJUnit4</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">androidx<span class=\"token punctuation\">.</span>test<span class=\"token punctuation\">.</span>filters<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">LargeTest</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">androidx<span class=\"token punctuation\">.</span>test<span class=\"token punctuation\">.</span>rule<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">ActivityTestRule</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token annotation punctuation\">@RunWith</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">AndroidJUnit4</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span>\n<span class=\"token annotation punctuation\">@LargeTest</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">DetoxTest</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token annotation punctuation\">@Rule</span>\n    <span class=\"token comment\">// Replace 'MainActivity' with the value of android:name entry in </span>\n    <span class=\"token comment\">// &lt;activity> in AndroidManifest.xml</span>\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">ActivityTestRule</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">MainActivity</span><span class=\"token punctuation\">></span></span> mActivityRule <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">ActivityTestRule</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">(</span><span class=\"token class-name\">MainActivity</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token annotation punctuation\">@Test</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">runDetoxTests</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">Detox</span><span class=\"token punctuation\">.</span><span class=\"token class-name\">DetoxIdlePolicyConfig</span> idlePolicyConfig <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Detox</span><span class=\"token punctuation\">.</span><span class=\"token class-name\">DetoxIdlePolicyConfig</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        idlePolicyConfig<span class=\"token punctuation\">.</span>masterTimeoutSec <span class=\"token operator\">=</span> <span class=\"token number\">60</span><span class=\"token punctuation\">;</span>\n        idlePolicyConfig<span class=\"token punctuation\">.</span>idleResourceTimeoutSec <span class=\"token operator\">=</span> <span class=\"token number\">30</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token class-name\">Detox</span><span class=\"token punctuation\">.</span><span class=\"token function\">runTests</span><span class=\"token punctuation\">(</span>mActivityRule<span class=\"token punctuation\">,</span> idlePolicyConfig<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>That's all the setup we need to do. We are now ready to write the tests!! 🚀</p>\n<h3>Writing our first test</h3>\n<p>Detox has already written some tests for us in the <code class=\"language-text\">e2e/firstTest.spec.js</code> file. But the tests will fail as our app starting screen is different and it won't be able to find elements by <code class=\"language-text\">testID</code>. Instead of updating our tests, for this tutorial we will update the contents of our <code class=\"language-text\">App.js</code> file according to the tests Detox has written. Copy over the contents from  <a href=\"https://github.com/anku255/react-native-detox-setup/blob/master/App.js\" target=\"_blank\">here</a> to your <code class=\"language-text\">App.js</code>.</p>\n<p>Now, we are ready to run the tests. There is just one little thing we need to do. We need to add scripts in our <code class=\"language-text\">package.json</code> file to run the detox tests.</p>\n<p>Open up <code class=\"language-text\">package.json</code> file and add the following to the <code class=\"language-text\">scripts</code> section - </p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token property\">\"scripts\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">\"android\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"react-native run-android\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"ios\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"react-native run-ios\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"start\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"react-native start\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"test\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"jest\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"lint\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"eslint .\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"build:android-debug\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"detox build --configuration android.emu.debug\"</span><span class=\"token punctuation\">,</span> <span class=\"token comment\">/* 👈 */</span>\n  <span class=\"token property\">\"test:android-debug\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"detox test --configuration android.emu.debug\"</span><span class=\"token punctuation\">,</span> <span class=\"token comment\">/* 👈 */</span>\n  <span class=\"token property\">\"e2e:android-debug\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"yarn build:android-debug &amp;&amp; yarn test:android-debug\"</span> <span class=\"token comment\">/* 👈 */</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span></code></pre></div>\n<p>Now, we need to start our react-native packager  - </p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\">$ <span class=\"token function\">yarn</span> start</code></pre></div>\n<p>And then in a new terminal run the following script to start running the tests - </p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\">$ <span class=\"token function\">yarn</span> e2e:android-debug</code></pre></div>\n<p>We are running the detox tests in debug mode. This is will take a while when running for the first time. After completing the tests should start running in your simulator and the output will be displayed in your terminal as following - </p>\n<figure>\n&#xA0; <span class=\"gatsby-resp-image-wrapper\" style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; \">\n      <span class=\"gatsby-resp-image-background-image\" style=\"padding-bottom: 41.104294478527606%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAABYlAAAWJQFJUiTwAAABJUlEQVQoz42S707DIBTF+za6/qO0hVIm0K4rY7SrMdMPe/8HOaaoUzOjfvjl3EDg3pNzI1ofUbVn5GIB5RaEDsjogPtU4S5RQT/YZPpPItY6SH1Cs53ApQeXhwBrLSoxBspmj4LtkFddICa/fMilg9k/4qFbILZToFWnoGuTWjiU3ILWI9Ki+zbxT0RCefT2KXwo9YxtN0Maj7wySKkOmpUmTJaV3VVTapDRNw31+1mkdgtG/4zd4YzBndEaB9nPEGYGV0dw7a5WVwrWh4er7YQYJERf6zjXiKRaMNgXOH/B4C6IS4uST6B8AqktNpn5DCe5DerGcneYsU7JpMeoFngxISY9EtIjLfrQ9b8Jh1BWG1VjQdkIxi3aZrU4hMuv6/LftXkFMJIG0C4HZ0UAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;\"></span>\n  <img class=\"gatsby-resp-image-image\" alt=\"detox tests output\" title=\"detox tests output\" src=\"/static/4eb37438970c089413bec3d63ad72d1b/a6d36/detox-tests-output.png\" srcset=\"/static/4eb37438970c089413bec3d63ad72d1b/222b7/detox-tests-output.png 163w,\n/static/4eb37438970c089413bec3d63ad72d1b/ff46a/detox-tests-output.png 325w,\n/static/4eb37438970c089413bec3d63ad72d1b/a6d36/detox-tests-output.png 650w,\n/static/4eb37438970c089413bec3d63ad72d1b/e548f/detox-tests-output.png 975w,\n/static/4eb37438970c089413bec3d63ad72d1b/3c492/detox-tests-output.png 1300w,\n/static/4eb37438970c089413bec3d63ad72d1b/b7756/detox-tests-output.png 2294w\" sizes=\"(max-width: 650px) 100vw, 650px\" style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\" loading=\"lazy\">\n    </span>\n&#xA0; <figcaption>Output after running the tests.</figcaption>\n</figure>\n<p>That's it! Now, you can start writing tests and exlpore detox. You can learn more about detox from their documentation  <a href=\"https://github.com/wix/Detox/tree/master/docs\" target=\"_blank\">here</a>. The source code of this tutorial is available on  <a href=\"https://github.com/anku255/react-native-detox-setup/\" target=\"_blank\">Github.</a></p>","timeToRead":7,"frontmatter":{"title":"Setting up Detox Tests in a React Native App","date":"2020-06-24T00:00:00.000Z","tags":["Javascript","React Native"]}}},"pageContext":{"slug":"setup-detox-tests-android"}},"staticQueryHashes":["3649515864","63159454"]}