} } }

Lisame nüüd tekstivälja delegeerimismeetodi, et jälgida, millal mõnda tekstivälja värskendatakse:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { guard let viewModel = viewModel else { return true } let newString = (textField.text! as NSString).replacingCharacters(in: range, with: string) switch textField.tag { case TextFieldTags.emailTextField: viewModel.emailAddress = newString case TextFieldTags.passwordTextField: viewModel.password = newString case TextFieldTags.confirmPasswordTextField: viewModel.passwordConfirmation = newString default: break } return true }
  1. Värskenda AppDelegate vaatekontrolleri sidumiseks sobiva vaatemudeliga (pange tähele, et see samm on MVVM-i arhitektuuri nõue). Uuendatud AppDelegate kood peaks siis välja nägema järgmine:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { initializeStartingView() return true } fileprivate func initializeStartingView() { if let rootViewController = window?.rootViewController as? RegistrationViewController { let networkService = NetworkServiceImpl() let viewModel = RegisterationViewModel(networkService: networkService) rootViewController.viewModel = viewModel } }

Süžeeskeemifail ja RegistrationViewController on tõesti lihtsad, kuid need on piisavad, et näidata, kuidas automatiseeritud kasutajaliidese testimine töötab.

Kui kõik on õigesti seadistatud, tuleks registreerimise nupp rakenduse käivitamisel keelata. Millal ja ainult siis, kui kõik väljad on täidetud ja kehtivad, peaks registreerimisnupp olema lubatud.

Kui see on seadistatud, saate luua oma esimese kasutajaliidese testi.

Meie kasutajaliidese test peaks kontrollima, kas nupp Registreerimine lülitub sisse ainult siis, kui kehtiv e-posti aadress, kehtiv parool ja kehtiv parooli kinnitus on sisestatud. Selle seadistamiseks toimige järgmiselt.

  1. Avage TestingIOSUITests.swift faili.
  2. Kustutage testExample() meetod ja lisage testRegistrationButtonEnabled() meetod.
  3. Pange kursor testRegistrationButtonEnabled -i meetod, nagu kavatsete sinna midagi kirjutada.
  4. Vajutage nuppu Salvesta kasutajaliidese test (punane ring ekraani allosas).

Pilt: ekraanipilt, kus kuvatakse nuppu Salvesta kasutajaliides.

  1. Kui nupule Salvesta vajutatakse, käivitatakse rakendus
  2. Pärast rakenduse käivitamist puudutage e-posti tekstiväljal ja kirjutage [meiliga kaitstud] ’. Märkate, et kood kuvatakse automaatselt katsemeetodi kehas.

Selle funktsiooni abil saate kõik kasutajaliidese juhised salvestada, kuid võite leida, et lihtsate juhiste käsitsi kirjutamine on palju kiirem.

See on näide salvesti juhistest parooli tekstiväljale koputamiseks ja e-posti aadressi sisestamiseks [meiliga kaitstud] '

let emailTextField = XCUIApplication().otherElements.containing(.staticText, identifier:'Email Address').children(matching: .textField).element emailTextField.tap() emailTextField.typeText(' [email protected] ')
  1. Kui testitava kasutajaliidese interaktsioonid on salvestatud, vajutage salvestamise peatamiseks uuesti stopp-nuppu (salvestusnupu silt muutus peatumiseks, kui alustate salvestamist).
  2. Pärast kasutajaliidese interaktsioonide salvestaja olemasolu saate nüüd lisada mitmesuguseid XCTAsserts rakenduse või kasutajaliidese elementide erinevate olekute testimiseks.

Pilt: animatsioon, mis näitab salvesti juhiseid paroolivälja koputamiseks.

Salvestatud juhised ei ole alati iseenesestmõistetavad ja võivad isegi muuta kogu katsemeetodi pisut raskesti loetavaks ja arusaadavaks. Õnneks saate kasutajaliidese juhised käsitsi sisestada.

Looge järgmised kasutajaliidese juhised käsitsi:

  1. Kasutaja puudutab parooli tekstivälja.
  2. Kasutaja sisestab parooli.

Kasutajaliidese elemendile viitamiseks võite kasutada kohatäite identifikaatorit. Kohatäite identifikaatori saab määrata paani Juurdepääsetavus jaotises Identity Inspector storyboardi. Määrake parooli tekstivälja juurdepääsetavuse tunnuseks ‘passwordTextField’.

Parooli kasutajaliidese interaktsiooni saab nüüd kirjutada järgmiselt:

let passwordTextField = XCUIApplication().secureTextFields['passwordTextField'] passwordTextField.tap() passwordTextField.typeText('password')

Jäänud on veel üks kasutajaliidese suhtlus: kinnitage parooli sisestamise interaktsioon. Seekord viite parooli kinnitamise tekstiväljale selle kohahoidja järgi. Minge süžeeskeemi ja lisage parooli kinnitamise tekstivälja jaoks kohahoidja „Kinnita parool”. Kasutaja interaktsiooni saab nüüd kirjutada järgmiselt:

let confirmPasswordTextField = XCUIApplication().secureTextFields['Confirm Password'] confirmPasswordTextField.tap() confirmPasswordTextField.typeText('password')

Nüüd, kui teil on kõik vajalikud kasutajaliidese interaktsioonid, jääb üle kirjutada lihtne XCTAssert (sama, mida tegite üksuste testimisel), et kontrollida, kas nuppu Registreeri isEnabled olek on seatud tõele. Registreerimisnupule saab viidata selle pealkirja abil. Kinnitage nupu kontrollimiseks isEnabled vara näeb välja selline:

