Automaattinen tarkistus

Julkaistu

WETO tarkistaa palautuksia automaattisesti tulosteita vertailemalla ja tutkimalla ohjelmien rakennetta. Tulosteiden vertailu on pääasiallinen keino varmistaa, että palautukset toimivat oikein. WETOn esitarkistaja tutkii joitakin tyyliseikkoja ennen varsinaista tarkistusta.

Ota yhteyttä opettajaan, jos et keksi järjellisessä ajassa miksi WETO hylkää ohjelmasi. Kerro suoraan vastuuopettajalle, jos kohtaat testauksessa teknisen ongelman.

Huomaa, että WETOn palautukselle antama ykkönen merkitsee vain sitä, että ohjelma on WETOn mielestä kunnossa. Opettajat tarkistavat tehtäviä ja ykkönen voi muuttua voi muuttua nollaksi, jos ohjelma sisältö ei ole tehtävänannon mukainen.

Esitarkistaja

WETOn esitarkistaja on alkeellinen; se tutkii lähdekoodia vain alla annetuin osin ennen koodin kääntämistä. Ohjelma voi olla pitkälti hyvän ohjelmointitavan vastainen, vaikka WETO ottaa ohjelman vastaan. Vastuu hyvien tapojen noudattamisesta on siten tällä kurssilla – niin kuin ohjelmoinnissa ja elämässä yleensä – kirjoittajalla itsellään.

Esitarkistaja tarkastelee seuraavia tyyliseikkoja:

  • Nimeäminen. Ohjelman nimen tulee Python-tyyylisesti pienin kirjaimin kirjoitettu.
  • Kommentointi. Ohjelmassa tulee olla vähintään yksi kommentti.
  • Sisennys. WETO ei ota vastaan ohjelmia, joissa on käytetty tabulaattoreita, koska Python-ohjelmien sisennykseen suositellaan käytettäväksi välilyöntejä.
  • Rivitys. Yli 100 merkin mittaiset rivit katsotaan liian pitkiksi.

WETO tarkistaa tyylin lisäksi ettei tarkistettavan ohjelman nimessä ole skandinaavisia merkkejä (å-, ä- tai ö-kirjaimia), jotta eri käyttöjärjestelmissä kirjoitettujen ohjelmien testaaminen olisi juohevampaa. Huomaa, että muuttujien nimissä ja erityisesti kommenteissa on täysin sallittua käyttää skandinaavisia merkkejä.

WETO tulkitsee koodin, jos esitarkistaja kelpuuttaa sen. Lähdekoodin on syytä tulkita tavalliseen tapaan omalla koneella ennen palautusta. Omalla tulkitseminen kääntäminen on sujuvampaa, koska tiedostoa ei tarvitse ladata erikseen ja kaikki virheilmoitukset ovat näkyvissä toisin kuin WETOssa, jossa säästetään levymuistia katkaisemalla pitkät ilmoitukset.

Tulosteiden vertailu

Toiminnallisuuden automaattinen tarkistus tapahtuu pääosin vertailemalla malliohjelman ja opiskelijan ohjelman tulosteita, kun molemmille ohjelmille on annettu täsmälleen samat syötteet. Ohjelman suoritus tietyillä syötteillä on testi. Opiskelijan ohjelman tulee toimia kaikissa testeissä täsmälleen samoin kuin malliohjelman, jotta toiminnan tarkistus testeillä eli testaus katsotaan kokonaisuudessaan onnistuneeksi. Kunkin tehtävän testit kuvaillaan tarkemmin palautuskohdan Main-välilehdellä WETOssa.

Automaattisesti testattavan tehtävän tehtävänannossa annetaan ohjelman toiminnan kuvauksen lisäksi ohjelman nimi ja vähintään yksi esimerkkiajo. Esimerkkiajoissa näytetään sekä ohjelman tulosteet että sen saamat syötteet aivan kuin ohjelmaa käytetään komentoikkunassa. Esimerkkiajo voisi olla tämän tapainen:

Hello! I read and pretty print your thoughts.
Please, say something:
Anything that can go wrong will go wrong.
<< Anything that can go wrong will go wrong. >>

jos testattavana on käyttäjältä luetun ajatelman kulmasulkeiden väliin tulostava ohjelma.

Huomaa, että ohjelmasi ei tule toistaa syötteitä niitä näytölle tulostamalla. Yllä luku merkkijono ”Anything that can go wrong will go wrong.” on käyttäjän antama syöte eikä ohjelman tuloste.

Automaattisesti testattavat ohjelmat kommunikoivat englanniksi, jotta tehtävien kääntäminen olisi helpompaa.

Opiskelijan ohjelman tulee toimia ja tulostaa täsmälleen samalla tavalla kuin tehtävänannossa on määritelty, koska jo yhden merkin ero malliohjelman ja opiskelijan ratkaisun tulosteissa johtaa ohjelman hylkäykseen. Malliohjelmat päättävät jokaisen rivin ”näkyvään” merkkiin ja rivinvaihtoon. Ole erityisen tarkkana ettet tulosta rivien alkuun tai loppuun välilyöntien tapaisia ”näkymättömiä” tyhjemerkkejä. Testi hylätään myös, kun ohjelma kaatuu tai joutuu ikuiseen silmukkaan.

