Automaattinen tarkistus

Julkaistu

WETO-järjestelmä tarkistaa Java-ohjelmia pääosin toiminnallisuuden osalta. 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.

Tarkistettavan ohjelman nimessä ei saa olla 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 hylkää niin sanotulla BOM-merkillä alkavat tiedostot Java-kääntäjän puolesta, koska WETOssa BOM-merkistä aiheutunut kääntäjän virheilmoitus on hyvin vaikeasti tulkittava.

WETOn tyylitarkistaja 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.

  • Nimeäminen. Ohjelman nimen tulee alkaa Java-tyylisesti isolla kirjaimella.
  • Kommentointi. Ohjelmassa tulee olla vähintään yksi kommentti.
  • Sisennys. WETO ei ota vastaan ohjelmia, joissa on käytetty sisennykseen sekä välilyöntejä että tabulaattoreita, jotta sisennys näkyisi varmemmin opettajan koneella opiskelijan ajattelemalla tavalla.
  • Rivitys. Yli 120 merkin mittaiset rivit katsotaan liian pitkiksi.

WETO tarkistaa tyylin lisäksi ettei palautettavassa ohjelmassa ole käytetty package-määrettä, koska WETOn automaattitarkistaja ei toistaiseksi ymmärrä pakkaukseen liitettyjä tiedostoja.

WETO hylkää myös ohjelmat, joissa rivinvaihtoon käytetään System.out.print-metodia ja ’\r’-merkkiä (Carriage Return, CR) esimerkiksi näin:

   System.out.print("\r\n");

koska WETO toimii käyttöjärjestelmässä, jossa rivit vaihdetaan pelkällä ’\n’-merkillä (Line Feed, LF). Poista tarvittaessa ”kovakoodatut” CR-merkit ja käytä System.out.println-operaatiota, joka osaa tulostaa rivinvaihdot käyttöjärjestelmälle ominaisella tavalla.

WETO kääntää koodin, jos tyylitarkistaja kelpuuttaa sen. Lähdekoodin kääntäminen on syytä tehdä tavalliseen tapaan omalla koneella ennen palautusta. Omalla koneella 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.

Toiminnallisuuden automaattinen tarkistus tapahtuu 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. Testeissä käytetyt syötteet on lueteltu tehtävän WETO-sivulla.

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 merkistöongelmien välttämiseksi.

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 System.out.print-operaatiolla. Ongelma korjautuu tulostamalla rivinvaihto System.out.println-operaatiolla myös viimeisen rivin loppuun. Pelkän rivinvaihdon voi tulostaa näin:

System.out.println();

WETO tulostaa ”MISSING NEWLINE”, kun ratkaisu hylätään nimenomaan viimeiseltä tulostetulta riviltä puuttuvan rivinvaihdon vuoksi. Jos esimerkkiohjelma tulostaa viimeisen rivin System.out.print-operaatiolla, WETO sanoo seuraavaa:

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 System.out.println(); 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.

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