Skip to content

Maven tai Gradle

Dönges Saska I edited this page Dec 5, 2017 · 1 revision

Maven ja Gradle

Maven ja Gradle on javalle tehtyjä Build automation -työkaluja. Molemmat helpottavat esimerkiksi testikattavuusraporttien tekemistä tai jarin rakentamista. Jos olet jostain perustellusta syystä varma että et halua käyttää kumpaakaan, niin seuraavat tehtävät ei ole sinulle pakollisia. Käytä vain toista työkalua.

[Vaihtoehto 1] Gradle, Travis ja Codecov

Gradlen, travisin ja jacocon avulla saat testikattavuuden näkymään codecovissa suoraan git push jälkeen, tässä esimerkki. Käytännössä kun pushaat projektisi githubiin huomaa travis että projektiisi on tullut muutoksia. Travis lataa projektin itselleen githubista ja ajaa sen gradlen avulla. Testien ajon yhteydessä travis tekee jacoco testiraportit. Jos kaikki testit menee läpi lähettää travis nämä raportit automaattisesti eteenpäin codecoville. Tämän jälkeen raportit on nähtävissä codecovissa.

Tämä onnistuu seuraavalla tavalla. (Onnistuu vaikka projekti olisi ennen ollut Mavenin alla.)

  • Asenna gradle.
  • Mene komentorivillä projektisi juureen (kansio missä on src ja test -kansiot). Tämän jälkeen kirjoita taikasanat gradle init.
  • Lisää build.gradle tiedostoon ainakin seuraavat rivit. Tiedosto kannattaa muutenkin pitää ajantasalla. (Lisää rivit oikeaan kohtaan tiedostoa. Tiedostossa valmiiksi olevat rivit kyllä kertoo paikat)
apply plugin: 'jacoco'

sourceCompatibility = 1.8
targetCompatibility = 1.8

jacocoTestReport {
    reports {
        xml.enabled = true
        html.enabled = true
    }
}

check.dependsOn jacocoTestReport

  • Tee samaan kansioon uusi tiedosto nimeltä .travis.yml, johon lisää seuraavat rivit.
language: java
jdk:
  - oraclejdk8
