2017-06-21 3 views
0
  1. Werden XCTests parallel ausgeführt (dh dürfen mehrere Tests gleichzeitig ausgeführt werden?). Betrachten Sie eine einzelne Testdatei mit mehreren Tests und mehrere Testdateien mit jeweils mehreren Tests.
  2. Wenn Kerndaten in einigen der getesteten Komponenten verwendet werden und Tests parallel ausgeführt werden können, wie lautet die richtige Methode für die Verwendung der Kerndaten in den Tests? Zum Beispiel sollte der Test mit einem 'sauberen' Datenspeicher beginnen und dann Objekte nach Bedarf hinzufügen und dann basierend auf dem Inhalt des Speichers getestet werden. Es klingt, als ob alle denselben Kontext/Speicher für verwaltete Objekte verwenden, dass sie auf die gleichen Daten zeigen und somit Gefahr laufen, miteinander zu kollidieren.

Antwort

1
  1. Jedes XCTest Verfahren wird sequentiell (ein im Moment) laufen

  2. ich oft Core Data Um zu testen, im Speicher Persistance Shop erstellen, hier gibt es gute snipped haben: code diese Art von MOC mit Sie haben immer klare Kerndatenzustand

Bitte überprüfen Sie diese auch Rays tutorial

0

1. Testfälle werden nacheinander ausgeführt und testen ebenfalls Dateien.

2.Der Kontext für kontextbezogene Stammdaten sollte durch Importieren Ihrer App in Ihre Testfalldatei (@testable import product_name) und Zugriff auf die Kerndatumsobjekte in Testfalldateien erstellt werden. Alle Testfälle werden unabhängig voneinander ausgeführt. Also wie Sie erwähnt, sollte der Test mit einem 'sauberen' Datenspeicher beginnen, und fügen Sie dann Objekte nach Bedarf, dann auf der Basis der Inhalte der store.yes getestet werden, das ist richtig way.make sicher Kerndaten verwalteten Objekte sind erstellt in Testdateien. Testfälle können im Abschnitt Testnavigation getestet werden.

1

Tests werden seriell auf dem Hauptthread des Testläuferprozesses ausgeführt. Nichts schützt Sie jedoch automatisch davor, asynchrone Aktionen zu starten, die bis zur Ausführung eines zukünftigen Testfalls reichen könnten.

Zum Beispiel wird ein Anruf an perfomBlock auf einem NSManagedObjectContext nicht garantiert, um vor dem nächsten Test ausgeführt zu werden. Dies kann besonders problematisch sein, wenn Ihre Tests Speichervorgänge auslösen, die sich asynchron zum übergeordneten Kontext von verwalteten Objekten ausbreiten.

Ich habe es wertvoll gefunden, einfach testbaren Code zu schreiben, was bedeutet, die verwalteten Objektkontexte oder andere Abhängigkeiten in den zu testenden Code zu injizieren. Das sollte es Ihnen ermöglichen, für jeden Testfall einen unabhängigen Core Data-Stack zu erstellen, anstatt unerwartet einen globalen Status in einem einzigen Kontext zu teilen. Dann müssen Sie sich nur vor allzu permissiven Benachrichtigungsbeobachtern in Acht nehmen, die sich nicht darum kümmern, den Absender einer NSNotification (d. H. Bei der Beobachtung NSManagedObjectContextDidSaveNotification s) zu überprüfen.

+0

"Zum Beispiel kann ein Aufruf von perfomBlock auf einem NSManagedObjectContext nicht garantiert werden, bevor der nächste Test gestartet wird." Was ist, wenn Sie im Test Erwartungen haben? Wird der Test nicht warten, bis die Erwartung erfüllt ist? – Zach

+0

Möglicherweise, wenn Sie 'XCTestExpectation' oder eine äquivalente asynchrone Assertion verwenden. Zum Beispiel können Sie möglicherweise eine Test-TearDown-Methode schreiben, die darauf wartet, dass asynchrone Ereignisse beendet werden, bevor Sie mit dem nächsten Test fortfahren. Wie Sie feststellen, dass solche Synchronisierungsaktionen abgeschlossen sind, hängt von Ihrer App ab und kann schwierig sein. Ich finde, es ist in der Regel sicherer, den Zustand zu teilen, wenn es überhaupt möglich ist. – Jonah