Kaip išbandyti naudojant netikrus duomenis „iOS“

Norint pateikti aukštos kokybės programinę įrangą ir išvengti regresijos, kiekvienos „iOS“ programos įdiegimas yra būtinas.
Objektų tyčiojimasis yra vienetų testavimo technika, kuria sukuriami netikri objektai, naudojant tas pačias API, kaip ir tikrąsias.
Šis straipsnis yra pateiktas siekiant suteikti jums geriausios praktikos pavyzdžių, kaip naudoti suklastotus duomenis ir užrašyti vienetų testus dažniausiai pasitaikantiems scenarijams „iOS“ programose.

Rašydami vienetinius testus, visada turėtume vengti keisti tikruosius taikinio duomenis ir vietoj to naudoti tikrus duomenis tik bandymo tikslais.

Tolesnėse dalyse bus aptariama, kaip rašyti testus, naudojant suklastotus duomenis dažniausiai naudojamoms „iOS“ API.

Vartotojo numatytosios nuostatos

Kuriant programinę įrangą, visada gera praktika yra sumažinti objektų priklausomybes. Priklausomybės geriausiu atveju turėtų būti įvedamos į klases, kurios jomis naudojasi.

Bet jei patikrinsime tikrojo „iOS“ kūrimo scenarijus, beveik kiekvienas projektas naudoja „UserDefaults“, vadindamas jį API tiesiogiai duomenų saugojimui ar gavimui.

Todėl bandysime pasiūlyti praktišką sprendimą „UserDefaultsrather“ išbandymui, nei abstrahuodami jo API protokolais.

Galime sukurti dvi naujas „UserDefaults“ funkcijas

Visada yra gera praktika nepakeisti programos duomenų iš vieneto bandymo tikslo, todėl turėtume sukurti kitą vietą, kur išsaugoti vartotojo duomenis savo bandymo tikslui.

Tokiu atveju mes inicijuojame naują „UserDefaults“ objektą su suiteName - testDefaults, kad jis visiškai nepriklauso nuo standartinių „UserDefaults“.

Pabandykime parašyti paprastą testą, kuriame būtų naudojami „UserDefaults“

Kadangi šie duomenys iš esmės naudojami tik testavimui, turėtume vengti palikti šiuos duomenis pakabinamus mūsų programų failuose, todėl sukuriame funkciją, atsakingą už šios saugyklos atsisakymą atlikus testą.

Geriausia vieta išvalyti šiuos duomenis, žinoma, bus „tearDown“ funkcija mūsų padalinių bandymų klasėje.

Singeltono objektai

Objektai „Singletons“ yra labai naudojami „iOS“ daugelyje API, juos galime rasti „NSFileManager“, „NSApplication“, „UIApplication“ ir daugelyje kitų vietų.

„IOS“ kūrėjams yra naudinga žinoti, kaip išbandyti pavienius rinkinius.

Mūsų pavyzdyje naudosime „iAd“ obuolių sistemą. Sukursime failą, kad gautume vietinį JSON atsakymą, o ne tikrus duomenis apie užklausimą dėl skelbimo priskyrimo informacijos.

Puiki „iOS“ savybė yra tai, kad greitai plėtiniai leidžia mums ne tik pridėti naujas iš anksto apibrėžtos API funkcijas, bet ir priversti jas atitikti mūsų pačių pasirinktus protokolus.

Apibrėžkime „AdvertismentClient“ protokolą

Po to mes naudojame šį protokolą kaip numatytąjį „ADClient“ ir mūsų netikrą reklamos klientą

Tada keičiame priklausomybę nuo bet kurio iš jų

„private var adClient“: AdvertismentClient = ADClient.shared ()

arba

„private var adClient“: AdvertismentClient = „MockAdClient“ ()

ir naudokite tai taip

Tokiu būdu mes galime lengvai nuspręsti, kada naudoti tikruosius duomenis, o kada - bandomuosius, atsižvelgiant į tai, ar mes tikriname vienetą, ar vadiname API iš mūsų tiesioginės programos tikslo.

Pagrindiniai duomenys

Pagrindiniai duomenys vis dar naudojami „iOS“ duomenų kaupimui talpykloje. Pagrindinių duomenų subjektų išbandymas gali būti sudėtingas. Žemiau paaiškinsime pagrindinę duomenų paslaugų organizavimo ir „Faking Data“ organizavimo gerą patirtį.

Apskritai daugeliu atvejų visada naudinga sukurti paslaugų klasę, atsakingą už konkrečių duomenų gavimą ir įrašymą į duomenų bazę, o ne naudojant pagrindinius duomenų kodus visame projekte.

