デトックスとAppium:React Nativeの自動インターフェイステスト





なじみのないモバイル環境



私は、おそらくあなたのように、ネイティブモバイルアプリケーションの開発者としてではなく、JavaScript開発者としてReact Nativeに来ました。 独自のニュアンスとトリックを備えたまったく新しい世界。



勉強する最も重要なトピックの1つはテストです。 ユニットテストですべてが多かれ少なかれ明確になったら、インターフェーステストとエンドツーエンドテストで何をすべきか? iOS Android 市場にはさまざまな種類のデバイスが混在しています。



技術自体は比較的新しいという事実にもかかわらず、それはまだモバイル環境であり、多くはネイティブ側から借用し、学ぶ必要があります。



開発者としての生活を楽にするために、注意を払う価値のある2つのフレームワークを簡単に確認します。



アピウム



舞台裏でSelenium WebDriverを使用するAppiumは、ネイティブモバイルアプリケーションの開発者の巨大なコミュニティを持つ強力なフレームワークです。 React.jsの前にリリースされ、リーダーであり、同等のものはありません。



Appiumの使用は非常に簡単です。 npmを使用して、パッケージ「appium」および「appium-doctor」をインストールすると、プロジェクトの一部としてグローバルに実行できます。 「appium-doctor」チームは、作業を開始する前に他に何をインストールして構成する必要があるかを教えてくれ、可能であれば、欠陥の修正を支援します。 すべてが決定したら、パッケージがインストールされ、Jest構成が適切に配置されたら、Appiumサーバーとテストを実行できます。



構成の詳細については説明しませんが、構成の簡単なテストは次のようになります(コメントを追加)。



