如何判断 Detox 是 运行 测试?
How to tell Detox is running tests?
我在我的 React Native 项目中使用 Detox 到 运行 端到端测试。我还使用 pretender.js 来模拟我的 API 请求,我正在努力寻找一种方法来了解该应用程序当前是否处于 "testing" 模式。
我正在传递一个 env 变量(并使用 babel-transform-inline-environment-variables
)来判断我是否应该模拟请求,但这在我们的发布版本中中断了 shim.js
。
有什么方法可以告诉 Detox 启动了应用程序并且 运行正在从 JS 中进行测试?理想情况下,我正在寻找在测试时设置的某种变量或从命令行传递下来的东西(TESTING=true react-native start
或 __TESTING__
)
尝试使用 react-native-config. Here is also a good article on Managing Configuration in React Native 和 react-native-config。
我也在此处 animated-button-block-the-detox 给出了答案,其中包含如何在测试期间使用 react-native-config 禁用循环动画的工作示例。
基本思想是为所有不同的构建环境(开发、生产、测试等)创建 .env 配置文件。这些包含您可以从 Javascript、Objective-C/Swift 或 Java.
访问的配置变量
然后指定在构建应用程序时要使用的 .env 配置文件:
$ ENVFILE=.env.staging react-native run-ios # bash
这是 package.json 文件的示例,其中 detox 使用 .env 配置文件构建应用程序。
"detox": {
"specs": "e2e",
"configurations": {
"ios.sim.release": {
"binaryPath": "ios/build/Build/Products/Release-iphonesimulator/example.app",
"build": "ENVFILE=.env.production export RCT_NO_LAUNCH_PACKAGER=true && xcodebuild -project ios/example.xcodeproj -scheme example -configuration Release -sdk iphonesimulator -derivedDataPath ios/build",
"type": "ios.simulator",
"name": "iPhone 5s, iOS 10.3"
},
"ios.sim.test": {
"binaryPath": "ios/build/Build/Products/Debug-iphonesimulator/example.app",
"build": "ENVFILE=.env.testing xcodebuild -project ios/example.xcodeproj -scheme example -configuration Debug -sdk iphonesimulator -derivedDataPath ios/build -arch x86_64",
"type": "ios.simulator",
"name": "iPhone 5s, iOS 10.3"
}
}
}
我们正在利用 detox 在 iOS 命令行上使用 --args -detoxServer ... -detoxSessionId ...
调用您的二进制文件并在 android.[=15 的 InstrumentationRegistry 中设置 { detoxServer: ..., detoxSessionId: ... }
=]
我们目前将其暴露给 JS 的方式对于 Whosebug 的回答来说有点过分,但这里有一些示例代码以及 React Native 的文档应该可以帮助您实现目标 - 对于 Android:
// This will throw ClassNotFoundException if not running under any test,
// but it still might not be running under Detox
Class<?> instrumentationRegistry = Class.forName("android.support.test.InstrumentationRegistry");
Method getArguments = instrumentationRegistry.getMethod("getArguments");
Bundle argumentsBundle = (Bundle) getArguments.invoke(null);
// Say you're in your BaseJavaModule.getConstants() implementation:
return Collections.<String, Object>singletonMap("isDetox", null != argumentsBundle.getString("detoxServer"));
在 iOS 上,类似(没有 Objective-C 编译器 ATM):
return @{@"isDetox": [[[NSProcessInfo processInfo] arguments] containsObject: @"-detoxServer"]}
请注意,也可以通过以下方式进行排毒以添加您自己的参数:
detox.init(config, { launchApp: false });
device.launchApp({ newInstance: true, launchArgs: {
myCustomArg: value,
...,
} });
如果能在某个时候将其打磨成一个模块就好了。
Tests/production 了解环境的代码在 IMO 中是混乱的。
我推荐的方法是 为测试创建不同的应用风格 。
如果您使用 React Native,请查看 react-native-repackager 的说明。
或者,Detox docs 也有该部分。
如果您为 Android 编写 Java 代码,请使用 gradle build flavors 创建用于测试的 flavors。
您可以在我们的 E2E 套件中找到更多关于我们如何模拟的信息 here。
我在我的 React Native 项目中使用 Detox 到 运行 端到端测试。我还使用 pretender.js 来模拟我的 API 请求,我正在努力寻找一种方法来了解该应用程序当前是否处于 "testing" 模式。
我正在传递一个 env 变量(并使用 babel-transform-inline-environment-variables
)来判断我是否应该模拟请求,但这在我们的发布版本中中断了 shim.js
。
有什么方法可以告诉 Detox 启动了应用程序并且 运行正在从 JS 中进行测试?理想情况下,我正在寻找在测试时设置的某种变量或从命令行传递下来的东西(TESTING=true react-native start
或 __TESTING__
)
尝试使用 react-native-config. Here is also a good article on Managing Configuration in React Native 和 react-native-config。
我也在此处 animated-button-block-the-detox 给出了答案,其中包含如何在测试期间使用 react-native-config 禁用循环动画的工作示例。
基本思想是为所有不同的构建环境(开发、生产、测试等)创建 .env 配置文件。这些包含您可以从 Javascript、Objective-C/Swift 或 Java.
访问的配置变量然后指定在构建应用程序时要使用的 .env 配置文件:
$ ENVFILE=.env.staging react-native run-ios # bash
这是 package.json 文件的示例,其中 detox 使用 .env 配置文件构建应用程序。
"detox": {
"specs": "e2e",
"configurations": {
"ios.sim.release": {
"binaryPath": "ios/build/Build/Products/Release-iphonesimulator/example.app",
"build": "ENVFILE=.env.production export RCT_NO_LAUNCH_PACKAGER=true && xcodebuild -project ios/example.xcodeproj -scheme example -configuration Release -sdk iphonesimulator -derivedDataPath ios/build",
"type": "ios.simulator",
"name": "iPhone 5s, iOS 10.3"
},
"ios.sim.test": {
"binaryPath": "ios/build/Build/Products/Debug-iphonesimulator/example.app",
"build": "ENVFILE=.env.testing xcodebuild -project ios/example.xcodeproj -scheme example -configuration Debug -sdk iphonesimulator -derivedDataPath ios/build -arch x86_64",
"type": "ios.simulator",
"name": "iPhone 5s, iOS 10.3"
}
}
}
我们正在利用 detox 在 iOS 命令行上使用 --args -detoxServer ... -detoxSessionId ...
调用您的二进制文件并在 android.[=15 的 InstrumentationRegistry 中设置 { detoxServer: ..., detoxSessionId: ... }
=]
我们目前将其暴露给 JS 的方式对于 Whosebug 的回答来说有点过分,但这里有一些示例代码以及 React Native 的文档应该可以帮助您实现目标 - 对于 Android:
// This will throw ClassNotFoundException if not running under any test,
// but it still might not be running under Detox
Class<?> instrumentationRegistry = Class.forName("android.support.test.InstrumentationRegistry");
Method getArguments = instrumentationRegistry.getMethod("getArguments");
Bundle argumentsBundle = (Bundle) getArguments.invoke(null);
// Say you're in your BaseJavaModule.getConstants() implementation:
return Collections.<String, Object>singletonMap("isDetox", null != argumentsBundle.getString("detoxServer"));
在 iOS 上,类似(没有 Objective-C 编译器 ATM):
return @{@"isDetox": [[[NSProcessInfo processInfo] arguments] containsObject: @"-detoxServer"]}
请注意,也可以通过以下方式进行排毒以添加您自己的参数:
detox.init(config, { launchApp: false });
device.launchApp({ newInstance: true, launchArgs: {
myCustomArg: value,
...,
} });
如果能在某个时候将其打磨成一个模块就好了。
Tests/production 了解环境的代码在 IMO 中是混乱的。
我推荐的方法是 为测试创建不同的应用风格 。
如果您使用 React Native,请查看 react-native-repackager 的说明。 或者,Detox docs 也有该部分。 如果您为 Android 编写 Java 代码,请使用 gradle build flavors 创建用于测试的 flavors。
您可以在我们的 E2E 套件中找到更多关于我们如何模拟的信息 here。