8.7 版本发布—WinterCG 兼容性第一部分
了解更多

在 GitHub 上查看

@nativescript/detox

轻松地将 Detox 端到端测试添加到您的 NativeScript 应用中!

iOS 演示Android 演示

目录

  1. 安装
  2. 全局设置
  3. 项目设置
  4. 使用
  5. 运行测试
  6. 故障排除

安装

cli
npm install @nativescript/detox

全局设置

完整的设置要求可以在 此处 找到,但最低限度的设置步骤如下

安装 Detox 命令行工具 (detox-cli)

cli
npm install -g detox-cli

安装 applesimutils (iOS)

cli
brew tap wix/brew
brew install applesimutils

项目设置

将 Detox 包安装到您的 NativeScript 项目中

cli
npm install detox --save-dev

安装 Jest

cli
npm install jest jest-cli jest-circus --save-dev --no-package-lock

初始化 Detox

cli
detox init -r jest

如果一切顺利,您应该已设置好以下内容:

  • 项目根目录中的 e2e/ 文件夹
  • 一个 e2e/jest.config.js 文件
  • 一个 e2e/starter.test.js 文件; 示例

项目根目录中还应该有一个名为 .detoxrc.js 的 Detox 配置文件。

配置 Detox

必须配置 Detox 以了解 iOS 和 Android 应用二进制文件的路径以及要使用的模拟器/仿真器。

打开 .detoxrc.js 并对 appsdevices 下进行以下修改。

  • binaryPath:指定应用二进制文件的路径(可能类似于以下内容)。

    • iOS:platforms/ios/build/Debug-iphonesimulator/[APP_NAME].app
    • Android:platforms/android/app/build/outputs/apk/debug/app-debug.apk
  • build:指定 iOS 和 Android 的构建命令。

    • iOS:ns build ios --env.e2e
    • Android:ns build android --detox --env.e2e
  • 设备:

    • iOS:"type": "iPhone 14 Pro Max"
    • Android:"avdName": "Pixel_4_API_30"(使用 emulator -list-avds 列出 Android 模拟器)

这是一个 Detox 配置的完整示例

js
/** @type {Detox.DetoxConfig} */
module.exports = {
  testRunner: {
    args: {
      $0: 'jest',
      config: 'e2e/jest.config.js',
    },
    jest: {
      setupTimeout: 120000,
    },
  },
  apps: {
    'ios.debug': {
      type: 'ios.app',
      binaryPath: 'ios/build/Build/Products/Debug-iphonesimulator/YOUR_APP.app',
      build:
        'xcodebuild -workspace platforms/ios/YOUR_APP.xcworkspace -scheme YOUR_APP -configuration Debug -sdk iphonesimulator -derivedDataPath ios/build',
    },
    'ios.release': {
      type: 'ios.app',
      binaryPath:
        'ios/build/Build/Products/Release-iphonesimulator/YOUR_APP.app',
      build:
        'xcodebuild -workspace platforms/ios/YOUR_APP.xcworkspace -scheme YOUR_APP -configuration Release -sdk iphonesimulator -derivedDataPath ios/build',
    },
    'android.debug': {
      type: 'android.apk',
      binaryPath: 'platforms/android/app/build/outputs/apk/debug/app-debug.apk',
      build:
        'cd platforms/android ; ./gradlew assembleDebug assembleAndroidTest -DtestBuildType=debug ; cd -',
      reversePorts: [8081],
    },
    'android.release': {
      type: 'android.apk',
      binaryPath:
        'platforms/android/app/build/outputs/apk/release/app-release.apk',
      build:
        'cd platforms/android ; ./gradlew assembleRelease assembleAndroidTest -DtestBuildType=release ; cd -',
    },
  },
  devices: {
    simulator: {
      type: 'ios.simulator',
      device: {
        type: 'iPhone 14 Pro Max',
      },
    },
    attached: {
      type: 'android.attached',
      device: {
        adbName: '.*',
      },
    },
    emulator: {
      type: 'android.emulator',
      device: {
        avdName: 'Pixel_3a_API_30_x86',
      },
    },
  },
  configurations: {
    'ios.sim.debug': {
      device: 'simulator',
      app: 'ios.debug',
    },
    'ios.sim.release': {
      device: 'simulator',
      app: 'ios.release',
    },
    'android.att.debug': {
      device: 'attached',
      app: 'android.debug',
    },
    'android.att.release': {
      device: 'attached',
      app: 'android.release',
    },
    'android.emu.debug': {
      device: 'emulator',
      app: 'android.debug',
    },
    'android.emu.release': {
      device: 'emulator',
      app: 'android.release',
    },
  },
}