/*  selenium webdriver  node */ import wd from 'wd' /* 60  ,    ,   */ jasmine.DEFAULT_TIMEOUT_INTERVAL = 60000 /*   Appium.    ,  localhost */ const URL = 'localhost' const PORT = 4723 /*   webdriver */ const driver = wd.promiseChainRemote(URL, PORT) /*  . *    Appium, *   ,   . */ const capabilities = { platformName: 'iOS', //  Android platformVersion: '12.1', //   deviceName: 'iPhone 8', //  “Android Emulator”     automationName: 'XCUITest', //   (UIAutomator2  Android) app: '/path/to/.app' //   .app ( Android  .apk) } beforeAll(async () => { try { //  ,    await driver.init(capabilities) //   await driver.sleep(4000) //  ,       ,   ! } catch(err) { console.log(err) //  ,   ,    } }) afterAll(async () => { try { await driver.quit() //   } catch(err) { console.error(err) } }); /* Jest,   ,   Appium! *     ,    * 'topLabel'  'subLabel'  *       Appium */ describe("Home Screen landing", () => { test("render search screen", async () => { let topLabel = await driver.elementById('topLabel') let subLabel = await driver.elementById('subLabel') expect(await topLabel.text()).toBe("OK") expect(await subLabel.text()).toBe(" ") }) })
      
      





テスト自体は、テキスト「OK」と「メイン画面」が画面上にあるかどうかを確認する最後の数行です。 ご覧のとおり、テストは特別なものではなく、同じJestです。 Appiumサイトのドキュメントには、JavaScriptの例を含むフレームワークのすべての機能が記載されています。



await driver.sleep(4000)



のみを嫌います。 残念ながら、テストではアプリケーションで何が起こっているのかわかりません。 いわゆる「ブラックボックス」またはブラックボックス。 Nodeでコードを書いていて、httpリクエストの前に、promiseまたはcallbackを使用する代わりにタイマーを設定すると想像してください。 ここに、UIテストの脆弱性があります。



この簡単なテストでは、アプリケーションを起動するまで4秒待機します。 時間が経つにつれて、テストの数が増えるにつれて、タイマーをより頻繁に設定します-HTTPリクエスト、アニメーション、React Native自体-ネイティブコードとJavaScriptの間のブリッジは状況を複雑にします。



「ブラックボックス」、内部構造にアクセスせずにアプリケーションのアセンブリがあります。





Appiumの何が好きですか?





Appiumが気に入らない点







3つのタブに注意してください:Appiumサーバーログ、metro bundler、およびテスト自体。





デトックス



Wix DetoxはAppiumと同様に機能します。 主な違いは、「グレーボックス」戦略に従ったテストです。 Detox開発者のタスクの1つは、脆弱性の問題を解決することでした-アプリケーションのタスクは、前のタスクが終了し、アプリケーションが解放されるまで開始されません。 これは、EarlGreyという名前で作成された別のフレームワークのおかげで可能になりました。



Appiumと同様に、設定を行います。



 /*     package.json,   */ const detox = require("detox"); const config = require("./package.json").detox; /*  Jest */ const adapter = require("detox/runners/jest/adapter"); /* , *   Jest */ jest.setTimeout(120000); jasmine.getEnv().addReporter(adapter); beforeAll(async () => { /*   */ await detox.init(config); }); /* beforeEach  afterEach   Detox, *   Jest *    */ beforeEach(async function() { await adapter.beforeEach(); }); afterAll(async () => { await adapter.afterAll(); await detox.cleanup(); });
      
      





package.jsonでの設定:



 "detox": { "configurations": { "ios.detox": { //   iOS (  detox test -c ios.detox) "binaryPath": "path/to/.app", "build": "xcodebuild -workspace ios/app.xcworkspace -scheme scheme -configuration Debug -sdk iphonesimulator -derivedDataPath ios/build", //  workspace  project.      debug  production (release). "type": "ios.simulator", "name": "iPhone 8" //   }, "android.detox": { //   Android (  detox test -c android.detox) "binaryPath": "path/to/.apk", "build": "cd android && ./gradlew assembleDebug assembleAndroidTest -DtestBuildType=debug && cd ..", //      debug  production (release). "type": "android.emulator", "name": "Pixel_2_API_28" //  . “adb devices”     Android } }, "test-runner": "jest", "runner-config": { "setupTestFrameworkScriptFile" : "./detox.init.js", //   "testEnvironment": "node", "testRegex": "(.*|\\.(ui))\\.(ts|tsx)$" //  ,     } "specs": "./__tests__/" //    }
      
      





テストの記述はAppiumの記述と同じくらい簡単ですが、デトックスの機能と制限を使用します。



「グレーボックス」、アプリケーションのアセンブリおよび内部構造へのアクセスがあります。





デトックスの好きなところ





あなたがデトックスについて好きではないもの





もろさ



デトックスは「グレーボックス」の原理を使用していますが、脆弱性は依然として存在します。 テキスト入力とスワイプを使用したテストは、10のうち1つのケースで正常に機能しませんでした。インターフェイステストで100%を確認することはできません。



スピード



Appiumは、手動で設定された「.sleep」タイマーを「遅く」します。この場合、すべてが同期しているため、デトックスが勝ちます。 一般に、両方のプラットフォームで多数の同一のテストを作成しなかったため、私は自分の結論を出しません。 この記事のために作成された30秒のテストと簡単なテストでは、デトックスのパフォーマンスが数秒速くなりました。 iOSとAndroidの2つの異なるプラットフォームを見ると、テストは同時に+-かかりました。 覚えておくべき主なことは、インターフェイステストにはかなり長いユニットテストが必要であることです。



何を選ぶか



私はまだ両方のフレームワークを研究しており、それらのすべての利点を理解するには時間がかかりますが、現時点では、JavaScript開発者としてDetoxを選択しています。



両方試してみてください。幸いなことに、2つしかありません。 それはすべて、作業中のアプリケーションとチームに依存します。



開発チームのインターフェイステスト-開発者は、デトックスを試してください。 より複雑なエンドツーエンドのテスト-豊富なAPI機能とBrowserStack、MS AppCenter、AWS DeviceFarmプラットフォームでのサポートを備えたAppiumを詳しく調べることをお勧めします。



参照資料



多くの有用なリソースと記事がありますが、残念ながら英語です。 私がお勧めする最初のこと。 サイト。



アピウム



デトックス



All Articles