Im Jahr 2018 hat Apple zum nächsten (dritten) Mal das Format aktualisiert, in dem Informationen zum Testlauf ausgegeben werden. Wenn es früher eine Plist-Datei war, bei der es sich um eine große XML-Datei handelte, handelt es sich jetzt um eine große Datei mit der Erweiterung xcresult, die über Xcode geöffnet wird und eine Reihe nützlicher Informationen enthält, beginnend mit Testergebnissen mit Protokollen, Screenshots und endend mit der Zielabdeckung , Diagnoseinformationen zur Montage und vieles mehr. Die meisten Entwickler arbeiten nicht jeden Tag damit, aber die Infrastrukturbauer in diesem Artikel finden möglicherweise etwas Nützliches.
Lassen Sie uns die Vor- und Nachteile der Aktualisierung des Formats aufschlüsseln
Was sind die Nachteile der Aktualisierung des Formats?
- Es wiegt viel, was bedeutet, dass der Austausch solcher Dateien mit dem CI-Server langwierig sein kann.
- Wenn es keinen Xcode gibt, wird er nicht geöffnet (es ist zweifelhaft, ob der Tester oder Entwickler keinen Xcode hat, aber immer noch).
- Möglicher Ausfall bestehender Integrationstools. Wieder lernen, mit etwas Neuem zu arbeiten.
Wie ist das neue xcresult bequem?
- Wird nativ über Xcode geöffnet.
- Sie können Kollegen aus der Qualitätssicherung und der Entwicklung übertragen, auch wenn sie kein lokales Projekt haben. Alles öffnet sich und zeigt die Informationen, die Sie benötigen.
- Enthält umfassende Informationen zum Ausführen von Tests.
- Kann nicht nur über Xcode gelesen werden.
Wir werden über den letzten Punkt in diesem Artikel sprechen.
Warum XCResult außerhalb von Xcode lesen?
Wenn in Ihrem Unternehmen CI & CD-Prozesse eingerichtet sind, erfassen Sie wahrscheinlich Messdaten zu Projektaufbauten, Stabilität und Anzahl der Tests sowie natürlich zu Daten zur Testabdeckung. Höchstwahrscheinlich haben Sie irgendwo auf Bamboo, Jenkins, Github Tests oder den CI-Status oder den Prozentsatz der Abdeckung gelöscht. Es ist üblich, solche Vorgänge zu automatisieren und sie seelenlosen Maschinen auszusetzen. Welche Werkzeuge haben wir dafür?
Apple hat zusammen mit der Veröffentlichung des neuen Formats die Tools xcresulttool und xccov veröffentlicht, mit denen Sie vom Terminal aus arbeiten können.
Was können wir mit xccov bekommen?
xcrun xccov view --report --json /path/to/your/TestScheme.xcresult
Die Anforderung gibt umfassende Informationen darüber zurück, welche Abdeckung alle Ziele haben, welche Methoden und welche Klassen abgedeckt sind, wie oft sie ausgeführt wurden und welche Zeilen ausgeführt wurden. Objekte haben eine ähnliche Struktur. Insgesamt gibt es 4 Ebenen: root, target, file, function. Alle Ebenen außer der Wurzel haben ein Namensfeld. Alle Ebenen haben CoveredLines- und LineCoverage-Felder. Es ist wichtig zu beachten, dass Objekte ihren eigenen Kontext haben. Die gesamte Struktur kann in mehreren Protokollen beschrieben werden.
Zusätzlich zu den Protokollen heben wir die folgenden Strukturen hervor: CoverageReport - Aggregator von allem und root. Es enthält ein Array von Zielobjekten. Jedes Ziel enthält ein Array von Dateien, die wiederum ein Array von Funktionen enthalten. Diese Objekte implementieren die oben beschriebenen Protokolle.
Wir interessieren uns für das Feld lineCoverage. Um einen schönen Bericht zu erstellen (wie in Fastlane), wenden Sie sich an das Feld lineCoverage und gehen Sie alle Objekte mit einer einfachen Funktion durch:
Wir erhalten etwas Ähnliches wie:
Coverage Report Summary: • Utils.framework: 51,04 % • NavigationAssistantKit.framework: 0,0 % • NavigationKit.framework: 35,85 % • Logger.framework: 20,32 % • FTCCardData.framework: 78,21 % • FTCFeeSDK.framework: 25,25 % • ErrorPresenter.framework: 2,8 % • MTUIKit.framework: 0,24 % • AnalyticsKit.framework: 47,52 % • EdaSDK.framework: 1,18 % • Alerts.framework: 85,19 % • Resources.framework: 39,16 % • QpayApiTests.xctest: 88,37 % • FTCFeeSDKTests.xctest: 97,91 %
PS Damit die Abdeckung erfasst werden kann, müssen Sie Ihrem Testteam den Parameter -enableCodeCoverage YES hinzufügen oder ihn in den Schemaeinstellungen in Xcode aktivieren.
Welche Möglichkeiten bietet xcresulttool?
Tatsächlich verfügt xcresulttool nicht über eine sehr große Benutzeroberfläche, aber Sie können viele Informationen daraus abrufen, wenn Sie die Struktur von xcresult kennen. Und dies ist eine ganze Datenbank, an die Sie Abfragen stellen können.
Es ist eine gute Idee, mit der Benutzeroberfläche selbst zu beginnen:
xcrun xcresulttool --help OVERVIEW: Xcode Result Bundle Tool (version 16015) USAGE: xcresulttool subcommand [options] ... SUBCOMMANDS: export Export File or Directory from Result Bundle formatDescription Result Bundle Format Description get Get Result Bundle Object graph Print Result Bundle Object Graph merge Merge Result Bundles metadata Result Bundle Metadata version XCResultKit Version
Um die Struktur zu lesen, müssen wir nur den Befehl aufrufen:
xcrun xcresulttool get --path /path/to/your/res.xcresult --format json
Hier erhalten wir das „Inhaltsverzeichnis“ für unser xcresult-Bundle. Was war los, welche Tests wurden ausgeführt, wie lange hat es gedauert, wo sind die Screenshots und Protokolle und was waren die Compiler-Warnungen. Die Hauptsache für uns ist, die Dateikennungen zu erhalten, die Informationen zu den Tests enthalten.
xcrun xcresulttool get --path /path/to/your/res.xcresult --format json --id {id}
Dann erhalten wir Objekte mit Testzielen, Testtypen, die in Testklassen und Testanzüge mit Berichten mit Protokollen, Screenshots, Ausführungszeit und anderen Informationen für jeden Test unterteilt sind.
Leider ist der Grund für das Scheitern der roten Tests nicht leicht herauszufinden - dafür müssen Sie für jeden fehlgeschlagenen Test eine weitere Anfrage stellen (und tatsächlich nicht einmal eine!!
Für die Fehlerzusammenfassung wird dieselbe Anfrage verwendet :
xcrun xcresulttool get --path /path/to/your/res.xcresult --format json --id {id}
Für Absturzprotokolle müssen Sie jedoch --format json aus der Anforderung entfernen, da nur eine Zeichenfolge vorhanden ist und das Tool beim Übergeben des Formatierers einen Fehler generiert.
Was tun als nächstes mit diesem Hintergrundwissen?
Natürlich automatisieren! Wenn Sie diese Befehle ausprobieren, werden Sie feststellen, dass die Antworten gigantisch und schwer zu lesen sind. Wie automatisiere ich? Ruby, Python ... oder Swift?
Natürlich schnell. Jeder moderne iOS-Entwickler weiß es. Das Projekt wird in Xcode geöffnet. Debugging, Syntaxhervorhebung und starke Typisierung sind verfügbar. Kurz gesagt, ein Traum! Besonders mit dem Aufkommen von Swift Package Manager.
Es ist kein Geheimnis, dass wir mit Swift problemlos Prozesse starten, auf Fehler achten und Ausgaben erhalten können. Im einfachsten Fall kommen wir mit einer solchen Konstruktion
zurecht : Jetzt müssen wir das XCResult-Format nur noch mit dem bereits bekannten xcrun xcov und xcrun xcresulttool untersuchen. Zum Lesen der Testabdeckung verwenden wir beispielsweise:
Und um das XCResult-Inhaltsverzeichnis zu erhalten,
müssen wir Folgendes ausführen: Aber wie erhalten wir unsere geschätzten CoverageReport- und XCResult-Strukturen?
Wir erhalten eine Zeichenfolge von Data, die der erste Shell-Befehl an uns zurückgibt und den Inhalt hier einfügt : quicktype.io .
Der Service wird uns etwas Ähnliches wie die erforderlichen schnellen Strukturen generieren. Richtig, Sie können das Ergebnis nicht "wie es ist" verwenden. Wir müssen die Struktur der Antwort genauer untersuchen und Duplikate wegwerfen. Trotzdem ist eine solche Arbeit nicht schwierig. Sie können unnötige Teile verwerfen oder Nachforschungen anstellen und einige grundlegende Bausteine hervorheben:
Beschreiben Sie auf dieser Grundlage den Rest der Strukturen, zum Beispiel:
oder sogar solche Informationen über die Computer, auf denen der Lauf durchgeführt wurde:
Nun, wie benutzt man das?
Es gibt zwei Möglichkeiten, unseren Schaber zu verwenden. Die erste ist ebenso ausführbar, und hier bietet sich die schnelle Parser-Bibliothek von Apple an. Vorher mussten wir die Verarbeitung von Argumenten selbst schreiben, mit Tests abdecken und unterstützen. Jetzt wurde diese Arbeit von einer beliebten Bibliothek übernommen, deren Betreuern vertraut werden kann.
Es gibt zwei Befehle: Abrufen eines Testabdeckungsberichts und Generieren eines Junit-Testberichts. Sie müssen das Projekt erstellen und die Binärdatei ausführen und dabei die erforderlichen Argumente übergeben:
Die zweite Möglichkeit besteht darin, dieses Projekt als Bibliothek zu verwenden. Wir haben ein großes CI-Projekt, das für die Montage, Prüfung und den Versand unseres KoronaPay-Produkts verantwortlich ist. Basierend auf den Ergebnissen des Bestehens von Tests können wir beispielsweise alle Assertionsfehler und Abstürze in Tests wie diesen extrahieren:
Oder rote Tests erhalten, Flaschen analysieren und nur diese neu starten.
Wie zu analysieren? Alles ist einfach und nicht einfach zugleich. Um die Details des Grundes für den Testfehler zu erhalten, müssen Sie eine zusätzliche Anforderung an xcresult mithilfe der Fehlerzusammenfassungskennung senden. Extrahieren Sie dann Informationen aus der Fehlerübersicht. Im Moment haben wir gelernt, wie man in Tests und Fällen von Verbindungsverlust nach Abstürzen sucht und die Gründe herausfindet. Es ist nicht schwer zu verstehen, dass ein Absturz aufgetreten ist. Sie müssen nur die geschätzten Wörter finden, die in failSummaries abgestürzt sind.
Es ist etwas schwieriger, die Ursache des Absturzes herauszufinden.
Hier bietet sich der schnelle Reflexionsmechanismus an, der zwar etwas eingeschränkt ist, sich jedoch hervorragend zur Lösung dieses Problems eignet. Suchen Sie alle Anhangsobjekte mit dem Namen kXCTAttachmentLegacyDiagnosticReportData.
Die ReflectProperties-Methode ist nichts Magisches. Sie ist eine einfache Erweiterung für Mirror:
Eine weitere Kategorie von roten Tests sind Asserts. Im Gegensatz zu Abstürzen können Sie hier nicht einfach nach der Zeichenfolge suchen, die "abgestürzt" ist. Solche Tests können als Verbindungsverlustfälle getarnt werden. Um dem Grund auf den Grund zu gehen, müssen Sie mehrere Arrays im TestCase-Objekt wie folgt durchlaufen:
Für solche Vorgänge verfügt unsere Bibliothek über eine TestsInspector-Entität, die eine Zusammenfassung der roten Tests bereitstellen kann. Daher werden die roten Tests im Bericht nach Merkmalen gruppiert.
Anstelle einer Schlussfolgerung
Wie alle in diesem Bereich vorhandenen Lösungen ist unser Scrapper kein erschöpfendes Werkzeug für die Analyse von xcresult. Um alle Informationen zu erhalten und Screenshots anzuzeigen, müssen Sie xcresult noch über Xcode öffnen. Wenn Sie jedoch CI konfiguriert haben und die Testergebnisse schnell sehen möchten, werden Sie höchstwahrscheinlich die Kombination von junit und unserem xcscrapper in ihrem wahren Wert schätzen können.