WETO näyttää tulosteiden ensimmäiset toisistaan eroavat rivit ja rivien numeron Test scores -taulukon Feedback-sarakkeessa. Ylempi rivi on WETOn odottama tuloste ja alempi testattavan ohjelman tuloste. WETO voi esimerkiksi havaita, että tulosteet eroavat toisistaan jo ensimmäisellä rivillä ylimääräisen välilyönnin vuoksi:

Expected #1: "Hello! I read and pretty print your thoughts."
Observed #1: "Hello! I read and pretty print your thoughts. "

Alempi rivi saattaa katketa kesken, koska WETOn tulosteissa on aina korkeintaan tietty määrän merkkejä.

WETO tulostaa joko ylemmälle tai alemmalle riville ”END OF FILE”, jos tulosteet ovat eri mittaiset, mutta muuten samat. Alla on annettu esimerkki tilanteesta, jossa opiskelijan ohjelma tulostaa kaiken oikein lukuun ottamatta viimeistä riviä, jonka tulostus on unohtunut.

Expected #3: "<< Anything that can go wrong will go wrong. >>"
Observed: END OF FILE.

Hankalammin löydettäviä ongelmia ovat puuttuvat rivinvaihdot. Malliohjelma päättää aina jokaisen rivin rivinvaihtoon. On huomattava erityisesti, että malliohjelma tulostaa rivinvaihdon myös viimeisen rivin loppuun. Rivinvaihto jää puuttumaan, jos ohjelmasi tulostaa viimeisen rivin print-funktiolla käyttäen avainsanaparametria end. Ongelma korjautuu kutsumalla print-funktiota ilman tätä parametria. Pelkän rivinvaihdon voi tulostaa näin:

print()

WETO tulostaa ”MISSING NEWLINE”, kun ratkaisu hylätään nimenomaan viimeiseltä tulostetulta riviltä puuttuvan rivinvaihdon vuoksi. WETO sanoo tällöin esimerkiksi näin:

Expected #3: "<< Anything that can go wrong will go wrong. >>"
Observed: MISSING NEWLINE.

WETO kertoo tyhjällä merkkijonolla ””, jos ohjelmasi tulostaa väärässä paikassa pelkän rivinvaihdon print()-lauseella. Jos edellisessä esimerkissä ohjelma tulostaa pelkästä rivinvaihdosta koostuvan rivin aivan lopuksi, on WETO-tuloste:

Expected: END OF FILE.
Observed #4: ""

WETO tulostaa virheilmoituksen ”ERROR (program exited with code 1)”, kun ohjelma pysähtyy ajonaikaiseen virheeseen eli kaatuu.

Automaattisen tarkistajan huijaaminen testisyötteet tunnistamalla ja tulostamalla oikeat vastaukset on kiellettyä. Ohjelman tulee toimia oikein yleisellä tasolla eli millä tahansa mahdollisella syötteellä. Huijaamisesta seuraa plagiointia vastaava sanktio.

Rakenteen tarkistus

Omia funktioita sisältävien palautusten testauksessa tutkitaan automaattisesti myös ohjelman rakennetta. WETO saattaa hakea ohjelmastasi tehtävänannossa määriteltyä funktiota. Löydetyn funktion automaattinen kutsuminen on mahdollista. Ole tarkkana erityisesti funktioiden otsikoiden kanssa: määrittele parametrit täsmälleen tehtävässä pyydetyllä tavalla ja palauta vain tehtässä määriteltyjä arvoja. Älä esimerkiksi tee funktiolle muita kuin tehtävässä annettuja parametreja ja varmista, että funktiosi hyväksyy parametrien arvoiksi tietoja, joiden tyyyppi on tehtävän mukainen. Funktion nimi on kiinnitetty.

WETO tulostaa rakennetestin epäonnistuessa lyhyen virheilmoituksen. WETO voisi tulostaa esimerkiksi

ERROR: Function "samat_etumerkit(int, int)" missing!

jos ohjelmasta ei löydy samat_etumerkit-nimistä funktiota, jolla on kaksi parametria. WETO ei voi tarkistaa parametrien tyyppejä, mutta vihjaa niistä tulostamalla kunkin parametrin nimen paikalle tehtävänannossa määritellyn tyypin nimen.

WETO arvioi automaattisen operaatiokutsun jälkeen operaation mahdollisesti palauttaman arvon ja kertoo esimerkiksi näin:

ERROR: Invalid return value!
Expected: True
Observed: 10

jos paluuarvo on virheellinen. WETO toteaa yllä, että se operaatio palautti totuusarvon True asemasta lukuarvon 10.

WETO tunnistaa ja hylkää palautukset, joista puuttuu pääohjelmakutsun vartija:

# Kutsutaan pääohjelmaa, jos ohjelmaa ajetaan.
if __name__ == "__main__":
    main()