Skip to content
Snippets Groups Projects
Commit 94148f3c authored by Juuso Rytilahti's avatar Juuso Rytilahti
Browse files

Deleted Finnish materials

parent 71f7e1ef
No related branches found
No related tags found
No related merge requests found
public class Laskin {
int tulos;
public Laskin() {
this.tulos = 0;
}
public int getTulos() {
return tulos;
}
public void lisaa(int luku) {
tulos += luku;
}
public void kerro(int luku) {
tulos *= luku;
}
public void vahenna(int luku) {
tulos += luku;
}
}
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class LaskinTest {
@Test
void getTulos() {
Laskin laskin = new Laskin();
assertEquals(0, laskin.getTulos());
}
@Test
void lisaa() {
Laskin laskin = new Laskin();
laskin.lisaa(10);
laskin.lisaa(-5);
assertEquals(5, laskin.getTulos());
}
@Test
void kerro() {
Laskin laskin = new Laskin();
laskin.lisaa(5);
laskin.kerro(2);
laskin.kerro(-3);
assertEquals(-30, laskin.getTulos());
}
@Test
void vahenna() {
Laskin laskin = new Laskin();
laskin.lisaa(10);
laskin.vahenna(5);
assertEquals(5, laskin.getTulos());
}
}
\ No newline at end of file
# Viikko 4 - Yksikkötestaus
Aloita suorittaminen tästä: [Viikko 4 - Yksikkötestaus](viikko4.md)
# JUnitin käyttöönotto IntelliJ:ssä
Tarkastellaan seuraavaksi JUnit-kirjaston käyttöönottoa IntelliJ:ssä. Kirjasto otetaan käyttöön lisäämällä se Mavenin käyttämään `pom.xml`-tiedostoon, joten lisäys onnistuu melko samalla tavalla missä tahansa ohjelmointiympäristössä.
Tehdään tarkoitusta varten kokonaan uusi projekti.
Valitse IntelliJ:ssä **File --> New --> Project** ja anna projektin nimeksi esimerkiksi `TestausTesti`.
Muista valita kohtaan **Build system** valinnaksi **Maven**. Voit varmuudeksi tarkistaa [ohjeet](https://gitlab.utu.fi/TKO_2116/viikko-3/-/blob/main/ide-integraatio.md) viime kerralta.
## JUnit-kirjaston lisäys
JUnit otetaan käyttöön lisäämällä riippuvuus (eli *dependency*) Mavenin tiedostoon `pom.xml`.
Avaa tiedosto tuplaklikkaamalla sitä projekti-ikkunassa.
### Tapa 1: hyödynnä IntelliJ:n hakua
Klikkaa **ALT + Insert** ja valitse *Add dependency*.
Kirjoita kuvassa näkyvään hakukenttään `org.junit.jupiter` ja valitse kuvassa näkyvän valinnan (luultavasti ensimmäinen hakutulos) kohdalta linkki *Add*.
![dependency search](pic/dependency_search.png)
### Tapa 2: kirjoita riippuvuus suoraan pom.xml-tiedostoon
Vaihtoehtoisesti voit myös itse kirjoittaa alla olevan koodilisäyksen `pom.xml`-tiedostoon (tägin `</properties>` jälkeen):
```xml
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.9.2</version>
</dependency>
</dependencies>
```
Muutokset saa ladattua joko komennolla `mvn dependency:resolve` tai suoraviivaisemmin klikkaamalla IntelliJ:n editori-ikkunan oikeaan yläkulmaan ilmestyvää painiketta:
![reload button](pic/reload_button.png)
Siirry seuraavaksi osioon [Ensimmäinen testi](eka_testi.md)
# Ensimmäisen testin kirjoittaminen ja suorittaminen
Kirjoitetaan ensi testattava ohjelmakoodi. Luo projektin **src --> main --> java** -kansioon tiedosto
`Laskin.java`
ja kirjoita tai kopioi sen sisään seuraava ohjelmakoodi:
```java
public class Laskin {
int tulos;
public Laskin() {
this.tulos = 0;
}
public int getTulos() {
return tulos;
}
public void lisaa(int luku) {
tulos += luku;
}
public void kerro(int luku) {
tulos *= luku;
}
}
```
Uuden testin saa muodostettua helposti IntelliJ:ssä: vie kursori luokan nimen päälle editorissa ja paina **ALT + Enter**.
Valitse valikosta kohta *Add test*. Rastita avautuvasta dialogi-ikkunasta kaikki metodit testattavaksi:
![add test](pic/add_test.png)
Kirjoitetaan ensimmäinen testi luokan `LaskinTest` metodiin `getTulos()`. Testin tarkoituksena on varmistaa, että kun luodaan uusi Laskin-olio, tulos on aluksi 0.
Kirjoita tai kopioi metodiin seuraava ohjelmakoodi:
```java
@Test
void getTulos() {
Laskin laskin = new Laskin();
assertEquals(0, laskin.getTulos());
}
```
Metodissa luodaan uusi Laskin-olio. Tämän jälkeen kutsutaan testausmetodia `assertEquals(int expected, int actual)`, joka vertaa laskimen metodin `getTulos` palauttamaa arvoa arvoon 0. Jos arvot ovat samat, testi menee läpi.
Yksittäinen testi saadaan ajettua klikkaamalla testikoodin vasemmalta puolelta löytyvää kolmiota ja valitsemalla **Run getTulos**:'
![run test](pic/run_test.png)
Testin tulos ilmestyy (yleensä) alhaalta löytyvään konsoli-ikkunaan. Vihreä väkänen tarkoittaa, että testi meni onnistuneesti läpi.
![test done](pic/test_done.png)
Siirry seuraavaksi osioon [Lisää testejä](lisaa_testeja.md)
\ No newline at end of file
# Lisää testejä
Laskimella on myös kaksi muuta metodia, joiden toimintaa haluamme testata.
Metodien `lisaa` ja `kerro` pitäisi lisätä tulokseen luku tai kertoa se annetulla luvulla.
Täydennetään testiluokkaan siis aluksi lisäystä testaava metodi:
```java
@Test
void lisaa() {
Laskin laskin = new Laskin();
laskin.lisaa(10);
laskin.lisaa(-5);
assertEquals(5, laskin.getTulos());
}
```
Testissä lisätään laskimen arvoon aluksi 10 ja sen jälkeen -5. Tämän jälkeen odotetaan, että laskimen tulos olisi 5 (eli 0 + 10 - 5).
Toteutetaan myös kertomista testaava metodi:
```java
@Test
void kerro() {
Laskin laskin = new Laskin();
laskin.lisaa(5);
laskin.kerro(2);
laskin.kerro(-3);
assertEquals(-30, laskin.getTulos());
}
```
Nyt laskimen arvoon aluksi lisätään 5 ja sitten kerrotaan se luvuilla 2 ja -3. Lopputuloksena oletetaan olevan -30 (eli laskun 5 * 2 * -3 lopputulos).
Lisätään seuraavaksi Laskin-luokkaan uusi toiminnallisuus, joka toimii väärin. Lisää luokkaan `Laskin` seuraava metodi:
```java
public void vahenna(int luku) {
tulos += luku;
}
```
Lisätään lisäksi luokkaan `LaskinTest` seuraava testimetodi:
```java
@Test
void vahenna() {
Laskin laskin = new Laskin();
laskin.lisaa(10);
laskin.vahenna(5);
assertEquals(5, laskin.getTulos());
}
```
Nyt kun ajetaan viimeinen testi, huomataan, ettei testi mene läpi. Oletettu arvo on eri kuin laskimen palauttama arvo:
![test error](pic/test_error.png)
Testin tuloksen perusteella on helppo korjata virhe ohjelmassa.
Siirry seuraavaksi osioon [Testien suoritus](testien_suoritus.md)
\ No newline at end of file
# Lisätietoa testeistä
Testiluokassa on käytössä erilaisia testimetodeita. Yleensä metodien nimi alkaa sanalla assert. Ideana testaamisessa yleensä on, että asetamme testattavan luokan jonkinlaiseen tilaan tai kutsumme jotain julkista operaatiota. Tämän jälkeen tarkastellaan onko tila tai operaation lopputulos se, mikä sen pitäisi olla.
Nimensä mukaisesti assert-metodeilla asetetaan siis erilaisia vaatimuksia, joiden pitää olla tosia, jotta testi menee läpi. Huomaa, ettei testi sinänsä (välttämättä) kerro minkä takia jokin ominaisuus ei toimi. Se kuitenkin ohjaa ohjelmoijan oikeille jäljille.
## Hyödyllisiä testimetodeja
JUnit tarjoaa paljon erilaisia testimetodeja. Seuraavilla pääset ainakin alkuun:
* `assertEquals(o1, o2)` - testi menee läpi, jos o1 ja o2 ovat yhtä suuria. Perustyyppisissä arvoissa vertaiiluun käytetään yhtäsuurusoperaattoria ja oliotyyppisissä metodia equals.
* `assertTrue(t1)` - testi menee läpi, jos totuusarvotyyppinen lauseke t1 on tosi.
* `assertSame(o1, o2)` - testi menee läpi, jos o1 ja o2 viittaavat täsmälleen samaan olioon
* `fail()` - testi ei mene koskaan läpi. Metodi on hyödyllinen, jos testi on monimutkaisempi, ja esimerkiksi silmukan sisällä tietyssä tilanteessa todetaan, ettei testiä voi läpäistä.
Täydellisen listan metodeista löydät luokan [API-kuvauksesta](https://junit.org/junit5/docs/5.8.2/api/org.junit.jupiter.api/org/junit/jupiter/api/Assertions.html)
Esimerkkitiedostot `Laskin.java` ja `LaskinTest.java` löytyvät tästä samasta repositoriosta.
Lisätietoa testaamisesta Pythonilla löydät esim. [viime vuoden materiaaleista](docs.google.com/document/d/1UHm5abTJSxGxxu4iUkGAoPRWfentEv3VdgWmqf6cZNQ/edit?usp=sharing).
## Kurssipalaute
Vastaa lopuksi [kurssipalautteeseen](https://link.webropolsurveys.com/S/138399F62AC218D2)!
# Testien suoritus
Kaikki yhdessä luokassa määritellyt testit voit helposti suorittaa IntelliJ:ssä klikkaamalla testiluokan nimen vierestä löytyvää kolmiota ja valitsemalla kohdan *Run LaskinTest*.
![run all tests](pic/run_all_tests.png)
Nyt testikonsoliin tulostuu kaikkien testien tulokset.
![all tests done](pic/all_tests_done.png)
## Testien automatisointi Mavenin avulla
Varsinkin isommassa projektissa testien ajaminen kannattaa suorittaa koontityökalulla. Maven tarvitsee testien ajamiseksi kuitenkin lisäosan eli pluginin.
Lisätään `pom.xml` -tiedostoon tieto pluginista tägin `<build>` alle. Koko tiedosto näyttää nyt siis suunnilleen tältä:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>fi.utu.tko216</groupId>
<artifactId>TestaustTesti</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>19</maven.compiler.source>
<maven.compiler.target>19</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.9.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
</plugin>
</plugins>
</build>
</project>
```
Nyt projektin testit voidaan suoritaa komennon `MVN Test` avulla. Jos Maven-konsoli ei ole auki, tuo se näkyviin valitsemalla **View --> Tool Windows --> Maven**.
Klikkaa tämän jälkeen painiketta **Execute Maven Goal** ja valitse kohta **MVN Test**.
Valinta ajaa kaikki Test-kansiosta löytyvät testiluokat, joiden nimestä löytyy alusta tai lopusta sana `Test` ja jotka sisältävät yksikkötestejä.
Isommmissa projekteissa testien ajaminen kannattaakin automatisoida osaksi koontiprosessia niin, että testit ajetaan aina kun ohjelmaan tehdään muutoksia.
Siirry seuraavaksi osioon [Lisätietoa testeistä](lisatietoa_testeista.md)
# Viikko 4 - Yksikkötestaus
Systemaattinen ohjelmistojen testaaminen on tärkeä osa ohjelmistojen tuotantoa. Testaamista tehdään yleensä usealla eri tasolla - ohjelmistoista voidaan testata esimerkiksi mahdollisimman sujuvaa käyttökokemusta. Tärkeä osa ohjemistojen testaamista on ohjelmointivirheiden kitkeminen pois koodista. Suuremmissa ohjelmistoissa päästään kuitenkaan tuskin koskaan tilanteeseen, jossa koodi olisi täysin virheetöntä.
Yksikkötestaus on väline ohjelmointivirheiden löytämiseksi. Ideana on, että koodin testausta varten kirjoitetaan erillisiä testejä, jotka pyrkivät varmistamaan, että ohjelman eri osat tekevät sen mitä niiden pitäisikin tehdä. Kun ohjelmaan tehdään muutoksia, voidaan ajaa kaikki (tai ainakin muutoksiin liittyvät) testit uudestaan, jotta nähdään, etteivät muutokset hajoittaneet aikaisempaa toiminnallisuutta. Yleensä projekteissa pyritään siihen, että testien ajaminen on automatisoitu ja tehdään esimerkiksi aina ennen kuin tuotantoon paketoidaan uusi versio.
Eräs osa-alue testaamisessa on myös _regressiotestaus_, eli ohjelman testaaminen taantumien varalta. Kun koodia muutetaan yhdestä paikasta, tästä saattaa aiheutua yllättäviä muuutoksia muun koodin toimintaan, eivätkä nämä välttämättä käy ilmi perus "play-nappulan painamisella". Kun kaikki kymmenet, sadat, jopa tuhannet testit ajetaan uudestaan jokaisen pienenkin muutoksen jälkeen, voidaan varmistaa että kaikki toimii edelleen.
## JUnit - yksikkötestit Javalla
Javassa yleisimmin käytetty testauskirjasto on nimeltään JUnit. Kirjasto on vapaasti levitettävä, ja osa laajempaa, eri yhteyksissä käytettävää testauskirjastojen perhettä, jonka nimi on xUnit.
JUnit saadaan integroitua vaivattomasti kehitysprosessiin. Maven ajaa automaattisesti yksikkötestit osana projektin kokoamista (MVN Build), jos sellaiset on projektissa määritelty:
* validate: varmistaa, että kaikki tiedot ovat saatavilla ja oikein
* compile: käännä lähdekoodi
* **test-compile: käännä testauskoodi**
* **test: suorita yksikkötestit**
* package: paketoi ohjelma, esim. .jar -paketiksi
* jne.
JUnit-testit ovat Java-ohjelmia. Yleensä testit rakennetaan niin, että jokaista testattavaa luokkaa kohti on oma testiluokkansa (nimeämiskäytäntö on yleensä kirjoittaa sana Test luokan nimen eteen tai perään - esimerkiksi luokkaa Opiskelija testaisi luokka OpiskelijaTest tai TestOpiskelija).
Testien kirjoittaminen ei ole aina suoraviivaista, eikä tämän harjoituksen tavoittena ole antaa siitä täysin kattavaa kuvaa. Tarkoituksena on opastaa testien lisäämiseen omiin ohjelmiin ja näyttää muutaman esimerkin ja harjoituksen kautta millaisia virheitä testien avulla pyritään saamaan kiinni.
Siirry seuraavaksi osaan [Asennus](asennus.md)
fin_pics/add_test.png

30.3 KiB

fin_pics/all_tests_done.png

7.4 KiB

fin_pics/dependency_search.png

11.4 KiB

fin_pics/reload_button.png

1.42 KiB

fin_pics/run_all_tests.png

9.76 KiB

fin_pics/run_test.png

20.7 KiB

fin_pics/test_done.png

3.38 KiB

fin_pics/test_error.png

15 KiB

0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment