插件
Detox
@nativescript/detox
轻松地将 Detox 端到端测试添加到您的 NativeScript 应用中!
iOS 演示 | Android 演示 |
目录
安装
npm install @nativescript/detox
全局设置
完整的设置要求可以在 此处 找到,但最低限度的设置步骤如下
安装 Detox 命令行工具 (detox-cli
)
npm install -g detox-cli
安装 applesimutils (iOS)
brew tap wix/brew
brew install applesimutils
项目设置
将 Detox 包安装到您的 NativeScript 项目中
npm install detox --save-dev
安装 Jest
npm install jest jest-cli jest-circus --save-dev --no-package-lock
初始化 Detox
detox init -r jest
如果一切顺利,您应该已设置好以下内容:
- 项目根目录中的
e2e/
文件夹 - 一个
e2e/jest.config.js
文件 - 一个
e2e/starter.test.js
文件; 示例
项目根目录中还应该有一个名为 .detoxrc.js
的 Detox 配置文件。
配置 Detox
必须配置 Detox 以了解 iOS 和 Android 应用二进制文件的路径以及要使用的模拟器/仿真器。
打开 .detoxrc.js
并对 apps
和 devices
下进行以下修改。
binaryPath
:指定应用二进制文件的路径(可能类似于以下内容)。- iOS:
platforms/ios/build/Debug-iphonesimulator/[APP_NAME].app
- Android:
platforms/android/app/build/outputs/apk/debug/app-debug.apk
- iOS:
build
:指定 iOS 和 Android 的构建命令。- iOS:
ns build ios --env.e2e
- Android:
ns build android --detox --env.e2e
- iOS:
设备
:- iOS:
"type": "iPhone 14 Pro Max"
- Android:
"avdName": "Pixel_4_API_30"
(使用emulator -list-avds
列出 Android 模拟器)
- iOS:
这是一个 Detox 配置的完整示例
/** @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
文件中以允许本地网络请求。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsLocalNetworking</key>
<true/>
</dict>
使用
通读 本教程,该教程由 Detox 撰写,介绍如何编写您的第一个测试。针对 React Native 应用指定的大多数内容也适用于 NativeScript 应用。
从打开 e2e/firstTest.e2e.js
中的默认测试场景开始。
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 元素。
示例
<Button text="Tap Me!" testID="testButton"></Button>
await element(by.id('testButton')).tap()
操作
找到 UI 元素后,您可以对其使用 操作,例如 tap()
来模拟用户交互。
您现在应该能够编写测试来模拟用户行为并测试预期结果。
运行测试
构建
使用以下命令构建您的应用以进行测试,其中 -c
标志的值为 .detoxrc.js
中 configuration
对象的任何属性
detox build -c ios.sim.debug|android.emu.debug
测试
使用以下命令运行您的测试
detox test -c ios.sim.debug|android.emu.debug
**注意:**如果使用 Android 模拟器,Detox 将在测试运行时禁用动画。动画在完成后将保持禁用状态。当您积极开发时,这可能非常烦人。您可以通过从项目的目录 ./node_modules/.bin/enable-animations
运行此辅助脚本来重新启用动画。
为了使这更容易,我建议将这些脚本添加到您的 package.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
npm run e2e:android:build:debug
npm run e2e:android:test:debug
iOS
npm run e2e:ios:build:debug
npm run e2e:ios:test
故障排除
Detox 要求最低 SDK 版本为 21
,因此如果您收到以下错误,请将 App_Resources/Android/app.gradle
中的 minSdkVersion
更改为 21。
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 version="1.0" encoding="utf-8"?>
<resources>
<item type="id" name="nativescript_accessibility_id"/>
</resources>
许可证
Apache 许可证 2.0 版