mirror of
https://github.com/hanzoai/Detox.git
synced 2026-09-24 16:55:12 +00:00
167 lines
5.8 KiB
Markdown
167 lines
5.8 KiB
Markdown
# Debugging in Android Studio During Detox Tests
|
|
|
|
> This flow is not standard and serves mostly for investigating weird crashes or
|
|
when contributing to Detox itself.
|
|
> **Don't use it unless you have a good reason.**
|
|
|
|
### Setting Detox up as a compiling dependency
|
|
|
|
Before you go anywhere further, follow the
|
|
[Setting Detox up as a compiling dependency](Introduction.Android.md#setting-detox-up-as-a-compiling-dependency)
|
|
section from the **Detox for Android** document.
|
|
|
|
### Add "manual" device configurations to your .detoxrc
|
|
|
|
Locate your `.detoxrc` config file or the corresponding `detox` section in your `package.json`
|
|
and add a configuration similar to this one:
|
|
|
|
```json
|
|
{
|
|
"devices": {
|
|
"emulator": {
|
|
"type": "android.emulator",
|
|
"device": {
|
|
"avdName": "<e.g., Pixel_API_28>"
|
|
}
|
|
}
|
|
},
|
|
"apps": {
|
|
"android.debug": {
|
|
"type": "android.apk",
|
|
"binaryPath": "<path to your app binary built before>"
|
|
}
|
|
},
|
|
"configurations": {
|
|
"android.manual": {
|
|
"device": "emulator",
|
|
"app": "android.debug",
|
|
"behavior": {
|
|
"launchApp": "manual"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
While the `behavior` section is a **mandatory** thing to include, there are a few more optional
|
|
parameters to disable various side effects and make life easier when debugging:
|
|
|
|
```diff
|
|
"behavior": {
|
|
"launchApp": "manual"
|
|
},
|
|
+ "session": {
|
|
+ "autoStart": true,
|
|
+ "debugSynchronization": 0,
|
|
+ "server": "ws://localhost:8099",
|
|
+ "sessionId": "test"
|
|
+ },
|
|
+ "artifacts": false
|
|
```
|
|
|
|
* Using a preconfigured `session` with an autostarting server removes the legwork of copying and
|
|
pasting values to the instrumentation runner launch arguments dialog every time before any launch
|
|
from the IDE. Otherwise, by default when the `session` object omitted, `server` and `sessionId`
|
|
are randomly generated for every new test session.
|
|
|
|
* The `debugSynchronization: 0` override matters only if you have a global `session` config
|
|
with `debugSynchronization` set to a positive integer value. Otherwise, it is not needed. The point
|
|
is to disable regular app polling requests during debugging, since that only can hinder the debugging.
|
|
|
|
* Setting `artifacts: false` override also matters only if you have a global `artifacts` config.
|
|
The motivation is to disable unrelevant taxing activities on the device such as capturing logs
|
|
screenshots, videos and so on.
|
|
* If your investigation addresses a specific artifact plugin glitch on the native side, then just
|
|
disable all the other plugins. See [Detox Configuration](APIRef.Configuration.md) document
|
|
for the reference.
|
|
|
|
### Run a specific test
|
|
|
|
Usually, you would want to focus on a specific test suite to save time, e.g.:
|
|
|
|
```
|
|
detox test -c android.manual e2e/someSuite.test.js
|
|
```
|
|
|
|
If you are using Jest as a test runner, you might want to increase the test timeout via appending
|
|
`--testTimeout 999999` to the command. For Mocha, that would be `--timeout 999999`.
|
|
|
|
Also, if there is something you want to do step by step in JS code while debugging native, append
|
|
`--inspect-brk` flag. To learn more about debugging with `--inspect-brk`, refer to
|
|
[Debugging — Getting Started](https://nodejs.org/en/docs/guides/debugging-getting-started/) on the official Node.js website.
|
|
|
|
Afterwards, you should see your test suite starting as usual until it reaches the app launch, where
|
|
Detox stops instead and prompts you to launch the app from the IDE:
|
|
|
|
```
|
|
detox[53038] INFO: [AndroidDriver.js] Waiting for you to manually launch your app in Android Studio.
|
|
|
|
Instrumentation class: com.wix.detox.test.test/com.example.DetoxTestAppJUnitRunner
|
|
Instrumentation arguments:
|
|
------------------------------------
|
|
Key | Value
|
|
------------------------------------
|
|
detoxServer | ws://localhost:8099
|
|
detoxSessionId | test
|
|
------------------------------------
|
|
|
|
Press any key to continue...
|
|
```
|
|
|
|
Now it is time to switch back to Android Studio. However, if for some reason you wish to terminate the process, use Ctrl+C to exit.
|
|
|
|
## Launching the app
|
|
|
|
Before you launch the app from Android Studio, make sure to put breakpoints at the points of interest.
|
|
|
|
You'll need to run your instrumentation runner with the said arguments, this is why you
|
|
should create a debug configuration of `Android Instrumented Tests` type similar to the
|
|
one below:
|
|
|
|

|
|
|
|
The moment you see the app has started on the device, go back to the Terminal where Detox is
|
|
running and press any key.
|
|
|
|
As a result, you are expected to see a confirmation from Detox, e.g.:
|
|
|
|
```
|
|
Found the app (com.wix.detox-example) with process ID = 16854. Proceeding...
|
|
```
|
|
|
|
Now the entire test will run as usual until it sends an action to the app, which gets trapped
|
|
in your breakpoint.
|
|
|
|

|
|
|
|
Happy debugging!
|
|
|
|
## Extra tweaks
|
|
|
|
If you feel like you see too often this timeout error while debugging:
|
|
|
|
```
|
|
Waited for the new RN-context for too long! (60 seconds)
|
|
If you think that's not long enough, consider applying a custom Detox runtime-config in DetoxTest.runTests().
|
|
```
|
|
|
|
you can temporarily hack the timeout here:
|
|
|
|
```diff
|
|
diff --git a/detox/android/detox/src/main/java/com/wix/detox/config/DetoxConfig.kt b/detox/android/detox/src/main/java/com/wix/detox/config/DetoxConfig.kt
|
|
index b33b2086..aaf8e9e2 100644
|
|
--- a/detox/android/detox/src/main/java/com/wix/detox/config/DetoxConfig.kt
|
|
+++ b/detox/android/detox/src/main/java/com/wix/detox/config/DetoxConfig.kt
|
|
@@ -1,8 +1,10 @@
|
|
package com.wix.detox.config
|
|
|
|
class DetoxConfig {
|
|
@JvmField var idlePolicyConfig: DetoxIdlePolicyConfig = DetoxIdlePolicyConfig()
|
|
- @JvmField var rnContextLoadTimeoutSec = 60
|
|
+ @JvmField var rnContextLoadTimeoutSec = Int.MAX_VALUE
|
|
|
|
fun apply() {
|
|
idlePolicyConfig.apply()
|
|
```
|
|
|