Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

UI Testing mit Xcode 7

Mit dem Release von Xcode 7 hat sich einiges im Bereich Unit Testing getan. Neben Code Coverage wurde vor allem der Bereich UI Testing erweitert. Musste man früher noch UI-Tests per JavaScript schreiben und in Instruments laufen lassen, hat Apple heute das ungeliebte UI Automation Framework eingestampft und durch UI-Tests ersetzt, die in Swift geschrieben und direkt in Xcode ausgeführt werden. Dieser Vortrag stellt die Neuerungen vor und zeigt anhand eines Beispiels, was alles möglich ist.

  • Login to see the comments

  • Be the first to like this

UI Testing mit Xcode 7

  1. 1. #WISSENTEILEN UI Testing mit Xcode 7 Michael Kotten | OPEN KNOWLEDGE @michaelkotten @_openknowledge
  2. 2. #WISSENTEILEN Warum testen? UI Testing mit Xcode 7 MTC 2016 Motivation
  3. 3. #WISSENTEILEN 
 „Wer testet, ist feige!“ 
 „Ich weiß doch, dass mein Code funktioniert!“ 
 „Wenn ich den Test selber schreibe, hat es eh keinen Sinn!“ „Keine Zeit für Unit Tests!“ UI Testing mit Xcode 7 MTC 2016 Motivation
  4. 4. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 Motivation „Unit testing is not about finding bugs.“
  5. 5. #WISSENTEILEN ‣ Notwendig bei komplexen Systemen ‣ Sicherung von ‣ Qualität ‣ Funktionalität ‣ Wichtig bei agilen Entwicklungsprozessen ‣ Schnelle Entwicklungszyklen UI Testing mit Xcode 7 MTC 2016 Motivation
  6. 6. #WISSENTEILEN Wie testen? UI Testing mit Xcode 7 MTC 2016 Motivation
  7. 7. #WISSENTEILEN eXtreme Clicking UI Testing mit Xcode 7 MTC 2016 Motivation
  8. 8. #WISSENTEILEN nur auf dem Entwicklerrechner Motivation UI Testing mit Xcode 7 MTC 2016
  9. 9. #WISSENTEILEN Kunden Motivation UI Testing mit Xcode 7 MTC 2016
  10. 10. #WISSENTEILEN © Ultrashock - iStock Motivation UI Testing mit Xcode 7 MTC 2016 Expect the Unexpected!
  11. 11. #WISSENTEILEN Anforderungen an Testabdeckung ‣ Alles “Offensichtliche” plus …
 ‣ … Umwelteinflüsse & Störungen ‣ … System Notifications ‣ … zu unterstützende Devices, Locales … Motivation UI Testing mit Xcode 7 MTC 2016
  12. 12. #WISSENTEILEN Was testen? UI Testing mit Xcode 7 MTC 2016 Motivation
  13. 13. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 Motivation „It makes no sense 
 to test something that 
 can’t be broken (or fixed)!“ (Zitat: alter weiser Mann)
  14. 14. #WISSENTEILEN Gute Tests ... ‣… treffen Annahmen nur einmal ‣… sind isoliert ‣… laufen unabhängig ‣… sind vorhersehbar Motivation UI Testing mit Xcode 7 MTC 2016
  15. 15. #WISSENTEILEN Unit Test ‣ Testen der korrekten Funktionsweise einzelner, isolierter Komponenten ‣ Automatisiert ‣ Wiederholbar Motivation UI Testing mit Xcode 7 MTC 2016
  16. 16. #WISSENTEILEN UI Test ‣ Wie Unit Test ‣ Fokus auf ‣ Event Handling (Tap, Swipe etc.) ‣ GUI Elemente Motivation UI Testing mit Xcode 7 MTC 2016
  17. 17. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 Historie
  18. 18. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 Historie Das war UI Testing vor Xcode 7 ‣ UI Automation ‣ KIF - Keep it functional ‣ Frank ‣ Subliminal* * wird nicht mehr weiterentwickelt
  19. 19. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 Historie UI Automation
  20. 20. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 Historie - UI Automation UI Automation ‣ JavaScript ‣ Nur per Instruments ‣ Kein echtes Debugging
  21. 21. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 Historie - UI Automation
  22. 22. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 Historie KIF – Keep It Functional
  23. 23. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 Historie - KIF KIF – Keep It Functional ‣ Objective-C ‣ Integration in Xcode ‣ Test Navigator ‣ Debugging ‣ Gray-Box-Test ‣ nutzt private API
  24. 24. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 Historie - KIF class CalculatorUiTests : KIFTestCase { func testAdd() { tester.tapViewWithAccessibilityLabel("one") tester.tapViewWithAccessibilityLabel("add") tester.tapViewWithAccessibilityLabel("two") tester.tapViewWithAccessibilityLabel("equal") XCTAssertEqual(display.text!, "3", "result should be 3") } }
  25. 25. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 Übersicht +
  26. 26. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 Übersicht
  27. 27. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 Übersicht ‣ Integration in Xcode
  28. 28. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 Übersicht ‣ Integration in Xcode ‣ Test Navigator
  29. 29. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 Übersicht ‣ Integration in Xcode ‣ Test Navigator ‣ Debugging
  30. 30. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 Übersicht ‣ Integration in Xcode ‣ Test Navigator ‣ Debugging ‣ Test recording
  31. 31. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 Übersicht ‣ Integration in Xcode ‣ Test Navigator ‣ Debugging ‣ Test recording ‣ Test Report
  32. 32. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 Übersicht ‣ Integration in Xcode ‣ Test Navigator ‣ Debugging ‣ Test recording ‣ Test Report ‣ Code Coverage
  33. 33. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 Übersicht ‣ Integration in Xcode ‣ Test Navigator ‣ Debugging ‣ Test recording ‣ Test Report ‣ Code Coverage ‣ Continuous Integration
  34. 34. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 Übersicht ‣ Integration in Xcode ‣ Test Navigator ‣ Debugging ‣ Test recording ‣ Test Report ‣ Code Coverage ‣ Continuous Integration ‣ On device
  35. 35. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 Übersicht +
  36. 36. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 Übersicht
  37. 37. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 Übersicht ‣ Per Interface Builder
  38. 38. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 Übersicht ‣ Per Interface Builder ‣ Per API func setValue(value: String) { self.label.text = value self.label.accessibilityValue = value }
  39. 39. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 Vorraussetzungen ab iOS 9
  40. 40. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 API ‣ XCUIApplication ‣ XCUIDevice ‣ XCUIElementQuery ‣ XCUIElement
  41. 41. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 API ‣ XCUIApplication ‣ Einstieg in die App override func setUp() { super.setUp() let app = XCUIApplication() app.launch() }
  42. 42. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 API ‣ XCUIApplication ‣ Einstieg in die App ‣ Startparameter steuern override func setUp() { super.setUp() let app = XCUIApplication() app.launchArguments = [ "TEST_MODE" ] app.launchEnvironment = [ "animations" : "0" ] app.launch() }
  43. 43. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 API ‣ XCUIApplication ‣ Einstieg in die App ‣ Startparameter steuern let testMode = NSProcessInfo.processInfo().arguments.contains("TEST_MODE")
  44. 44. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 API ‣ XCUIApplication ‣ Einstieg in die App ‣ Startparameter steuern if NSProcessInfo.processInfo().environment["animations"] == "0" { UIView.setAnimationsEnabled(false) }
  45. 45. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 API ‣ XCUIApplication ‣ Einstieg in die App ‣ Startparameter steuern let testMode = NSProcessInfo.processInfo().arguments.contains("TEST_MODE")
  46. 46. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 API ‣ XCUIDevice ‣ Zugriff auf „Hardware“ XCUIDevice.sharedDevice()
  47. 47. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 API ‣ XCUIDevice ‣ Zugriff auf „Hardware“ ‣ Device Orientation XCUIDevice.sharedDevice().orientation = .LandscapeLeft
  48. 48. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 API ‣ XCUIDevice ‣ Zugriff auf „Hardware“ ‣ Device Orientation ‣ Hardware Buttons XCUIDevice.sharedDevice().pressButton(.Home)
  49. 49. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 API ‣ XCUIElement ‣ Interaktion (z.B. tap() oder swipeUp()) XCUIApplication().buttons["five"].tap()
  50. 50. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 API ‣ XCUIElement ‣ Interaktion (z.B. tap() oder swipeUp()) ‣ Sichtbarkeit mit exists XCTAssert(XCUIApplication().buttons["five"].exists)
  51. 51. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 API ‣ XCUIElementQuery ‣ „Suche“ nach UI Elementen app.tableViews[0].cells[0]
  52. 52. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 API ‣ XCUIElementQuery ‣ „Suche“ nach UI Elementen app.tables.element.cells.elementAtIndex(0)
  53. 53. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 API ‣ XCUIElementQuery ‣ „Suche“ nach UI Elementen app.tables.element.cells["cellIdentifier"]
  54. 54. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 API ‣ XCUIElementQuery ‣ „Suche“ nach UI Elementen ‣ Ausführung erst bei Interaktion ‣ Fehler falls nicht eindeutig app.tables.element.cells["cellIdentifier"].tap()
  55. 55. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 API ‣ XCUIElementQuery Application Table Cell Cell „one“ Label „two“ Label View
  56. 56. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 API ‣ XCUIElementQuery ‣ Descendants Application Table Cell Cell „one“ Label „two“ Label View
  57. 57. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 API ‣ XCUIElementQuery ‣ Descendants Application Table Cell Cell „one“ Label „two“ Label View
  58. 58. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 API ‣ XCUIElementQuery ‣ Descendants app.tables.element.descendantsMatchingType(.StaticText) Application Table Cell Cell „one“ Label „two“ Label View
  59. 59. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 API ‣ XCUIElementQuery ‣ Descendants app.tables.element.staticTexts Application Table Cell Cell „one“ Label „two“ Label View
  60. 60. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 API ‣ XCUIElementQuery ‣ Children Application Table Cell Cell „one“ Label „two“ Label View
  61. 61. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 API ‣ XCUIElementQuery ‣ Children Application Table Cell Cell „one“ Label „two“ Label View
  62. 62. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 API ‣ XCUIElementQuery ‣ Children Application Table Cell Cell „one“ Label „two“ Label View app.tables.element.childrenMatchingType(.Cell)
  63. 63. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 API ‣ XCUIElementQuery ‣ Containment Application Table Cell Cell „one“ Label „two“ Label View
  64. 64. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 API ‣ XCUIElementQuery ‣ Containment Application Table Cell Cell „one“ Label „two“ Label View
  65. 65. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 API ‣ XCUIElementQuery ‣ Containment Application Table Cell Cell „one“ Label „two“ Label View app.cells.containingType(.StaticText, identifier: "one")
  66. 66. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 API ‣ Auf Elemente warten let element = app.alerts["Timeout"] let existsPredicate = NSPredicate(format: "exists == true") expectationForPredicate(existsPredicate, evaluatedWithObject: element, handler: nil) waitForExpectationsWithTimeout(5, handler: nil)
  67. 67. #WISSENTEILEN Code Diving
  68. 68. #WISSENTEILEN UI Automation Keep it Functional UI Testing Sprache Javascript Objective-C/Swift Objective-C/Swift Maintainer Apple Community Apple Accessibility ✔ ✔ ✔ Xcode ✖ ✔ ✔ Debugging ✖ ✔ ✔ Mocking ✖ ✔ ✖ Continuous Integration ✔ ✔ ✔ Zukunftssicher ✖ ✖ ✔ UI Testing mit Xcode 7 MTC 2016 KIF vs. UI Automation vs. UI Testing
  69. 69. #WISSENTEILEN UI Testing mit Xcode 7 MTC 2016 Fazit ✓ Offizielle Lösung von Apple ✓ Kein JavaScript mehr ✓ Test recording ✓ Schnelligkeit - Flexibilität
  70. 70. One more thing ...
  71. 71. #WISSENTEILEN Social Media One more thing… UI Testing mit Xcode 7 MTC 2016 Broken Windows Theorie
  72. 72. #WISSENTEILEN UI Testing mit Xcode 7 Michael Kotten | OPEN KNOWLEDGE @michaelkotten @_openknowledge
  73. 73. #WISSENTEILEN #1, #71, #72: © pexels.com #10: © iStock.com/ultrashock #17: © iStock.com/alexsl #39: © apple.com #67: © 2436digitalavenue - Fotolia UI Testing mit Xcode 7 MTC 2016 Bildnachweise

×