Tai iš esmės turi du privalumus:

  • Tai atsieja jus nuo naudojamos duomenų bazės, jei ateityje norite pakeisti pagrindinius duomenis kitomis duomenų bazėmis, turėsite atlikti pakeitimus tik vienoje klasėje.
  • Tai darydami galime lengvai nuspręsti, kuri „CoreDataStack“ pripras ar kokią kitą sąranką, kurios mums gali prireikti kitoje sistemoje.

Mes sukursime „CoreDataStack“ protokolą ir po to du „CoreDataStacksthat“ atitiks šį protokolą - vieną „MainCoreDataStack“ ir vieną „MockCoreDataStack“.

Tada mūsų duomenų bazės paslauga gali būti inicijuota bet kurio iš jų, atsižvelgiant į tai, ar mes ją naudojame taikomojoje programoje ar vienetų testavimo taikinyje.

Mūsų pagrindiniame pagrindinių duomenų rinkinyje bus numatytoji sąranka, kaip aprašyta toliau

Tikrindami vienetus visada turėtume vengti pakeisti esamų „tikrų“ objektų būseną juos išbandydami.

Taigi, norėdami sukurti netikrų pagrindinių duomenų subjektus, turėtume atskirą nuolatinę saugyklą ir naudotume atminties saugyklos tipo konfigūraciją, kad atlikti pakeitimai nebus išsaugoti diske ir bus visiškai atskirti nuo šiuo metu išlikusių duomenų.

Dabar galėsime sukurti savo duomenų bazės paslaugą, kuri pagal numatytuosius nustatymus bus inicijuota naudojant MainCoreDataStack.

O mūsų bandymo klasėje mes galime tai inicijuoti suklastotų duomenų krūve

Dabar galime parašyti keletą paprastų testų:

Taikydami šį metodą galime lengvai išbandyti savo „DatabaseService“, nepaveikdami nė vieno programos tikslo saugomo duomenų.

Tinklo užklausos

Testuojant tinklo sluoksnį, galime naudoti į protokolą orientuotą metodą, kad sukurtume protokolą ir atitiktume jį realiu „NetworkService“ ir „MockNetworkService“, o po to nustatytume priklausomybes naudodami realią arba pasityčiojančią paslaugą.

Nors šiame straipsnyje mes naudosime tikrai nuostabią atvirojo kodo biblioteką pavadinimu OHHTTPStubs, kuri dar geriau sutvarkys tyčiojimąsi ir užsispyrimą.

Geras dalykas šioje bibliotekoje yra tas, kad jis puikiai veikia su garsiąja „iOS“ tinklo biblioteka „Alamofire“.

Įtampyti tinklo užklausą išties lengva naudojant OHHTTPStubs. Galite pakeisti bet kurį konkretaus kelio ar pagrindinio kompiuterio atsakymą pateikdami pasirinktinį atsakymą žodynu.

Vėliau kiekvienai programai pateikus užklausą šiuo URL bus pateiktas tinkintas atsakymas.

tegul užduotysURL = URL (eilutė: „https://jsonplaceholder.typicode.com/todos“)!

Taip pat labai smagu, kad tinkinti atsakymai yra tai, kad jūs galite lengvai patikrinti, ar klaidų ir kraštų atvejai tvarkomi teisingai, tiesiog pateikdami atsakymo klaidą.

Atsakymų žodyno kūrimas rankiniu būdu yra puiki savybė, tačiau kai norime pateikti didelius JSON duomenis, turinčius daug ypatybių, jie gali tapti nepatogūs ir sunkiai prižiūrimi mūsų bandomosiose klasėse.

Tokiais atvejais galime naudoti JSON failą atsakymui sustabdyti, kaip nurodyta toliau.

Dabar, kai tik mūsų programa siųs užklausą, gausime atsakymą iš failo „myResponse.json“, kurį išsaugojome savo failuose.

Vis dėlto turėtume atsiminti, kad šiuose JSON failuose nereikėtų išsaugoti neskelbtinos informacijos, nes jei šiuos failus atsiųsime kartu su programa, juos bus galima lengvai peržiūrėti.

Norėdami sužinoti daugiau apie mano straipsnį saugos tema, galite patikrinti.

Apibendrinant

Mūsų programos bandymas vienetais yra būtinas, jei norime kiek įmanoma vengti regresijos ir bandome pateikti nepriekaištingą programą.

Šiame straipsnyje mes aptarėme, kaip pateikti testavimą įprastiems atvejams, kurie atsiranda „iOS“ kūrimo metu.

Aptarėme, kaip išbandyti „UserDefaults“, „Singeltons“, pagrindinius duomenis ir tinklo užklausas.

Jei jums patiko šis straipsnis, būtinai apjuokinkite ir parodykite savo palaikymą.

Sekite mane, norėdami pamatyti dar daugiau straipsnių, kurie gali pakelti jūsų „iOS“ kūrėjo įgūdžius į kitą lygį.

Jei turite klausimų ar komentarų, rašykite čia arba rašykite man el. Paštu arlindaliu.dev@gmail.com.