after_success:
  - bash <(curl -s https://codecov.io/bash)
  • Kirjaudu github -tunnuksilla travisiin ja lisää travis seuraamaan projektiasi.
  • Kirjaudu github -tunnuksilla codecoviin ja lisää codecov seuraamaan projektiasi.
  • Lisää 'README.md' tiedostoon kuvakeet kertomaan meneekö testit travisissa läpi, sekä kuvake codecovin luomasta testikattavuudesta.
![travis](https://travis-ci.org/KAYTTAJANIMI/PROJEKTINNIMI.svg?branch=master)
[![Code Coverage](https://img.shields.io/codecov/c/github/KAYTTAJANNIMI/PROJEKTINNIMI/master.svg)](https://codecov.io/github/KAYTTAJANNIMI/PROJEKTINNIMI/)
  • Tämän jälkeen ei tarvitse enää erikseen luoda testidokumentaatiota, vaan se on kaikkien luettavissa heti git push jälkeen.

  • Jos haluat käyttää gradlea netbeanssin sisällä asenna netbeanssiin gradle support plugin

  • Lisää tietoa gradlesta saa heidän kotisivuiltaan, jos ilmenee kysyttävää lähetä sähköpostia minulle tai käytä stackoverflowta

[Vaihtoehto 2] Maven ja PIT

Projektin luominen

Projekti luodaan normaalisti NetBeansin New Project-nappulasta. Nyt kuitenkin ei valita kategoriaa Java, vaan hieman alempaa etsitään kohta Maven. Oikeasta valikosta voidaan nyt valita Java Application.

Sivulla Name and Location kannattaa antaa ohjelmalle hyvä ja kuvaava nimi. Aseta Project Location:ksi Git-repositoriosi polku (omalle koneellesi luotu repositoriokansio, josta pushit ja commitit tehdään). Myös Group id täytyy vaihtaa ohjelman nimen mukaiseksi tai ainakin joksikin muuksi kuin com.mycompany.enterprising.domain , ja se pitää kirjoittaa pienillä kirjaimilla. Tämä on tärkeää mutaatiotestauksen toiminnan kannalta. GroupId muuttaa ohjelman vakiopakkauksen nimen.

Maven ei eroa "normaalista" Java-projektista kovinkaan paljoa. Suurin ero on pom.xml-tiedosto joka kuvaa xml:nä projektin riippuvuudet eri kirjastoista. Lisäämme sinne valmiiksi muutaman testausta auttavan kirjaston. Käy kopioimassa kaikki tähän mennessä tekemäsi luokat ja koodi nyt maven projektiisi.

Nyt projektisi pom.xml:n pitäisi näyttää jotakuinkin seuraavalta:

<?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>superohjelma</groupId>
    <artifactId>SuperOhjelma</artifactId>
    <version>0.1.0</version>
    <packaging>jar</packaging>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <!-- Lisättävä osa tähän väliin-->

</project>

Tämän xml:n alkuosa on jokaisella projektille yksilöllinen. Siihen emme koske. Sen sijaan haluamme lisätä muuutaman riippuvuuden ja pluginin projektiin. Lisätään </properties>-tagin ja </project>-tagin väliin osa:

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
            <version>3.3</version>
        </plugin>
        <plugin>
            <groupId>org.pitest</groupId>
            <artifactId>pitest-maven</artifactId>
            <version>1.1.8</version>
        </plugin>
    </plugins>
</build>

Lisäyksen jälkeen pom.xml pitäisi näyttää jotakuinkin tältä:

<?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>superohjelma</groupId>
    <artifactId>SuperOhjelma</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
                <version>3.3</version>
            </plugin>
            <plugin>
                <groupId>org.pitest</groupId>
                <artifactId>pitest-maven</artifactId>
                <version>1.1.8</version>
            </plugin>
        </plugins>
    </build>

</project>

Tämän jälkeen projektille voi tehdä mutaatiotestausraportteja, joista käy ilmi myös rivikattavuus. Tehdään vielä näiden generoimisesta hieman helpompaa.

Lisää projektiin uusi tiedosto New File...-näppäimellä. Valitse XML -> XML Document ja anna sille nimeksi nbactions. Siirry seuraavan ikkunaan ja valitse Well-formed Document. Paina Finish. Nyt projektissa pitäisi olla uusi nbactions.xml-tiedosto. Jos se ei ole Project Files-kansiossa, siirrä se sinne.

Avaa tiedosto ja korvaa sen sisältö tällä:

<?xml version="1.0" encoding="UTF-8"?>
<actions>
    <action>
        <actionName>CUSTOM-pit</actionName>
        <displayName>pit</displayName>
        <goals>
            <goal>org.pitest:pitest-maven:mutationCoverage</goal>
        </goals>
    </action>
</actions>

Tallenna ja aja projektille Clean and Build. Nyt kun klikkaat projektia oikealla hiirennäppäimellä, Custom (tai Run Maven)-valikon alta pitäisi löytyä _pit-_vaihtoehto. Jos tässä vaiheessa raportin generoiminen Netbeansin valikosta aiheuttaa poikkeuksen, eikä pit näytä löytävän testejä, määritä testiluokkien sijainti pitille kohdan Pitin konfigurointi-mukaan.

Raportit

Lainaus Pit-testien sijainnista:

Mutaatiotestaa ohjelmasi suorittamalla ensin testit ja sen jälkeen klikkaamalla NB:stä projektin kohdalla oikeaa nappia ja valitsemalla custom/pit

tai vaihtoehtoisesti ollessasi projektihakemistossa antamalla komentoriviltä komennot mvn test ja mvn org.pitest:pitest-maven:mutationCoverage

Edellinen onnistuu myös yhdellä komennolla mvn test org.pitest:pitest-maven:mutationCoverage

Tulokset tulevat projektihakemistosi alihakemistoon target/pit-reports/aikaleima/index.html. Aikaleima on numerosarja joka kertoo suoritushetken, tyyliin 201311181742 (testi ajettu 18.11.2013 klo 1742). Avaa tulokset web-selaimella. Firefoxilla tämä tapahtuu komennolla open file. Voit myös avata selaimen terminaalissa menemällä ensin projektihakemistoon ja antamalla komento chromium-browser target/pit-reports/aikaleima/index.html. Kun ajat mutaatiotestit uudelleen, muista avat oikea raportti!

Voit poistaa vanhat raportit painamalla vasara+harja-symbolia (clean and build) tai komentoriviltä komennolla mvn clean

Raportista näet mitkä mutantit jäävät henkiin.

Raportteja ei tarvi lisätä viikkopalautukseen, ja oikeastaan koko target -kansio kannattaa lisätä .gitignore tiedostoon, jottei se tule palautukseen mukaan. Tärkeintä on että se joka lataa projektisi voi luoda raportit itselleen omalla koneella.

Pitin konfigurointi

Pit-testaukseen voi suhteellisen helposti määrittää, mitkä luokat testataan. Jos tavoittelee 100% mutanttien tappamista, tai muuten vaan nätimpää dokumentaatiota, voi näin jättää muun muassa käyttöliittymän ja main-luokan pois mutaatiotestauksesta.

Lisäämällä pom.xml:ään plugin-tagien sisään configurationin, voi määrittää tarkasti, minkä pakettien sisällöt testataan. Eli jos testiraporttiin halutaan kuvitteellisesta ristinollaohjelmasta testata vain logiikka ja tekoäly, kerrotaan tämä targetClasses:n ja targetTests:n kautta näin:

Korvataan pom.xml:n pit-plugin kohta:

            <plugin>
                <groupId>org.pitest</groupId>
                <artifactId>pitest-maven</artifactId>
                <version>1.1.8</version>
            </plugin>

Seuraavan tyylisellä (muuta param-kohdat omaa ohjelmaasi vastaaviksi):

<plugin>
    <groupId>org.pitest</groupId>
    <artifactId>pitest-maven</artifactId>
    <version>1.1.8</version>
    <configuration>
        <targetClasses>
            <param>superohjelma.logiikka.*</param>
            <param>superohjelma.tekoaly.*</param>
        </targetClasses>
        <targetTests>
            <param>superohjelma.logiikka.*</param>
            <param>superohjelma.tekoaly.*</param>
        </targetTests>
    </configuration>
</plugin>

Eli jos haluat testata paketin joka NetBeanssissa on laivanupotus.logiikka, täytyy pom.xml:ään laittaa aivan suoraan <param>superohjelma.logiikka.*</param>.

Virhetilanteet

  • Jos pittiä ajaessa tulee kasa punaista tekstiä, joka näyttää suunnilleen tältä:
Failed to execute goal org.pitest:pitest-maven:0.30:mutationCoverage (default-cli) on project OhHa:
Execution default-cli of goal org.pitest:pitest-maven:0.30:mutationCoverage failed:
No mutations found. This probably means there is an issue with either the supplied classpath or filters.
  • Virhe voi johtua siitä, että projektissasi ei ole vielä yhtään testiä, tee siis vähintään yksi testi ja yritä uudestaan. Jos virhe ei poistu, lue alaspäin.

  • Se tarkoittaa, että pom.xml:n groupID ja projektin pakettien nimet eivät täsmää keskenään. Tai että konfiguroinnin parametrit osoittavat väärään paikkaan. Tai että testit eivät ole koodia vastaavissa paketeissa.

  • Jos et ole konfiguroinut pittiä, tarkista että ohjelmasi oletuspaketin nimi ei ole eri kuin pom.xml:ssä oleva groupID. Tässä isoilla kirjaimilla on väliä, eli jos paketin nimi on "ohha" ja pom.xml:ssä lukee <groupId>OhHa</groupId>, ei pit-raportin generointi tule onnistumaan. Jos ero löytyy, korjaa jommankumman nimi.

  • Jos olet konfiguroinut pittiä, tarkista ettet ole vahingossa lisännyt liian pitkää polkua.

  • Tarkista että testisi ovat ohjelmakoodia vastaavissa paketeissa. Eli jos testaat ristinolla.logiikka- paketissa olevaa Ruutu-oliota, pitää Test Packagesissa olla paketti ristinolla.logiikka, jonka sisällä on RuutuTest.

  • Jos Pit-raportti generoidaan oikein, mutta se näyttää 0% kaikessa vaikka toimivia testejä on, tarkista että testitiedostojen alussa on testitiedoston pakettia vastaava pakettimäärittely, esim: package superohjelma.logiikka

  • Myös jos pom.xml:n groupId:ssa on sana 'java', niin Pit-raportti voi generoitua näyttämään 0% rivi- ja mutaatiokattavuudeksi. Esimerkiksi pakettirakenne 'javalabra.korttipeli' EI siis toimi ja paketin 'javalabra' nimi täytyy muuttaa ja korjata groupId pom.xml -tiedossa.

  • Pit antaa myös (epäinformatiivisen) virheilmoituksen, jos projektissa ei löydy main-metodia.

  • Jos Pit näyttää kuitenkin löytävän testit, tarkista, että main-metodisi ei ole tyhjä.