Testen in Swift (iOS/macOS): Frameworks und Werkzeuge

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Testen in Swift (iOS/macOS): Überblick über Frameworks und Werkzeuge



Die Qualität mobiler und Desktop-Anwendungen in Swift hängt direkt von einem gut durchdachten Testsystem ab. Im Apple-Ökosystem gibt es mehrere ausgereifte Frameworks, die alle Ebenen der Testpyramide abdecken: von Unit-Tests über UI-Tests bis hin zu visuellen Regressionstests. In diesem Artikel analysieren wir die wichtigsten Werkzeuge, ihre Möglichkeiten und geben praktische Beispiele in Swift.



1. XCTest — das Standard-Framework von Apple



XCTest ist in Xcode integriert und das wichtigste Werkzeug zum Schreiben von Unit- und UI-Tests. Es unterstützt asynchrones Testen, Leistungstests und die Integration mit CI/CD.



Beispiel eines Unit-Tests:

import XCTest@testable import MyApp

final class CalculatorTests: XCTestCase { var calculator: Calculator!

override func setUp() { super.setUp() calculator = Calculator() }

func testAddition() { let result = calculator.add(2, 3) XCTAssertEqual(result, 5, "Die Addition sollte korrekt sein") }

func testAsyncOperation() { let expectation = XCTestExpectation(description: "Asynchrone Operation") calculator.fetchRemoteValue { value in XCTAssertGreaterThan(value, 0) expectation.fulfill() } wait(for: [expectation], timeout: 5.0) }}


Wichtige Funktionen von XCTest:

  • Assertions: XCTAssertEqual, XCTAssertNil, XCTAssertThrowsError
  • Leistungsmessung mit measure
  • UI-Tests mit XCUIApplication und XCUIElement
  • Unterstützung für parallele Testausführung


2. Quick + Nimble — BDD-Ansatz



Quick ist ein BDD-Framework, das das Schreiben von Tests im "Given-When-Then"-Stil ermöglicht. Nimble ist sein Begleiter und bietet ausdrucksstarke Matcher.



Beispiel mit Quick/Nimble:

import Quickimport Nimble

class UserSpec: QuickSpec { override func spec() { describe("User model") { var user: User!

beforeEach { user = User(name: "Alice", age: 30) }

context("when age is valid") { it("should be adult") { expect(user.isAdult).to(beTrue()) } }

context("when updating name") { it("changes the name correctly") { user.updateName("Bob") expect(user.name) == "Bob" } } } }}


Vorteile:

  • Lesbare Tests, auch für Nicht-Programmierer verständlich
  • Flexible Matcher: beCloseTo(), contain(), throwError()
  • Unterstützung für Asynchronität mit toEventually()


3. XCUITest — UI-Tests



Für das Testen der Benutzeroberfläche wird XCUITest verwendet. Es simuliert Benutzeraktionen: Tippen, Wischen, Texteingabe.



Beispiel eines UI-Tests für iOS:

import XCTest

class LoginUITests: XCTestCase { let app = XCUIApplication()

override func setUp() { continueAfterFailure = false app.launch() }

func testSuccessfulLogin() { let usernameField = app.textFields["username"] usernameField.tap() usernameField.typeText("testuser")

let passwordField = app.secureTextFields["password"] passwordField.tap() passwordField.typeText("password123")

app.buttons["Login"].tap() XCTAssertTrue(app.staticTexts["Welcome"].exists) }}


Empfehlungen