怎么告诉Detox正在运行测试?

时间:2017-12-07 01:45:35

标签: react-native detox

我使用Detox在我的React Native项目中运行端到端测试。我还使用pretender.js来模拟我的API请求,并且我正在努力寻找一种方法来了解应用程序当前是否正在测试"测试"模式。

我传递了一个env变量(并使用babel-transform-inline-environment-variables)来告诉我是否应该模拟请求但是在我们的发布版本中中断了shim.js

有没有办法告诉Detox推出应用程序&从JS内部运行测试?理想情况下,我在测试时寻找某种变量集或从命令行(TESTING=true react-native start__TESTING__传递下来的东西)

3 个答案:

答案 0 :(得分:6)

尝试使用react-native-config。以下是使用react-native-config的Managing Configuration in React Native上的一篇好文章。

我还在这里给出了答案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"
    }
  }
}

答案 1 :(得分:2)

我们正在利用detox在iOS命令行上使用--args -detoxServer ... -detoxSessionId ...调用二进制文件并在android中调用InstrumentationRegistry中的{ detoxServer: ..., detoxSessionId: ... }这一事实。

我们目前向JS公开的方式对于StackOverflow的答案来说有点多,但是这里有一些示例代码以及本机的文档应该让你到那里 - 对于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,
  ...,
} });

在某些时候将它打磨成模块会很棒。

答案 2 :(得分:0)

了解环境的测试/生产代码是混乱的IMO 我推荐这样做的方法是为测试创建不同的应用程序风味

如果您使用React Native,请查看react-native-repackager的说明。 或者,Detox docs也有该部分。 如果您为Android编写Java代码,请使用gradle build flavors来创建测试版本。

您可以在我们的E2E套件here中找到更多关于我们模拟的内容。