注意

默认的 NativeScript Android 项目使用 17 作为最低 SDK 版本,但 Detox 要求 >=21。删除或修改 App_Resources/Android/app.gradle 中的 minSdkVersion

允许本地网络连接 (**仅限 iOS**)

根据您的设置,iOS 可能无法立即与 Detox 通信。在这种情况下,您需要将以下内容添加到您的 Info.plist 文件中以允许本地网络请求。

xml
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsLocalNetworking</key>
    <true/>
</dict>

使用

通读 本教程,该教程由 Detox 撰写,介绍如何编写您的第一个测试。针对 React Native 应用指定的大多数内容也适用于 NativeScript 应用。

从打开 e2e/firstTest.e2e.js 中的默认测试场景开始。

javascript
describe('Example', () => {
  beforeEach(async () => {
    await device.reloadReactNative()
  })

  it('should have welcome screen', async () => {
    await expect(element(by.text('Sergio'))).toBeVisible()
  })
})

此示例创建了一个名为 Example 的测试场景,并在其中包含一个名为 should have welcome screen 的单个测试。

匹配器

Detox 使用 [匹配器]https://github.com/wix/Detox/blob/master/docs/api/matchers.md) 在您的 UI 中查找要与其交互的元素。

您可以使用 NativeScript 的 testID 属性 通过 Detox 的 by.id() 匹配器查找您的 UI 元素。

示例

xml
<Button text="Tap Me!" testID="testButton"></Button>
javascript
await element(by.id('testButton')).tap()

操作

找到 UI 元素后,您可以对其使用 操作,例如 tap() 来模拟用户交互。

您现在应该能够编写测试来模拟用户行为并测试预期结果。

运行测试

构建

使用以下命令构建您的应用以进行测试,其中 -c 标志的值为 .detoxrc.jsconfiguration 对象的任何属性

cli
detox build -c ios.sim.debug|android.emu.debug

测试

使用以下命令运行您的测试

cli
detox test -c ios.sim.debug|android.emu.debug

**注意:**如果使用 Android 模拟器,Detox 将在测试运行时禁用动画。动画在完成后将保持禁用状态。当您积极开发时,这可能非常烦人。您可以通过从项目的目录 ./node_modules/.bin/enable-animations 运行此辅助脚本来重新启用动画。

为了使这更容易,我建议将这些脚本添加到您的 package.json 中。

json
{
  "scripts": {
    "e2e:android:build": "android.att.debug",
    "e2e:android:build:debug": "ns clean; ns build android; detox build -c android.emu.debug",
    "e2e:android:debug:test": "detox test -c android.emu.debug && ./node_modules/.bin/enable-animations",
    "e2e:ios:build:debug": "detox build -c ios.sim.debug --env.e2e",
    "e2e:ios:test": "detox test -c ios.sim.debug"
  }
}

现在要构建和运行测试,您将运行

Android

cli
npm run e2e:android:build:debug
npm run e2e:android:test:debug

iOS

cli
npm run e2e:ios:build:debug
npm run e2e:ios:test

故障排除

Detox 要求最低 SDK 版本为 21,因此如果您收到以下错误,请将 App_Resources/Android/app.gradle 中的 minSdkVersion 更改为 21。

bash
Execution failed for task ':app:processDebugAndroidTestManifest'.
Manifest merger failed : uses-sdk:minSdkVersion 17 cannot be smaller than version 18 declared in library [com.wix:detox:17.6.1] /Users/user/.gradle/caches/transforms-2/files-2.1/91a3acd87d710d1913b266ac114d7001/jetified-detox-17.6.1/`AndroidManifest.xml` as the library might be using APIs not available in 17
        Suggestion: use a compatible library with a minSdk of at most 17,
                or increase this project's minSdk version to at least 21,
                or use tools:overrideLibrary="com.wix.detox" to force usage (may lead to runtime failures)

Command ./gradlew failed with exit code 1

测试期间无法找到元素

在 NativeScript <8.2 中,testID 属性不可用。相反,您应该使用 automationText 属性。

**添加资源 ID (**仅限 Android**)** 为了在 NativeScript 中使用 automationText 属性,必须通过添加自定义资源 ID 来启用它。在 App_Resources/Android/src/main/res/values/ 中创建一个名为 ids.xml 的文件并添加以下内容

xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item type="id" name="nativescript_accessibility_id"/>
</resources>

许可证

Apache 许可证 2.0 版

上一页
调试 iOS
下一页
方向