我为E2E测试设置了detox,为持续集成设置了Bitrise。
我已经建立了一个非常简单的初始测试套件,但由于某种原因,我的测试在完成后并没有完成。
init.js
require('babel-polyfill');
const detox = require('detox');
const config = require('../package.json').detox;
before(async () => {
await detox.init(config);
});
after(async () => {
await detox.cleanup();
});
firstTest.spec.js
describe('Example', () => {
beforeEach(async () => {
await device.reloadReactNative();
});
it('should have welcome screen', async () => {
await expect(element(by.id('UniqueID'))).toBeVisible();
});
})
工作流段:(这只是脚本步骤)
brew update
node -v
brew tap wix/brew
brew install wix/brew/applesimutils
npm install -g detox-cli
detox build --configuration ios.sim.release
(稍后将移植到一个.yml文件)
package.json-省略了所有不必要的东西。
"detox": {
"configurations": {
"ios.sim.debug": {
"binaryPath": "ios/build/Build/Products/Debug-iphonesimulator/AlarmApp.app",
"build": "xcodebuild -project ios/AlarmApp.xcodeproj -scheme AlarmApp -configuration Debug -sdk iphonesimulator -derivedDataPath ios/build",
"type": "ios.simulator",
"name": "iPhone 8"
},
"ios.sim.release": {
"binaryPath": "ios/build/Build/Products/Release-iphonesimulator/AlarmApp.app",
"build": "xcodebuild -project ios/AlarmApp.xcodeproj -scheme AlarmApp -configuration Release -sdk iphonesimulator -derivedDataPath ios/build",
"type": "ios.simulator",
"name": "iPhone 8"
}
}
}
Bitrise成功地执行了我的测试,我可以在本地机器上运行它们,所以问题就出在Detox内部。
测试会通过的,但它只是挂起了。
detox.cleanup()
函数被调用,因为我可以在日志文件中看到它:
2017-11-07 16:23:02.802 AlarmApp[15771:1271275] Crash handler setup started.
2017-11-07 16:23:02.805 AlarmApp[15771:1271275] Crash handler setup completed.
2017-11-07 16:23:02.805 AlarmApp[15771:1271275] Enabling accessibility for automation on Simulator.
2017-11-07 16:23:04.427 AlarmApp[15771:1271275] ☣️ DETOX:: Detox Action Sent: login
2017-11-07 16:23:04.714 AlarmApp[15771:1271275] ☣️ DETOX:: Detox Action Received: loginSuccess
2017-11-07 16:23:04.795 AlarmApp[15771:1271275] ☣️ Adding idling resource for queue: <OS_dispatch_queue: com.facebook.react.AccessibilityManagerQueue>
2017-11-07 16:23:04.821 AlarmApp[15771:1271275] ☣️ Adding idling resource for queue: <OS_dispatch_queue: com.facebook.react.PlatformConstantsQueue>
2017-11-07 16:23:05.276 AlarmApp[15771:1271275] ☣️ DETOX:: Detox Action Sent: ready
2017-11-07 16:23:05.287 AlarmApp[15771:1271275] ☣️ DETOX:: Detox Action Received: reactNativeReload
2017-11-07 16:23:05.293 AlarmApp[15771:1271275] ☣️ Adding idling resource for queue: <OS_dispatch_queue: com.facebook.react.AccessibilityManagerQueue>
2017-11-07 16:23:05.293 AlarmApp[15771:1271275] ☣️ Adding idling resource for queue: <OS_dispatch_queue: com.facebook.react.PlatformConstantsQueue>
2017-11-07 16:23:05.402 AlarmApp[15771:1271275] ☣️ DETOX:: Detox Action Sent: ready
2017-11-07 16:23:05.409 AlarmApp[15771:1271275] ☣️ DETOX:: Detox Action Received: invoke
2017-11-07 16:23:05.836 AlarmApp[15771:1271275] ☣️ DETOX:: Detox Action Sent: invokeResult
2017-11-07 16:23:05.844 AlarmApp[15771:1271275] ☣️ DETOX:: Detox Action Received: cleanup
2017-11-07 16:23:05.845 AlarmApp[15771:1271275] ☣️ DETOX:: Detox Action Sent: cleanupDone
任何帮助都将不胜感激。
我们的一位用户报告了同样的问题(尽管我不确定他们是否使用了排毒,但React Native确实存在同样的"测试完成但过程不存在"问题)。
我试图获得尽可能多的信息,因为我们在一个临时虚拟机中对它们进行了调试
谢谢,我想我发现问题了!我们的一些旧测试使用了react原生测试渲染器,而不是像新测试那样使用酶。他们正在用循环动画渲染一个组件,这就是导致挂起的原因。一旦我切换到浅渲染,问题就解决了。谢谢你的帮助!
还值得一提的是,当他们在项目中升级React Native版本时,这个问题就开始发生了
我想,在React Native的早期版本中,渲染器并没有运行子组件中的所有代码,但发生了一些变化,现在它确实运行了。有问题的代码确实会无限循环,所以它导致挂起也就不足为奇了。
我希望这能帮助@Dan,如果它不只是让我知道或ping我们的支持;)