2016-05-11 2 views
10

Ich versuche einige UI-Tests mit Espresso auf meiner React Native Android-Anwendung zu machen, um Screengrab von Fastlane zu verwenden.Wie wird der Espresso UI Test für Native React Native verwendet?

Ich habe this tutorial gefolgt, um React Native in eine vorhandene App zu integrieren, um einen Test schreiben zu können. Aber als ich anfing, meinen UI-Test zu schreiben, konnte ich nicht herausfinden, was ich schreiben und wie ich eine Komponente targetieren und beispielsweise darauf klicken sollte.

Ich fand this Post, wo jemand ein Beispiel geben, wie Espresso Test für React Native schreiben, aber es funktioniert nicht für mich ... Keiner meiner Komponente Ressourcen-ID-Set, so weiß ich nicht wie Führen Sie eine Aktion für meine Anwendung aus.

Wenn jemand mir helfen könnte, einen UI-Test mit Espresso auf einer React Native App zu schreiben oder mir eine andere Lösung zu geben, um einen automatisierten Screenshot meiner Android-Anwendung zu machen, wird das großartig.

Wenn Sie Fragen haben, lassen Sie es mich wissen.

Antwort

9

Espresso

Momentan gibt es keine Möglichkeit, Ressource-ID mit reagieren-native zu setzen, so komplexe Aktionen Sie einen Code schreiben müssen, machen, (wie für Elemente warten), andere Dinge scheinen recht gut funktionieren über Androider Studio 'Rekord Espresso Test' Knopf.

  1. Verwendung prop accessibilityLabel als ID für Elemente (z. B. "elementId")
  2. Verwendung onView(allOf(withContentDescription("elementId"), isDisplayed())) Element auf diesem Element
  3. peform Aktionen (wie element.perform(click()))

Hier finden Sie vollständige Prüfung https://gist.github.com/cybergrind/0a2ad855352a5cd47cb5fb6a486c5eaa

Appium

Wenn Sie wollen einfach nur Aktionen durchführen und Screenshots zu erfassen, können Sie dies mit appium:

  1. Verwendung accessibilityLabel als id prop für Elemente
  2. in Web-Treiber verwenden waitForElementByAccessibilityId
  3. Capture Screenshots mit saveScreenshot (‘ out.png ') -> dies schaffen 'out.png im Verzeichnis' Datei, wo Sie Tests

in appium ausgeführt haben schließlich Sie so etwas wie (js Beispiel haben):

iOS vs Android accessibilityLabels

Es scheint, dass für Android du frei bist accessibiltyLabel auf ein beliebiges Element zu verwenden (wie Text, Ansicht und so weiter), aber iOS nicht gesetzt Zugänglichkeit zu allen Elementen wie Adnroid.

Wenn Sie Etikett auf Text gesetzt wird es nicht gleich Ihr Label

<Text accessibilityLabel="my_text">content</Text> 

geben Sie gleich content auf iOS beschriften, so dass im Grunde können Sie einfach festlegen accessible Attribut auf Ihrem Textknoten für diese Plattform

<Text accessible>content</Text> 

Das gleiche gilt für View - iOS wird Ihre Etiketten ignorieren.

Bis jetzt funktionieren nicht viele Elemente auf iOS mit Ihren benutzerdefinierten Eingabehilfen.

Hier ist eine Liste von Elementen, die Sie Anwendung testen für plattformübergreif reagieren-native Tests verwenden können

Sie verwenden können:

  • TouchableHighlight - nur funktioniert gleiche auf iOS und Android, können Sie set accessibilityLabel
  • Text - accessibilityLabel als innere Test sein sollte gleiche + Sie erreichbar Attribut gesetzt haben

wird nicht funktionieren (für beide Plattformen insgesamt):

  • View

P. S. wir haben nicht alle möglichen Elemente noch getestet, so dass Ihre Ergebnisse für andere Elemente hinzufügen oder für unsere Ergebnisse

Debuggen

Sie können Quelle Wurzelelement, Druck warten, und es als XML für Debug-Zwecke lesen (für webdriver.io: http://webdriver.io/api/property/getSource.html)

5

Ich habe eine PR gegen reactive-native, um die richtige Unterstützung für resource-id hinzuzufügen. Check it out und up-vote bitte: https://github.com/facebook/react-native/pull/9942

Sobald das in testID verschmolzen ist resource-id fügt so lange, wie die Id in res/values/ids.xml definiert ist.

0

Derzeit, wenn Sie testID in Ihrer Reaktionsschicht setzen, die in ein Tag in Android übersetzt werden.

mit Espresso Dann können Sie die mitgelieferte ViewMatcher withTagValue link

Dann nutzen Sie alles, was Sie tun müssen, um einen Blick zu finden

onView(withTagValue(is((Object) tagValue))).perform(click()); 
ist