IT Testing & Quality Assurance
Suurimman osan historiastaan ohjelmistotestaus on organisoitu vähentämisen kautta: rakenna järjestelmä ja poista sitten virheet ennen julkaisua. Tämä ajattelutapa on yksittäisistä syistä suurin siihen, miksi organisaatiot yllättyvät yhä uudelleen tuotantohäiriöistä, jotka niillä oli kaikki mahdollisuudet ehkäistä. Laatua ei tarkasteta tuotteeseen putken loppupäässä; se on järjestelmän ja sen tuottavan prosessin ominaisuus, joka on läsnä tai poissa ensimmäisestä suunnitteluratkaisusta lähtien. Tässä artikkelissa testaus ja laadunvarmistus käsitetään insinööritieteen kurinalaisuudeksi eikä portiksi, ja kuvataan, miten ala toimii silloin kun se toimii ja missä se pettää silloin kun se pettää.
Laatu on ominaisuus, ei vaihe
Syy siihen, miksi tämä aihe on nyt merkityksellisempi kuin vuosikymmen sitten, on se, että ohjelmistojen kustannusrakenne on kääntynyt päälaelleen. Julkaisutahti on monissa organisaatioissa siirtynyt neljännesvuosittaisesta päivittäiseen tai tunneittaiseen, riippuvuudet ovat moninkertaistuneet, ja järjestelmät kootaan yhä useammin kirjoittamisen sijaan, koostettuina palveluista, kirjastoista ja kolmannen osapuolen alustoista, joiden käyttäytymistä yksikään tiimi ei täysin hallitse. Tällaisessa ympäristössä testausmalli, joka keskittää varmennuksen erilliseen vaiheeseen loppupäähän, ei yksinkertaisesti pysy tahdissa. Ei ole enää mukavaa aikaikkunaa, jossa erillinen laatutiimi ehtii napata kaiken ennen aikataulutettua julkaisua, koska aikataulutettua julkaisua vanhassa mielessä ei enää ole.
Kun sanomme, että laatu on järjestelmän ominaisuus, tarkoitamme jotain täsmällistä. Järjestelmällä on laatua siinä määrin kuin sen todellinen käyttäytyminen vastaa sen tarkoitettua käyttäytymistä niissä olosuhteissa, joita se kohtaa, ja siinä määrin kuin tämä vastaavuus voidaan osoittaa edullisesti ja toistuvasti. Molemmat puoliskot ovat tärkeitä. Järjestelmä, joka sattuu käyttäytymään oikein mutta jonka toimivuutta ei voida osoittaa ilman sankarillista käsityötä, ei ole insinööritermein korkealaatuinen; se on hauras järjestelmä, jonka oikeellisuutta ei voi todentaa ja johon siksi ei voi luottaa seuraavan muutoksen kohdalla.
Tällä uudelleenmuotoilulla on käytännön seuraus, jota johtajat usein vastustavat. Jos laatu on ominaisuus, se suunnitellaan ja rakennetaan, sitä ei lisätä. Testattavuuden kannalta ratkaisevimmat päätökset tehdään kauan ennen kuin yhtään testiä on kirjoitettu: miten komponentit rajataan, miten tilaa hallitaan, miten sivuvaikutukset eristetään, altistetaanko käyttäytyminen vakaiden rajapintojen kautta vai kietoutuuko se esitystapaan. Tiimi, joka pitää testausta jonkun muun myöhempänä ongelmana, sulkee nämä vaihtoehdot pois ja huomaa sitten liian myöhään, että järjestelmä vastustaa varmennusta joka käänteessä. Alan nykytila on parhaiten ymmärrettävissä hitaana, epätasaisena siirtymänä pois vaihemallista kohti laadun käsittämistä koko toimitusorganisaation sisäänrakennetuksi ja jatkuvaksi huolenaiheeksi.
Perusperiaatteet ja pyramidin muoto
Testausstrategia ei ole lista testeistä. Se on joukko tietoisia päätöksiä siitä, mihin varmennuspanostus kohdistetaan, millä tarkkuustasolla ja mitä riskejä vastaan. Lähtökohtana on erottaa toisistaan kysymykset, joihin eri testit vastaavat. Yksikkötesti vastaa siihen, käyttäytyykö pieni logiikan pala tekijänsä tarkoittamalla tavalla eristyksissä. Integraatiotesti vastaa siihen, ovatko komponentit yksimielisiä niiden välisistä sopimuksista. Päästä päähän -testi vastaa siihen, toimiiko täydellinen käyttäjän polku kootun järjestelmän läpi. Nämä eivät ole keskenään vaihdettavissa; kukin nappaa sellaisen luokan virheitä, joita muut eivät rakenteellisesti voi napata, ja kukin kantaa erilaisen kustannuksen suoritusajassa, ylläpitotaakassa ja diagnostisessa selkeydessä silloin kun se epäonnistuu.
Testipyramidi on klassinen ilmaus siitä, miten näitä tasapainotetaan, ja sen logiikka on taloudellinen eikä esteettinen. Pohjalla olevat testit ovat lukuisia, nopeita ja täsmällisiä: kun yksikkötesti epäonnistuu, se osoittaa yleensä suoraan syyllistä riviä. Huipulla olevat testit ovat harvoja, hitaita ja laveita: kun päästä päähän -testi epäonnistuu, se kertoo että jokin on vialla jossain pitkässä ketjussa, mikä on arvokasta mutta kallista diagnosoida. Terve strategia työntää siksi varmennuksen alas edullisimmalle tasolle, joka aidosti pystyy vastaamaan kysymykseen. Et aja koko selainpolkua läpi tarkistaaksesi päivämäärän muotoilusäännön, jonka yksikkötesti pystyisi naulaamaan millisekunneissa.
Pyramidi kääntyy käytännössä ylösalaisin useammin kuin tiimit myöntävät, muuttuen jäätelötötteröksi: ohut pohja yksikkötestejä, pullistuva kerros hitaita päästä päähän -testejä ja päälle liuska käsin tehtävää tarkistusta. Tämä muoto on merkki ongelmista. Se tarkoittaa yleensä, että taustalla oleva koodi oli vaikea testata eristyksissä, joten tiimi kompensoi testaamalla kaiken uloimman rajapinnan kautta, jossa jokainen tarkistus on hidas, epävakaa ja kytkeytynyt satunnaisiin yksityiskohtiin. Pyramidin todellinen viesti ei ole ulkoa opeteltava kiinteä suhdeluku vaan periaate: suosi pienintä, nopeinta testiä, joka merkittävästi vähentää riskiä, ja pidä raskasta huippua todisteena korjattavasta suunnitteluongelmasta eikä hyväksyttävästä testaustyylistä.
Mihin ala on siirtymässä
Modernin käytännön merkittävin muutos kiteytyy termiin shift-left, joka tarkoittaa varmennuksen siirtämistä aikaisemmaksi työn kulussa, kohti hetkeä jolloin muutos syntyy, eikä hetkeä jolloin se toimitetaan. Pinnallisessa muodossaan tämä on vain useampien testien ajamista putkessa. Vakavassa muodossaan se ulottuu vielä kauemmas vasemmalle: hyväksymiskriteerien selkeyttämiseen ennen kuin riviäkään on kirjoitettu, näiden kriteerien ilmaisemiseen suoritettavina tarkistuksina ja suunnitelmien testattavuuden arvioimiseen ensiluokkaisena huolenaiheena. Taloudellinen perustelu on vakiintunut. Virhe, joka napataan silloin kun vaatimus on vielä lause, maksaa korjattuna lähes olemattoman verran; sama virhe tuotannossa löydettynä maksaa suuruusluokkia enemmän, ja joskus maksaa luottamuksen, jota raha ei voi palauttaa.
Jatkuva testaus laajentaa tämän itse toimitusputkeen, niin että jokainen muutos käynnistää automaattisen varmennuskokonaisuuden, jonka tulos toimii etenemisen porttina. Kurinalaisuus tässä ei ole pelkästään testien olemassaolo vaan sellaisen kokonaisuuden olemassaolo, joka on riittävän nopea ja luotettava, että kehittäjät todella odottavat sitä ja uskovat siihen. Putki, joka kestää tunnin ja epäonnistuu satunnaisesti joka viidennellä kerralla, on huonompi kuin ei putkea lainkaan, koska se opettaa ihmiset sivuuttamaan punaisen. Tämän rinnalla sopimustestaus on kypsynyt tavaksi varmentaa palveluiden väliset sopimukset ilman koko järjestelmän pystyttämistä, antaen kummankin puolen vahvistaa, että se noudattaa jaettua rajapintaa. Se on yksi menneen vuosikymmenen aidosti hyödyllisimmistä ideoista organisaatioille, jotka rakentuvat monista pienistä palveluista.
Kaksi muuta virtausta ansaitsee rehellisen käsittelyn. Riskiperustainen testaus on siirtynyt kansanperinteestä menetelmäksi: yhtenäisen kattavuuden tavoittelun sijaan tiimit keskittävät panostuksen tietoisesti sinne, missä todennäköisyyden ja vaikutuksen tulo on suurin, ja hyväksyvät tietoisesti ohuemman varmennuksen siellä missä panokset ovat matalat. Tutkiva testaus puolestaan on lunastettu takaisin taitona kurinalaisuutena tavoitteettoman klikkailun sijaan. Pätevä tutkiva testaaja muodostaa hypoteeseja siitä, miten järjestelmä saattaisi pettää, ja koettelee niitä järjestelmällisesti löytäen virheet, joita skriptatut testit, jotka tarkistavat vain sen minkä joku jo ajatteli tarkistaa, eivät koskaan paljasta. Testitapauksia ja -dataa luonnostelevien generatiivisten työkalujen äskettäinen tulo on todellinen ja hyödyllinen, mutta se vahvistaa näitä arvostelmia eikä korvaa niitä; kone voi ehdottaa tuhat tarkistusta, ja vain inhimillinen päättely ratkaisee, mitkä tuhat kannatti ajaa.
Sellaisten järjestelmien suunnittelu, joita voi todella testata
Itsensä takaisin maksava automaatio ei ole kysymys useampien testien kirjoittamisesta; se on kysymys järjestelmien ja testikokonaisuuksien suunnittelemisesta niin, että testien jatkuva kustannus pysyy niiden ehkäisemien virheiden kustannuksen alapuolella. Tässä arkkitehtuuri ja laatu kohtaavat. Testattavuus on suunnitteluominaisuus, ja samat ominaisuudet, jotka tekevät koodista testattavaa, selkeät rajat, eksplisiittiset riippuvuudet, eristetyt sivuvaikutukset, deterministinen käyttäytyminen, tekevät siitä yleensä ylläpidettävää myös kaikista muista syistä. Kun testaaminen on tuskallista, tuska on yleensä diagnostista: se kertoo, että suunnittelussa on piilotettua kytkentää tai epäselvää vastuunjakoa, ja korjaus kuuluu koodiin eikä yhä monimutkaisempiin testien tukirakenteisiin.
Talous kääntyy kahden suureen varaan, joita tiimit harvoin mittaavat: testin kirjoittamisen ja ylläpitämisen kustannus sen elinkaaren aikana, ja sen nappaamien epäonnistumisten arvo. Nopealla, kohdennetulla yksikkötestillä, joka vartioi aidosti virhealtista logiikkaa, on erinomainen tuotto. Hauras päästä päähän -testi, joka hajoaa aina kun painike siirtyy, vaatii jatkuvaa hoivaa ja pääosin uudelleentarkistaa alempana jo katetun logiikan, tuottaa negatiivisen, ja insinöörityön hiljainen kuluttaminen on tapa, jolla useimmat automaatiohankkeet kuolevat. Kurinalaisuus on kirjoittaa testejä, jotka ovat herkkiä käyttäytymiselle ja tunteettomia rakenteelle, niin että ne epäonnistuvat kun järjestelmä tekee väärin ja pysyvät vaiti kun se tekee oikean asian eri tavalla.
Mikä tuo meidät kattavuuteen, alan väärinymmärretyimpään lukuun. Koodikattavuus mittaa, mitkä rivit tai haarat suoritettiin testien ajon aikana. Siinä kaikki mitä se mittaa. Korkea kattavuus kertoo, että testit koskettivat koodia; se ei kerro mitään siitä, väittivätkö ne mitään merkityksellistä tapahtuneesta, ovatko niiden harjoittamat tapaukset niitä joilla on merkitystä, tai onko läpimenon ja epäonnistumisen ratkaiseva oraakkeli oikeassa. On täysin mahdollista saavuttaa yhdeksänkymmenen prosentin kattavuus testeillä, jotka menisivät läpi vaikka logiikka olisi rikki, koska ne suorittavat koodin tarkistamatta tulosta. Kattavuus on hyödyllinen alarajana ja tapana löytää koodi, jota mikään testi ei ole koskaan ajanut, mikä on tietämisen arvoista. Se on vaarallinen tavoitteena, koska kun siitä tulee päämäärä, ihmiset optimoivat mittarin riskin sijaan, kirjoittaen pinnallisia testejä, jotka nostavat lukua nostamatta varmuutta. Kattavuus kertoo, mihin et ole katsonut; se ei koskaan kerro, että se mihin katsoit on oikein.
Miten testaus menee pieleen
Testauksen epäonnistumiset toistuvat organisaatioiden välillä tunnistettavissa muodoissa, ja niiden nimeäminen auttaa tiimejä näkemään oman tilanteensa selkeästi.
Ylösalainen pyramidi. Ohut pohja yksikkötestejä ja raskas nojautuminen hitaisiin päästä päähän -tarkistuksiin, yleensä oire koodista, jota ei koskaan suunniteltu testattavaksi eristyksissä. Kokonaisuudesta tulee hidas ja epäluotettava, kehittäjät lakkaavat luottamasta siihen, ja varmennus palautuu hiljaa käsityöksi aikataulupaineen alla.
Epävakaat testit. Testit, jotka menevät läpi ja epäonnistuvat ilman mitään muutosta koodissa, useimmiten ajoitusoletusten, jaetun tilan tai ympäristöstä piilotetun riippuvuuden vuoksi. Epävakaus on syövyttävää aivan suhteettomasti näennäiseen kokoonsa nähden, koska kokonaisuus joka huutaa susi opettaa kaikki sivuuttamaan punaisen, ja yksi sivuutettu epäonnistuminen on tapa, jolla todelliset virheet päätyvät tuotantoon vihreän putken läpi.
Kattavuus teatterina. Kattavuusprosentin pitäminen laadun määritelmänä, mikä tuottaa testejä, jotka on kirjoitettu suorittamaan rivejä eikä nappaamaan virheitä. Luku nousee, varmuus ei, ja organisaatio on huonommassa asemassa uskoessaan toisin.
Jälkikäteen testaaminen. Varmennus pultattu kiinni sen jälkeen kun suunnittelu on jäädytetty, jolloin edulliset mahdollisuudet ehkäistä virheitä ovat jo menneet. Jäljelle jää kallis niiden ongelmien havaitseminen, jotka aikaisempi selkeys olisi ehkäissyt kokonaan.
Laatusiilo. Kaiken laatuvastuun delegoiminen erilliselle tiimille, joka on sijoitettu virran loppuun. Tämä katkaisee yhteyden virheiden luojien ja sen palautteen väliltä, joka auttaisi heitä lopettamaan, hidastaa kaiken pullonkaulan läpivirtaukseen ja muuttaa laadun jaetun standardin sijaan neuvotteluksi. Jokaisessa näistä epäonnistumismuodoista lääke on harvoin useammat testit. Se on paremmin sijoitetut testit, rehelliset mittarit, aikaisempi osallistuminen ja suunnittelu, joka ei vastusta varmennusta.
Miten Nashua lähestyy testausta ja laadunvarmistusta
Nashua lähestyy laatua koko toimitusjärjestelmän insinööriominaisuutena, ei tarkastusvaiheena, joka pujotetaan sisään ennen julkaisua. Työmme asiakkaiden kanssa alkaa selväsilmäisellä arviolla siitä, missä varmennuspanostus tällä hetkellä sijaitsee, mitä riskejä se todella käsittelee ja missä tarkoitetun ja osoitetun käyttäytymisen väliset aukot piilevät. Katsomme olemassa olevan testikokonaisuuden muotoa, putken nopeutta ja luotettavuutta, kohtia joissa laatupäätökset tehdään, ja organisaatiorakenteita, jotka joko yhdistävät kehittäjät palautteeseen tai eristävät heidät siitä. Tuloksena ei ole geneerinen kypsyyspistemäärä vaan täsmällinen kuva siitä, missä nykyinen lähestymistapa käyttää panostuksensa hyvin ja missä se käyttää sitä vääriä riskejä vastaan.
Siitä eteenpäin työskentelemme asiakastiimien rinnalla rakentaaksemme testausstrategian, joka perustuu riskiin eikä rituaaliin. Se tarkoittaa varmennuksen työntämistä alas edullisimmalle tasolle, joka pystyy vastaamaan kuhunkin kysymykseen, terveen pyramidin palauttamista siellä missä se on kääntynyt ylösalaisin, ja tietoista harkintaa niiden harvojen päästä päähän -polkujen suhteen, jotka aidosti ansaitsevat hitaat, laveat tarkistukset. Käsittelemme testattavuutta suunnitteluhuolena, joten osallistumisemme ulottuu arkkitehtuuri- ja rajapintapäätöksiin eikä pysähdy testikokonaisuuteen. Autamme tiimejä ottamaan käyttöön shift-left-käytäntöjä niiden vakavassa muodossa, selkeyttäen hyväksymiskriteerit ennen toteutusta ja ilmaisten ne suoritettavina tarkistuksina, ja rakennamme jatkuvan testauksen putkia, jotka ovat riittävän nopeita ja luotettavia, että ihmiset todella luottavat niihin.
Olennaisesti käsittelemme automaatiota perusteltavana investointina eikä päämääränä itsessään. Autamme tiimejä erottamaan vuosikymmenen ylläpitämisen arvoiset testit niistä, jotka hiljaa valuttavat insinöörityötä, ja olemme suoria mittareista: kattavuus diagnostisena alarajana, ei koskaan tavoitteena, ja riskin vähentäminen testikokonaisuuden arvon todellisena mittana. Tutkiva ja käsin tehtävä testaus säilyttävät paikkansa taitoina kurinalaisuuksina niitä kysymyksiä varten, joita automaatio ei osaa esittää. Tuloksena on laatukäytäntö, joka on koko tiimin omistuksessa, sisäänrakennettu siihen miten ohjelmisto suunnitellaan ja toimitetaan, eikä vaihe, joka seisoo valmiin työn ja sen käyttäjien välissä.
Missä Nashua tekee eron
Ero, jonka Nashua tuo, ei ole suurempi testikokonaisuus vaan järkevämpi arvostelu siitä, mistä laatu tulee. Monet organisaatiot osaavat kirjoittaa testejä; paljon harvemmat osaavat kertoa, mitkä testit ansaitsevat elatuksensa, mitkä riskit jäävät kattamatta sillä aikaa kun panostus kasautuu muualle, ja mitkä arkkitehtuuripäätökset hiljaa tekevät koko järjestelmästä vaikeamman todentaa. Tuo arvostelu, joka on rakennettu pitkästä käytännöstä lukuisten yritysjärjestelmien parissa, on se mikä muuttaa testauksen kustannuspaikasta kestävän varmuuden lähteeksi, ja se on se minkä tuomme peliin ensimmäisestä suunnittelukeskustelusta lähtien eikä viimeisestä katselmuksesta ennen julkaisua.
On myös käytännön seuraus, joka muuttaa sen mitä työn sallitaan olettaa. Kun toimeksianto vaatii kyvykkyyttä, jota ei vielä ole olemassa, sen ei tarvitse odottaa hankintasykliä tai toimittajan tiekarttaa. enterprise platform on rakennettu mukautumaan lähes mihin tahansa ominaisuuteen ripeästi, agenttipohjaisen insinöörityön kautta: mitä tarvitaan kuvataan selkokielellä ja tuotetaan nopeasti, mutta aina lujien arkkitehtuuriperiaatteiden puitteissa ja tiukan laadunvarmistuksen alla, niin ettei nopeus koskaan tule johdonmukaisuuden, tietoturvan tai hallinnan kustannuksella. Vaikutus on strateginen eikä pelkästään käytännöllinen. Se siirtää tee tai osta -rajaa, pitää valinnanvapauden edullisena ja antaa arkkitehtuurin seurata strategiaa sen sijaan että strategia taipuisi siihen mitä sattui olemaan hyllyllä.
Mikä sitoo tämän yhteen on kieltäytyminen käsittelemästä laatua erotettavana järjestelmästä, jolla se on. Sisäänrakennamme varmennuksen suunnitteluun, toimitukseen ja käyttöön niin, että tarkoitetun ja todellisen käyttäytymisen välinen vastaavuus voidaan osoittaa edullisesti ja jatkuvasti, ja niin ettei organisaatio enää ylläty epäonnistumisista, jotka sillä oli kaikki keinot ehkäistä. Yrityksille, joiden ohjelmisto on kasvanut nopeammin kuin niiden kyky luottaa siihen, tuo muutos, laadun tarkastamisesta sisään lopussa sen rakentamiseen sisään alusta alkaen, on se missä todellinen ja kestävä ero tehdään.
