Multi-Target Swift Framework erstellen – Testing

Nun da wir etwas Code haben, wird es Zeit diesen zu testen. Wie sonst könnten wir garantieren, dass unser Code das macht, was wir designed haben, was er machen soll?

Gleich wie beim Source Code, unser Ziel für unsere Tests ist es so viele Tests mit unseren drei Frameworks zu teilen. Um dies zu tun werden wir unsere gemeinsamen Test Source Files im Tests Ordner hinzufügen, den wir beim Setup unseres Projekts erstellt hatten. Dann werden wir die Test Source Files allen drei Unit Test Targets zuweisen.

Wir werden zwei Tests schreiben.

Der erste Test wird ein neues Auto erstellen und prüfen ob die Beschreibung korrekt ist.

func testCarDescription() {
  let car = Car(name: "Test", km: 0)
  XCTAssertEqual(car.description, "Car 'Test' has 0 km.")
}

Der zweite Test wird ein neues Auto kreieren, einige Kilometer hinzufügen und anschliessen überprüfen, ob die Beschreibung so ist, wie erwartet.

func testCarDescriptionAfterAddingKilometer() {
  let car = Car(name: "Test", km: 0)
  car.add(km: 125)
  XCTAssertEqual(car.description, "Car 'Test' has 125 km.")
}

Test Files hinzufügen

Lass uns die Testdatei erstellen und dem Projekt zufügen.

Im Projekt Navigator rechts-klicke auf das Projektitem und wähle „New Group“. Nenne die Gruppe „Tests“. Anschliessend rechts-klicke auf Tests und wähle New File… -> iOS -> Unit Test Case Class. Benenne die Klasse CarTests und wähle „subclass of: XCTestCase“

Stelle sicher, dass die Klasse in der korrekten Gruppe Tests erstellt wird und dass alle Test Targets selektiert sind.

Kopiere nun die beiden Testmethoden in das erstellte File.

Beachte, weil wir wollen, dass unsere CarTests Unit Test Cases alle drei Frameworks nutzen, können wir @testable import nicht verwenden um die Car Klasse zu importieren. Stattdessen müssen wir das das Car.swift File zu allen Unit Test Targets hinzufügen.

Manuelles Testen aller Targets

Jedes Target manuell zu testen einfach. Das korrekte Scheme in der Xcode Build Configuration auswählen und die Tests laufen lassen (⌘ + U).

Unsere Testresultate sollten für jedes unserer Frameworks grün sein. Zusätzlich sollte unsere Coverage 100% sein.

Beachte: da wir die Source Files direkt in das Test Bundle inkludieren wird die Coverage nur dann angezeigt, wenn wir „Show Test Bundles“ in der Report Ansicht.

Configuration for Travis CI (Continuous Integration)

For continuous integration we will use Travis CI. Travis CI pulls out your code from your GitHub repository, and looks at the .travis.yml configuration file to build your project.
In our case, we are going to configure a build matrix to build and test all our targets.

language: objective-c
osx_image: xcode7.2
env:
global:
- LC_CTYPE=en_US.UTF-8
- LANG=en_US.UTF-8
- WORKSPACE=MyFramework/MyFramework.xcworkspace
- IOS_SCHEME="MyFrameworkiOS"
- IOS_SDK=iphonesimulator9.2
- OSX_SCHEME="MyFrameworkOSX"
- OSX_SDK=macosx10.11
- TVOS_SCHEME="MyFrameworkTVOS"
- TVOS_SDK=appletvsimulator9.1
matrix:
- DESTINATION="OS=9.2,name=iPhone 4S"        SCHEME="$IOS_SCHEME"     SDK="$IOS_SDK"     RUN_TESTS="YES" POD_LINT="NO"
- DESTINATION="OS=9.2,name=iPhone 5"         SCHEME="$IOS_SCHEME"     SDK="$IOS_SDK"     RUN_TESTS="YES" POD_LINT="NO"
- DESTINATION="OS=9.2,name=iPhone 5S"        SCHEME="$IOS_SCHEME"     SDK="$IOS_SDK"     RUN_TESTS="YES" POD_LINT="NO"
- DESTINATION="OS=9.2,name=iPhone 6"         SCHEME="$IOS_SCHEME"     SDK="$IOS_SDK"     RUN_TESTS="YES" POD_LINT="NO"
- DESTINATION="OS=9.2,name=iPhone 6 Plus"    SCHEME="$IOS_SCHEME"     SDK="$IOS_SDK"     RUN_TESTS="YES" POD_LINT="NO"
- DESTINATION="OS=9.2,name=iPhone 6S"        SCHEME="$IOS_SCHEME"     SDK="$IOS_SDK"     RUN_TESTS="YES" POD_LINT="NO"
- DESTINATION="OS=9.2,name=iPhone 6S Plus"   SCHEME="$IOS_SCHEME"     SDK="$IOS_SDK"     RUN_TESTS="YES" POD_LINT="NO"
- DESTINATION="arch=x86_64"                  SCHEME="$OSX_SCHEME"     SDK="$OSX_SDK"     RUN_TESTS="YES" POD_LINT="NO"
- DESTINATION="OS=9.1,name=Apple TV 1080p"   SCHEME="$TVOS_SCHEME"    SDK="$TVOS_SDK"    RUN_TESTS="YES" POD_LINT="NO"

script:
- set -o pipefail
- xcodebuild -version
- xcodebuild -showsdks

# Build Framework in Debug and Run Tests if specified
- if [ $RUN_TESTS == "YES" ]; then
xcodebuild -workspace "$WORKSPACE" -scheme "$SCHEME" -sdk "$SDK" -destination "$DESTINATION" -configuration Debug ONLY_ACTIVE_ARCH=NO test | xcpretty -c;
else
xcodebuild -workspace "$WORKSPACE" -scheme "$SCHEME" -sdk "$SDK" -destination "$DESTINATION" -configuration Debug ONLY_ACTIVE_ARCH=NO build | xcpretty -c;
fi

# Run `pod lib lint` if specified
- if [ $POD_LINT == "YES" ]; then
pod lib lint --private --verbose;
fi

The above matrix includes a pod lib lint command to be run once for each platform, we will get to that later once we add the CocoaPods podspec file.
Once you have added the .travis.yml configuration file, enable your repository on travis-ci.orgor travis-ci.comand push your travis configuration file to GitHub.
Enable repository on Travis CI
The push will trigger a new build.

Our build is passing in all platforms and devices

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: