diff --git a/dokumentaatio/testausdokumentti.md b/dokumentaatio/testausdokumentti.md index ea7f3d4..b99b080 100644 --- a/dokumentaatio/testausdokumentti.md +++ b/dokumentaatio/testausdokumentti.md @@ -3,10 +3,10 @@ ## Koodin testaus ### Testien toteutus -Automaattinen yksikkötestaus on toteutettu pytest-kirjastolla ja testikattavuuden raportoinnin hoitaa coverage-kirjasto. Aiheen kannalta keskeistä subjektiivista testausta olen toteuttanut generoimalla melodioita ohjelman avulla. +Automaattinen yksikkötestaus on toteutettu pytest-kirjastolla ja testikattavuuden raportoinnin hoitaa coverage-kirjasto. Aiheen kannalta keskeistä subjektiivista testausta olen toteuttanut generoimalla manuaalisesti melodioita ohjelman avulla. Koodin laadun automaattinen "testaus" on toteutettu pylintillä. ### Ohjeet -Ennen testien suorittamista tulee pytest- ja coverage-kirjastot olla asennettuna käytössä olevassa ympäristössä. Testit saa suoritettua kommennolla +Ennen testien suorittamista tulee pytest- ja coverage-kirjastot olla asennettuna käytössä olevassa ympäristössä (löytyvät jo, mikäli [asennusohjeita](https://github.com/ArcticCoder/markov-music-generator/blob/main/dokumentaatio/ohje.md#asentaminen) on noudatettu). Testit saa suoritettua kommennolla `invoke test` @@ -18,15 +18,48 @@ Tämän jälkeen raportti löytyy tiedostosta `htmlcov/index.html`. ![Testikattavuusraportti. Kokonaiskattavuus 99%](https://github.com/ArcticCoder/markov-music-generator/blob/main/dokumentaatio/kattavuus.png?raw=true) -Koodin laadun automaattinen "testaus" on toteutettu pylintillä: +Pylint tarkistuksen voi suorittaa komennolla + `invoke lint` +### Mitä yksikkötestit (pääpiirtein) kattavat +Ohjeiden mukaisesti `main` ja `ui` on jätetty testien ulkopuolelle. + +`trie`: +- Triee:n tulee lisättyä kaikki mitä pitää, ja laskuri toimii oikein yksinkertaisella testitapauksella +- Triestä ei löydy sellaista, mitä ei pitäisi. Tarkistettu tietyt rajatut tilanteet, eli jos syötetään "AB", niin trien juuren lapsista ei löydy "B", ja toisaalta "A"-solmun laskuri on 0 +- Trie laskee ja antaa todennäköisyydet oikein yksinkertaisella esimerkkitapauksella + +`markov_ketju`: +- Virheidenkäsittely antamalla vriheellisiä arvoja +- Ketju antaa oikean sekvenssin, niin yhdellä kuin kahdella asteella, kun seuraavia merkkejä on vain yksi mahdollinen +- Ketju toimii oikein, kun opetusdatassa on useampi lista, eikä esimerkiksi yhdistä listoja +- Ketju palauttaa `None`, jos vaihtoehtoja ei ole +- Tarkistettu, että 3000 generoidun merkin osuudet vastaavat likimain (5 prosenttiyksikön marginaali) opetusdatasta nähtäviä oikeita osuuksia + +`midi_kasittelija`: +- Vastaus vastaa syötettä, kun kirjoitetaan ja sitten luetaan tietty nuottilista +- Kun toetutetaan muunnos annetulle tiedostolle, tiedostosta löytyy oikeat nuotit, eikä muita nuotteja. Tämän enempää muunnoksen oikeellisuutta ei tarkisteta. Tätä varten loin erillisien testi MIDI-tiedoston +- Molli-sävellajissa olevat nuotit jätetään oikein pois kokonaan, ja muut trasponoidaan C-duuriin. Tätä varten loin erillisien testi MIDI-tiedoston + +`musiikki_generaattori`: +Yksi iso testi, jossa +- Kirjoitetaan tietyt nuotit MIDI-tiedostoon +- Luetaan tämä tiedosto opetusdatana. Opetusdatassa jokaiselle nuotille tai nuottiparille on vain yksi mahdollinen seuraava nuotti +- Tarkistetaan, että 1. asteen ketju antaa oikean sekvenssin +- Tarkistetaan, että 2. asteen ketju antaa oikean sekvenssin +- Tarkistetaan, että nuotteja ei generoida, mikäli alkuosalle ei löydy sopivaa jatkoa opetusdatasta + ## Subjektiivinen testaus -Viikko 4: Generoin koodin nykyisellä versiolla 4:nnen asteen Markovin ketjulla lyhyen melodian. Vertailukohtana generoin täysin sattumanvaraisen melodian. Mielestäni ero on huomattava, varsinkin kun otetaan huomioon Markovin ketjujen yksinkertaisuus. +Subjektiivista testausta varten keräsin opetusdataa ja generoin eri asetuksilla sävelmiä. Alla on: +- Eri asteisilla ketjuilla generoituja, yksinkertaista rytmiä noudattavia melodioita +- Rytmitön 4. asteen ketjulla tuotettu +- Kaksi MIDI muunnosta 4. asteen ketjuilla +- Täysin sattumanvaraisia nuotteja sisältävä rytmitön "melodia" ikään kuin lähtökohtana -Viikko 5: Toteutin tällä viikolla manuaalisen rytmin määrittämisen. Generoin 80 lyhyen melodian yksinkertaisella kahden tahdin välein toistuvalla rytmillä. Yllätin siitä kuinka paljon yksinkertainenkin rytmi "elävöitti" generoitua melodiaa. +Itse en huomannut juurikaan eroa 1. ja toisen 2. asteen ketjujen välillä. Molemmat olivat merkittävä parannus sattumaan nähden, mutta melko "päättömän" oloisia kuitenkin. 3. asteen ketju oli kenties hieman parempi, mutta mielestäni 4. asteen ketju oli yllättävän suuri parannus aiempiin nähden. Tätä pidemmillä ketjuilla päädyttäisiin enimmäkseen toistamaan opetusdataa, joten niitä ei tässä ole. -Viikko 6: Testasin tällä viikolla kattavammin eri asteilla. Rajoitin asteen alle 5, sillä huomasin että tätä suuremmilla asteilla monessa tilanteessa oli vain yksi vaihtoehto seuraavalle nuotille, joka viittaa siihen että opetusdatan määrä ei ole riittävän suuri. Poistin myös tämän takia aiemmat testit. Lisäksi toteutin mekanismin, jolla olemassaolevan MIDI tiedoston 1. raidan nuotin voidaan korvata Markovin ketjun antamilla nuoteilla. Nämä "muunnokset" löytyvät myös alta. Näissä oli käytössä 4. asteen ketju. +Yllätyin erityisesti siitä, kuinka suuri rytmin merkitys on. Vertaamalla yksinkertaista rytmiä tasaiseen rytmiin, ja toisaalta oikeiden sävelmien rytmeihin, huomataan että rytmitön musiikki on hyvinkin raskasta kuunneltavaa, mutta toisaalta jo neljännen asteen Markovin ketjulla saatiin yllättävän musikaalisia lopputuloksia, kun rytmi kopioitiin oikeasta sävelmästä (MIDI-muunnos). [Aste 1](https://github.com/ArcticCoder/markov-music-generator/blob/main/dokumentaatio/aste_1.mp3)