let registerButton = XCUIApplication().buttons['REGISTER'] XCTAssert(registerButton.isEnabled == true, 'Registration button should be enabled')

Kogu kasutajaliidese test peaks nüüd välja nägema selline:

func testRegistrationButtonEnabled() { // Recorded by Xcode let emailTextField = XCUIApplication().otherElements.containing(.staticText, identifier:'Email Address').children(matching: .textField).element emailTextField.tap() emailTextField.typeText(' [email protected] ') // Queried by accessibility identifier let passwordTextField = XCUIApplication().secureTextFields['passwordTextField'] passwordTextField.tap() passwordTextField.typeText('password') // Queried by placeholder text let confirmPasswordTextField = XCUIApplication().secureTextFields['Confirm Password'] confirmPasswordTextField.tap() confirmPasswordTextField.typeText('password') let registerButton = XCUIApplication().buttons['REGISTER'] XCTAssert(registerButton.isEnabled == true, 'Registration button should be enabled') }

Testi käivitamise korral käivitab Xcode simulaatori ja käivitab meie testirakenduse. Pärast rakenduse käivitamist käivitatakse meie kasutajaliidese suhtlemise juhised ükshaaval ja lõpuks kinnitatakse väidet edukalt.

Testi täiustamiseks testime ka seda, et isEnabled nupu register omadus on vale, kui mõni nõutav väli pole õigesti sisestatud.

Kogu katsemeetod peaks nüüd välja nägema selline:

func testRegistrationButtonEnabled() { let registerButton = XCUIApplication().buttons['REGISTER'] XCTAssert(registerButton.isEnabled == false, 'Registration button should be disabled') // Recorded by Xcode let emailTextField = XCUIApplication().otherElements.containing(.staticText, identifier:'Email Address').children(matching: .textField).element emailTextField.tap() emailTextField.typeText(' [email protected] ') XCTAssert(registerButton.isEnabled == false, 'Registration button should be disabled') // Queried by accessibility identifier let passwordTextField = XCUIApplication().secureTextFields['passwordTextField'] passwordTextField.tap() passwordTextField.typeText('password') XCTAssert(registerButton.isEnabled == false, 'Registration button should be disabled') // Queried by placeholder text let confirmPasswordTextField = XCUIApplication().secureTextFields['Confirm Password'] confirmPasswordTextField.tap() confirmPasswordTextField.typeText('pass') XCTAssert(registerButton.isEnabled == false, 'Registration button should be disabled') confirmPasswordTextField.typeText('word') // the whole confirm password word will now be 'password' XCTAssert(registerButton.isEnabled == true, 'Registration button should be enabled') }

Nõuanne. Eelistatud viis kasutajaliidese elementide tuvastamiseks on juurdepääsetavuse tunnuste kasutamine. Kui kasutatakse nimesid, kohatäiteid või mõnda muud atribuuti, mida saab lokaliseerida, ei leita elementi, kui kasutatakse muud keelt, mille korral test ebaõnnestub.

Kasutajaliidese testi näide on väga lihtne, kuid see näitab kasutajaliidese automatiseeritud testimise jõudu.

Parim viis Xcode'is sisalduva kasutajaliidese testimise raamistiku kõigi võimaluste (ja neid on palju) avastamiseks on alustada oma projektides kasutajaliidese testide kirjutamist. Alustage lihtsatest kasutajalugudest, nagu näidatud, ja liikuge aeglaselt keerukamate lugude ja testide juurde.

Hakka paremaid arendajaid, kirjutades häid teste

Minu kogemuse põhjal paneb õppimine ja heade testide kirjutamine proovima mõtlema ka muude arengupoolte üle. See aitab teil paremaks saada iOS-i arendaja kokku.

Heade testide kirjutamiseks peate õppima, kuidas oma koodi paremini korraldada.

Korrastatud, modulaarne, hästi kirjutatud kood on edukate ja stressivabade üksuste ja kasutajaliidese testimise peamine nõue.

Mõnel juhul on testide kirjutamine isegi võimatu, kui kood pole hästi korraldatud.

Mõeldes rakenduse struktuurile ja koodi korraldusele, mõistate, et MVVM-i, MVP-i, VIPER-i või muude sarnaste mustrite abil on teie kood paremini struktureeritud, modulaarne ja hõlpsasti testitav (väldite ka massiivse vaate kontrolleri probleeme) .

Testide kirjutamisel peate kahtlemata mingil hetkel looma pilgatud klassi. See paneb teid mõtlema ja tundma õppima sõltuvuse süstimise põhimõtet ja protokollile suunatud kodeerimise tavasid. Nende põhimõtete tundmine ja kasutamine suurendab teie tulevaste projektide koodikvaliteeti märkimisväärselt.

Kui hakkate teste kirjutama, märkate oma koodi kirjutades end tõenäoliselt rohkem mõtlemast nurkade juhtumite ja servatingimuste üle. See aitab teil võimalikud vead kõrvaldada enne, kui neist vead saavad. Mõeldes võimalike probleemide ja meetodite negatiivsete tulemuste peale, testite mitte ainult positiivseid tulemusi, vaid hakkate ka negatiivseid tulemusi testima.

Nagu näete, võivad ühikutestid avaldada mõju erinevatele arendusaspektidele ning kui kirjutate head ühikute ja kasutajaliidese testid, saate tõenäoliselt paremaks ja õnnelikumaks arendajaks (ja te ei pea kulutama nii palju aega vigade parandamisele).

Alustage automatiseeritud testide kirjutamist ja lõpuks näete automatiseeritud testimise eeliseid. Kui näete seda ise, saate teist selle tugevaim advokaat.