Wie lassen Sie die app wissen, ob Ihre Ausführung von Unit-tests in einer reinen Swift-Projekt?
Eine lästige Sache, die bei der Ausführung von tests in XCode 6.1 ist, dass die gesamte app auf ausführen und starten Sie Ihre storyboard und root viewController. In meiner app das betreibt einige server Aufrufe, holt API-Daten. Jedoch, ich will nicht die app, um dies zu tun, wenn die Ausführung des tests.
Mit preprocessor macros gegangen, was ist die beste für mein Projekt bewusst sein, dass es ins Leben gerufen wurde die Durchführung von tests und nicht mit einem normalen Start? Ich Sie laufen ganz normal mit CMD+U und auf einen bot.
Pseudo-code wäre:
//Appdelegate.swift
if runningTests() {
return
} else {
//do ordinary api calls
}
InformationsquelleAutor der Frage hakonbogen | 2014-12-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Anstatt zu überprüfen, ob die tests ausgeführt werden, um zu vermeiden Nebenwirkungen, könnten Sie die tests ausführen, ohne die host-Anwendung selbst. Gehen Sie zu Projekt-Einstellungen -> wählen Sie das test-target -> allgemein -> Testen -> Host-Anwendung -> wählen Sie 'Keine'.
Nur denken Sie daran, alle Dateien, die Sie brauchen, um die tests auszuführen, sowie Bibliotheken, die normalerweise für den Host-Anwendung target.
InformationsquelleAutor der Antwort Eivind Rannem Bøhler
Elvind die Antwort ist nicht schlecht, wenn Sie haben wollen, was früher als Reine "Logik-Tests". Wenn Sie möchten dennoch führen Sie mit Ihrem host-Anwendung noch bedingt ausführen oder nicht ausführen von code, je nachdem, ob tests ausgeführt werden, können Sie die folgenden verwenden, um festzustellen, ob ein test-bundle gespritzt wurden:
Habe ich eine bedingte Kompilierung Flagge wie beschrieben in dieser Antwortso dass die Laufzeit Kosten fallen nur in debug-builds:
Bearbeiten Swift 3.0
InformationsquelleAutor der Antwort Michael McGuire
Ich diese in application:didFinishLaunchingWithOptions:
InformationsquelleAutor der Antwort Jesse
Ich glaube, es ist völlig legitim, wissen zu wollen, wenn Sie die Ausführung in einem test-oder nicht. Es gibt zahlreiche Gründe, warum, die hilfreich sein können. Zum Beispiel, bei der Ausführung von tests, habe ich wieder früh von der Anwendung-hat/wird-beenden-starten-Methoden in der App Delegieren, so dass die tests starten schneller-code nicht relevant zu meinem unit-test. Doch, ich kann nicht gehen, Reine "Logik" - test, für eine Vielzahl von anderen Gründen.
Ich verwendet, um von der ausgezeichneten Technik, beschrieben von @Michael McGuire oben. Allerdings bemerkte ich, aufgehört zu arbeiten für mich rund um Xcode 6.4/iOS8.4.1 (vielleicht brach es früher).
Nämlich, ich sehe nicht, das XCInjectBundle mehr, wenn ein test innerhalb einer test-target für einen Rahmen von mir. Das heißt, ich bin innerhalb einer test-target-tests ein framework.
So, unter Verwendung des Ansatzes @Fogmeister schlägt vor, jeden meiner test-Systeme nun setzt eine Umgebungsvariable, die ich überprüfen kann.
Dann, hier einige Codes die ich auf eine Klasse namens
APPSTargetConfiguration
dass die Beantwortung dieser einfachen Frage für mich.Den ein Nachteil bei diesem Ansatz ist, dass wenn Sie führen Sie einen test aus, Ihre Haupt-app Schema, wie XCTest mit denen Sie zu tun, (nicht die Auswahl einer von Ihren test-Systeme), werden Sie nicht erhalten diese Umgebungsvariable gesetzt werden.
InformationsquelleAutor der Antwort idStar
Anderen, meiner Meinung nach einfacheren Weg:
Bearbeiten Sie Ihr Schema zu übergeben, die einen booleschen Wert als Start-argument zu Ihrem app. Wie diese:
Alle launch-Argumente werden automatisch Hinzugefügt, um Ihre
NSUserDefaults
.Können Sie jetzt auch die BOOL wie:
InformationsquelleAutor der Antwort iCaramba
Können Sie pass-Laufzeitumgebung die Argumente in die app-je nach Regelung hier...
Aber ich würde Fragen, ob oder nicht es wirklich benötigt wird.
InformationsquelleAutor der Antwort Fogmeister
Nutzung
InformationsquelleAutor der Antwort neoneye
Hier ist ein Weg, ich habe mit im Swift 4 /Xcode 9 für unsere unit-tests. Es basiert auf Jesse ' s Antwort.
Es ist nicht einfach, um zu verhindern, dass das storyboard geladen, aber wenn Sie fügen Sie diese an den Anfang didFinishedLaunching, dann macht es sehr klar, um Ihre Entwickler, was Los ist:
(Sie natürlich tun sollten nicht, wie dies für UI-tests, wo Sie wollen, die app zu starten, als normal!)
InformationsquelleAutor der Antwort JosephH
Kombinierte Ansatz von @Jessy und @Michael McGuire
(Als akzeptierte Antwort wird dir nicht helfen bei der Entwicklung eines Rahmens)
So, hier ist der code:
InformationsquelleAutor der Antwort faviomob
Einige dieser Ansätze funktionieren nicht mit UITests und wenn du im Grunde bist-Tests mit dem app-code selbst (statt der Zugabe von speziellen code in ein UITest Ziel).
Landete ich setzen einer environment-Variablen in der test-setUp-Methode:
Beachten Sie, dass dies sicher für meine Tests, da ich derzeit nicht verwenden, jede andere launchEnvironment Werte; wenn Sie es tun, Sie würde natürlich wollen, kopieren Sie eine vorhandene Werte zuerst.
Dann in meiner app code, schaue ich mir für diese Umgebungsvariable, wenn Sie/, wenn Sie ausschließen will ich einige Funktionen bei einem test:
Hinweis - vielen Dank für RishiG ' s Kommentar gab mir diese Idee, ich habe Sie nur erweitert, um ein Beispiel.
InformationsquelleAutor der Antwort ODB