I would like to pass environment variable when I run detox tests in my react-native app:
"ios.sim.debug": {
"binaryPath": "ios/build/Build/Products/Debug-iphonesimulator/myapp.app",
"build": "export IS_DETOX=true && xcodebuild -workspace ios/myapp.xcworkspace -scheme my app -configuration Debug -sdk iphonesimulator -derivedDataPath ios/build",
"type": "ios.simulator",
"device": {
"type": "iPhone 11 Pro"
}
}
I've installed react-native-config. But the variable IS_DETOX is undefined in JS when I run detox tests.
Thanks
I am setting environmental variable without export.
All my .env variables are stored in config folder and I am able to load different environmental file for different configurations.
iOS
"ios.sim.release": {
"binaryPath": "ios/build/Build/Products/Release-iphonesimulator/Clim8Invest.app",
"build": "ENVFILE=config/.env.acceptance xcodebuild -workspace ios/Clim8Invest.xcworkspace -scheme Clim8Invest -configuration Release -sdk iphonesimulator -derivedDataPath ios/build",
"type": "ios.simulator",
"device": {
"type": "iPhone 11"
}
},
Android
"android.emu.debug.e2e": {
"binaryPath": "android/app/build/outputs/apk/debug/app-debug.apk",
"build": "cd android && ENVFILE=../config/.env.e2e ./gradlew assembleDebug assembleAndroidTest -DtestBuildType=debug && cd ..",
"type": "android.emulator",
"device": {
"avdName": "Nexus_5X_A"
}
}
Thanks #Black !
On my side I ended up using another solution with RN_SRC_EXT=e2e.js from Detox Mocking Guide so that the detox build is using params from MyConfig.e2e.js file instead of MyConfig.js file
Related
I'm trying to setup detox for e2e testing for my React Native app using jest and jest-circus. I am able to build my iOS app with detox by running detox build --configuration ios but have been unable to run the sample firstTest.e2e.js test with detox run --configuration ios. I get the following error:
● Test suite failed to run
Error [ERR_PACKAGE_PATH_NOT_EXPORTED]: Package subpath './build/types' is not defined by "exports" in [project path]/node_modules/jest-circus/package.json
at Object.<anonymous> (../node_modules/detox/runners/jest-circus/listeners/DetoxCoreListener.js:11:25)
detox[92379] ERROR: [cli.js] Command failed: jest --config e2e/config.json --testNamePattern '^((?!:android:).)*$' --maxWorkers 1 e2e
My package.json has the following libraries installed:
"detox": "^18.12.1",
"jest": "^24.9.0",
"jest-circus": "^27.1.0",
My .detoxrc.json file looks like this:
{
"testRunner": "jest",
"runnerConfig": "e2e/config.json",
"apps": {
"ios": {
"type": "ios.app",
"binaryPath": "ios/build/Build/Products/Debug-iphonesimulator/appname.app",
"build": "xcodebuild -workspace ios/appname.xcworkspace -scheme appname -configuration Debug -sdk iphonesimulator -derivedDataPath ios/build EXCLUDED_ARCHS=arm64"
}
},
"devices": {
"simulator": {
"type": "ios.simulator",
"device": {
"type": "iPhone 11"
}
}
},
"configurations": {
"ios": {
"device": "simulator",
"app": "ios"
}
}
}
and my e2e/config.json file looks like this:
{
"testEnvironment": "./environment",
"testRunner": "jest-circus/runner",
"testTimeout": 120000,
"testRegex": "\\.e2e\\.js$",
"reporters": ["detox/runners/jest/streamlineReporter"],
"verbose": true
}
This is a fairly old project, and I am already using jest for unit testing. I wonder if there might be some other configuration file interfering with my e2e config but can't seem to figure it out just yet. Any help is welcome!
you should try another jest-circus version:
"jest": "^26.0.1",
"jest-circus": "^26.0.1",
I'm hoping to confirm my thought process when trying to test an Android application that's built with Expo's Turtle-CLI tool. I've got iOS running well, just need help getting Android working.
I have a build process that will spit out an .apk to build/android.apk. Here's the command that does that
turtle build:android \
--output $BUILD_DIR/android.apk \
--username $EXPO_USERNAME \
--password $EXPO_PASSWORD \
--config app.config.ts \
--release-channel $RELEASE_CHANNEL \
--type apk \
--mode debug
This successfully outputs the .apk in build.
Here is my detoxrc.json configuration
{
"testRunner": "jest",
"runnerConfig": "e2e/config.json",
"configurations": {
"ios": {
"type": "ios.simulator",
"binaryPath": "build/app-native.app",
"build": "./scripts/build_test_app ios",
"device": {
"type": "iPhone 11"
}
},
"android": {
"type": "android.attached",
"binaryPath": "build/android.apk",
"testBinaryPath": "build/android.apk",
"build": "./scripts/build_test_app android",
"device": {
"adbName": "059aaa47"
}
}
}
}
I then attempt to run my tests with
detox test --configuration android --loglevel trace
Which then yields (more logs at the bottom of this post)
No instrumentation runner found on device 059aaa47 for package com.foobar.mobilern
at ADB.getInstrumentationRunner (../node_modules/detox/src/devices/drivers/android/exec/ADB.js:250:13)
at Instrumentation.launch (../node_modules/detox/src/devices/drivers/android/tools/Instrumentation.js:19:24)
at MonitoredInstrumentation.launch (../node_modules/detox/src/devices/drivers/android/tools/MonitoredInstrumentation.js:18:5)
at AttachedAndroidDriver._launchInstrumentationProcess (../node_modules/detox/src/devices/drivers/android/AndroidDriver.js:284:5)
at AttachedAndroidDriver._launchApp (../node_modules/detox/src/devices/drivers/android/AndroidDriver.js:267:7)
at AttachedAndroidDriver._handleLaunchApp (../node_modules/detox/src/devices/drivers/android/AndroidDriver.js:120:7)
at AttachedAndroidDriver.launchApp (../node_modules/detox/src/devices/drivers/android/AndroidDriver.js:91:12)
at Device._doLaunchApp (../node_modules/detox/src/devices/Device.js:85:19)
at traceCall (../node_modules/detox/src/utils/trace.js:41:20)
If I omit the testBinaryPath key from .detoxrc.json, then I get this result.
Running adb -s 059aaa47 shell pm list instrumentation on the test device yields an empty response, so I'm inclined to believe that some testing setup isn't being completed thoroughly and/or perhaps I'm thinking about this wrong.
I guess the gist of my question is, is it possible to test one .apk without having to make use of some sort of testing harness / binary?
Full Log Output
I am running e2e tests using Detox (https://github.com/wix/Detox) and I was wondering if there is a way to control which test file to run, either through the CLI or some config file.
Currently I am using two test files in the following file structure:
> e2e
config.json
environment.js
firstTest.js
secondTest.js
My .detoxrc.json file below:
{
"testRunner": "jest",
"runnerConfig": "e2e/config.json",
"configurations": {
"android.emu.debug": {
"binaryPath": "android/app/build/outputs/apk/debug/app-debug.apk",
"build":
"cd android && sh gradlew assembleDebug assembleAndroidTest -DtestBuildType=debug && cd ..",
"type": "android.emulator",
"device": {
"avdName": "Pixel_2_API_28"
}
},
"android.emu.release": {
"binaryPath": "android/app/build/outputs/apk/release/app-release.apk",
"build": "cd android && sh gradlew assembleRelease assembleAndroidTest -DtestBuildType=release &&
cd ..",
"type": "android.emulator",
"device": {
"avdName": "Pixel_2_API_28"
}
}
}
}
When I run the tests using
detox test --configuration android.emu.debug
firstTest.js runs first and then secondTest.js runs, which is fine.
Sometimes you would not like to run firstTest.js to save time and only run secondTest.js.
So my question is: Is it possible to control which test file to run either through the detox CLI or by modifying the .detoxrc.json file? Or by some other means?
I am not interested in a dummy hack like commenting out all the tests in firstTest.js file or something like that.
You can now do this from the command line using the "-f filepath" flag:
detox test --configuration ios -f e2e/signupTest.e2e.js
In e2e folder you have config.json and inside of the config you have testRegex:
"testRegex": "\\.js\\.js$"
If you want to run only 1 set/file of tests you can change the name there and give the file name.
Example:
{
"testEnvironment": "./environment",
"testRunner": "jest-circus/runner",
"testTimeout": 120000,
"testRegex": "firstTest.js.js$",
"reporters": ["detox/runners/jest/streamlineReporter"],
"verbose": true
}
I got your feeling. On other tools you can add flags.
Here are stated some cli flags, but none points to what you want:
https://github.com/wix/Detox/blob/master/docs/APIRef.DetoxCLI.md
I am trying to run the initial test I set up yesterday, which was working. Today when I launch the test I get the TypeError: null is not an object 'evaluating RNGestureHandler.default.Direction' and the app will not load. react-native run-ios launches the app as expected with no issues. When I run the detox test command the app build fails.
Android is behaving properly.
I've tried linking manually in XCode. I've tried clearing the cache. I've removed and installed the RN modules. I've added the podfile reference manually.
I'm trying to figure out why the app will load with react-native run-ios but the detox test app load fails. Could it be loading a different build? Is there a file somewhere Detox saves an iOS build folder? I thought it uses the value in the binaryPath. I can't figure out why it worked yesterday but not today.
Here's the package.json:
"test-runner": "jest",
"configurations": {
"ios.sim.debug": {
"binaryPath": "ios/build/Build/Products/Debug-iphonesimulator/MyApp.app",
"build": "xcodebuild -workspace ios/MyApp.xcworkspace -scheme MyApp -configuration Debug -
sdk iphonesimulator -derivedDataPath ios/build",
"type": "ios.simulator",
"device": {
"type": "iPhone 11"
}
},
"android.emu.debug": {
"binaryPath": "android/app/build/outputs/apk/debug/app-debug.apk",
"build": "cd android && ./gradlew assembleDebug assembleAndroidTest -DtestBuildType=debug && cd ..",
"type": "android.emulator",
"device": {
"avdName": "Nexus_5X_API_26"
}
},
"android.emu.release": {
"binaryPath": "android/app/build/outputs/apk/release/app-release.apk",
"build": "cd android && ./gradlew assembleRelease assembleAndroidTest -DtestBuildType=release && cd ..",
"type": "android.emulator",
"device": {
"avdName": "Nexus_5X_API_26"
}
}
}
}```
Ok Figured it out. Posting it here for anyone who has this issue too.
I removed the ios/build folder and did a new build with Detox:
detox build -c ios.sim.debug
And now everything is working again on iOS.
I am facing the error below when running test case using detox.
I had all dependencies installed as part of it.
Can't find a simulator to match with " iPhone 6 ", run 'xcrun simctl list' to list your supported devices.
configuration="ios.sim.debug" artifactsLocation="artifacts/ios.sim.debug.2019-01-31 12-14-41Z" node_modules/.bin/jest "e2e" --config=e2e/config.json --maxWorkers=1 '--testNamePattern=^((?!:android:).)*$'
detox[5864] INFO: [DetoxServer.js] server listening on localhost:57598...
detox[5864] ERROR: [index.js/DETOX_INIT_ERROR]
Error: Can't find a simulator to match with " iPhone 6 ", run 'xcrun simctl list' to list your supported devices.
It is advised to only state a device type, and not to state iOS version, e.g. "iPhone 7"
at AppleSimUtils.findDevicesUDID (/Users/alok/Desktop/malliswari/accordion/node_modules/detox/src/devices/ios/AppleSimUtils.js:46:13)
at process._tickCallback (internal/process/next_tick.js:68:7)
This is caused by setting the simulator in your detox config in your package.json to one that isn't on your system
"detox": {
"configurations": {
"ios.sim.debug": {
"binaryPath": "ios/build/Build/Products/Debug-iphonesimulator/myapp.app",
"build": "RN_SRC_EXT=e2e.js xcodebuild -workspace ios/myapp.xcworkspace -scheme myapp -configuration Debug -sdk iphonesimulator -derivedDataPath ios/build",
"type": "ios.simulator",
"name": "iPhone 7" // <- this is where you define your simulator
}
},
You should run xcrun simctl list in your terminal to see which simulators are available. Then use one of the available ones in your detox configuration. Chances are you should be able to change it to "iPhone 7" or "iPhone 8"
Another possible solution is here
https://github.com/wix/Detox/issues/1103
We need to upgrade AppleSimUtils. In case if you have issues in upgrading check out here