Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web servers, web development, networking and security services. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

Feed4JUnit

Feed4JUnit

Feed4JUnit olakšava pisanje parametrizovanih testova za JUnit okvir i snadbeva ih sa predefinisanim ili slučajnim testom podataka. To vam omogućava da lako poboljšate testiranje:
  • Čitanje test podatka iz CSV ili Excel datoteka definisani od strane poslovnih analitičara i izveštavanje uspesnosti testa u okviru izrade / jedinice testa infrastrukture
  • Dobijanje test podatke iz baze podataka ili prilagođenog izvora podataka
  • Lakše vršenje dimnog testa ali validni podaci mogu snažno poboljšati pokrivenost koda i dokazne bagove uzrokovane veoma posebnim skupom podataka
  • Lako definisanje ekvivalentnosti klase testova, što je moćna metodologija softverskih testera, ali malo poznata među programerima
Konfiguraciju je lako naučiti da se održi i osnuje na Java komentarima. Oni se mogu koristiti za uvoz podataka iz fajlova (CSV, Ekcel) ili da generišu nasumične podatke koji se podudaraju sa ogranicenim deklarisanim podacima sa izuzetkom iz "Bean Validation" JSR 303 i Java 7 ili iz Benerator . Povezivanjem sa Benerator-om,vodeći svetski otvoreni izvor test podataka generatora, možete podesiti generaciju proizvoljnih složenih važećih i nevažećih skupova podataka.

 

Uvod

Test Osnove

Feed4JUnit koristi posebnu klasu Runner-a zvanog Feederda podrži i nahrani parametrizovane test jedinice:

@RunWith(Feeder.class)
public class LoginTest {

    @Test
    public void testLogin(String name, String password) {
       System.out.println("name:" + name + " password:" + password);
    }
   
}

Za dimne testove to je dovoljan početak! Pokrenite ovaj test sa vašim omiljenim JUnit okruženjem i Feed4JUnit će koristiti Beneratorovu moć da automatski pronadje zanimljive vrednosti za testiranje (primenjujući ideje iz ispitivanja granica vrednosti) i kombinovati ih (pokušava da pokrije sve nastale ekvivalentnosti particije). Eclipse će pokazati izveštaj ovako, navodeći svaki jedinstven test metod poziva sa svojim parametrima:

TODO

Kao što možete da vidite, Feed4JUnit pokušava da nahrani svaki string parametar sa nuloml, prazan string, a jedan karakter-string, dugi string (1000 karaktera) i srednji string (500 karaktera), proverava granice skupa znakova (A i Z), vrednost između (N) i proverava svaku moguću kombinaciju različitih parametara.

Naravno, možete koristite beleske da ograničite opseg generisanih podataka.

 

Čitanje test podatka iz datoteke

Izvori podataka se lako podešavaju preko @Source beleske. (org.databene.benerator.anno.Source):

@RunWith(Feeder.class)
public class LoginTest {

    @Test
    @Source("userlogin.csv")
    public void testLogin(String name, String password) {
        System.out.println("name:" + name + " password:" + password);
    }
   
}

Testiranjem vi ćete primetiti, da Feed4JUnit ponavlja kroz CSV datoteku i obavlja jedan test metod poziv po redu.

Feed4JUnit trenutno podržava sledeće formate podataka:

  • CSV files
  • Excel(TM) documents

 

Preuzimanje test podataka iz baze podataka

Baza podataka može se proglasiti i konfigurisati sa @Database beleskama. Prilikom korišćenja beleške u klasi, definisana baza podataka dostupna je svim metodama. Kada označava metode, baza je dostupna samo u ovoj metodi. Osnovna konfiguracija se može izvršiti navođenjem tipične JDBC parametarske veze: url, driver, user, password. Deklaracija podataka mora navesti id,po kojim se baza podataka može uputiti na @Source metode. Znak @Source napomena mora se odnositi na id baze podataka i definisati SQL upit kao selector. Broj upita rezultata kolona mora odgovarati broju parametara metoda:

@RunWith(Feeder.class)
@Database(id = "db", url = "jdbc:hsqldb:hsql://localhost:9001/f4jdb",
        driver = "org.hsqldb.jdbcDriver", user = "me", password = "secret")
public class DatabaseTest {
   
    static DBSystem db;
   
    @Test
    @Source(id = "db", selector = "select id, name from dbt_person")
    public void test(int id, String name) {
        System.out.println(id + ", " + name);
    }
   
}

Alternativno izričitoj konfiguraciji povezivanjem baze podataka, možete da postavite konfiguraciju baze podataka okruženja u vašem korisničkom direktorijumu i na njih uputiti u testu:

@Database(id = "db", environment = "f4jdb")

Pročitati više o fajlovima okruženja u DB Sanity environment files dokumentaciji.

 

Definisanje prilagođenih izvora podataka

Ako želite da preuzmete podatke iz drugih izvora podataka ili tipove datoteka, možete da programirate komponentni konektor, koji nasleđuje od klase Feed4JUnitGenerator i pruža podatke:

public static class MyGenerator extends UnsafeMethodParamsGenerator {

        public Object[] generate() {
            return new Object[] { 1, 2, 3 };
        }

}

Vraćen niz podataka generisanjem () metod se koristi kao lista parametra za beleženje test metoda. Ako dostupni podaci iz izvora su potrošeni (npr. kraj datoteke postignut), generator klasa se vraća na nulu.

Primer klase MyGeneratorse vraća {1, 2, 3} na svakom pozivanju, ako bi se neprekidno pozivao, osim da obeležite srodne metode testiranja sa @InvocationCountda se ograniči obim podataka.

Obična klasa generatoraj je odredjena od strane @Bean beleškom sa idi uputstvom kako da se instancira i inicijalizovati objekat. A @Sourcebeleška je metoda koja se odnosi na svoj id:

@RunWith(Feeder.class)
@Bean(id = "mygen", type = MyGenerator.class)
public class BeanSourceTest {
   
    @Test
    @Source("mygen")
    @InvocationCount(5)
    public void testArrayIterable(int n1, int n2, int n3) {
        System.out.println(n1 + ", " + n2 + ", " + n3);
    }
   
}

U ovom slučaju, tip specifikacija kaže da Feed4JUnit instancira objekat klase MyGeneratorsa podrazumevanim konstruktorom.

Alternativno, možete iskoristiti punu funkciju Beneratora povodom istanciranja zrna, npr . pozivanjem konstruktora:

@Bean(id = "mygen", spec = "new MyOtherGenerator(1, 'test')")

ili korisćenjem zrna konstruktora:

@Bean(id = "mygen", spec = "new MyOtherGenerator{ property1=1, property2 = 'test'}")

ili jos više kao pristup:

@Bean(id = "mygen", type = "MyOtherGenerator", properties = {
    @Property(name = "property1", value = "1"),
    @Property(name = "property2", value="test")
})

 

Generisanje ograničene podatke dinamički

Feed4JUnit podržava komentare definisane u JSR 303, Java 7 i 0,7 Beneratoru za generisanje slučajnih podataka koji se ograniceno podudaraju.

Kao primer vidi belesku @Pattern (javax.validation.constraints.Pattern):

@RunWith(Feeder.class)
public class RegexTest {

    @Test
    public void testSmoke(@Pattern(regexp = "[A-Z][a-z]{3,8}") String name) {
        System.out.println("name:" + name);
    }
   
}

 

Referentne napomene

Napomene koje su napisane debljim slovima su nova verzija 1.0:

AnnotationJava PackageApplicability
Description
@AssertFalsejavax.validation.constraintsparameter
Requires that a boolean parameter is false
@AssertTruejavax.validation.constraintsparameter
Requires that a booöean parameter is true
@DecimalMinjavax.validation.constraintsparameter
Requires that a number parameter is greater than or equals a minimum value
@DecimalMax
javax.validation.constraintsparameter
Requires that a number parameter is less than or equals a maximum value
@Future
javax.validation.constraintsparameter
Requires that a Date parameter is in the future
@Min
javax.validation.constraintsparameter
Requires that an integral number parameter is greater than or equals a minimum value
@Max
javax.validation.constraintsparameter
Requires that an integral number parameter is less than or equals a maximum value
@NotNull
javax.validation.constraintsparameter
Requires that a parameter is not null
@Null
javax.validation.constraintsparameter
Requires that a parameter is null
@Past
javax.validation.constraints
parameter
Requires that a Date parameter is in the past
@Pattern
javax.validation.constraints
parameter
Requires that a String parameter matches a regular expression
@InvocationCount
org.databene.benerator.anno
method
Limits the number of invocations to a test method
@Source
org.databene.benerator.anno
method, parameter
Specifies a source file from which to read test data (e.g. CSV or Excel(TM) file)
@Offset
org.databene.benerator.anno method,
parameter
Makes Feed4Junit skip the first n data sets that are imported or generated
/td>
@Distribution
org.databene.benerator.anno
parameter
Specifies a distribution to use for a number parameter
@Granularity
org.databene.benerator.anno
parameter
Specifies the granularity of a number parameter (corresponds to Benerator's 'precision')
@Nullquota
org.databene.benerator.anno
parameter
Specifies the quota of null values to generate for a parameter
@Values
org.databene.benerator.anno
parameter
Specifies a comma-separated list of all supported values
@Last
org.databene.benerator.anno
parameter

Used for summary and cleanup functionality necessary after the last call to a test method: The last parameter of a mathod can be annotated with @Last and be made booloean. It will then receive a true value on the last invocation, otherwise false.

@Generator
org.databene.benerator.anno
method, parameter
Specifies a simple type generator for a parameter or an array generator for a complete parameter set
@Database
org.databene.benerator.anno

class,
method

Defines a database to be used for data retrieval
@Beanorg.databene.benerator.annoclass,
method
Defines a custom data generator to retrieve data from
@Equivalence
org.databene.benerator.anno
class,
method

Advises Feed4JUnit to use the EquivalenceGeneratorFactory for all related test methods. It creates relatively small numbers of mean tests using mechanisms from border value and partition testing.
@Coverage
org.databene.benerator.anno
class,
method

Advises Feed4JUnit to use the CoverageGeneratorFactory for all related test methods. It runs through all possible values and all possible combinations and produces a large number of tests.
@Stochastic org.databene.benerator.anno
class,
method

Advises Feed4JUnit to use the StochasticGeneratorFactory for all related test methods. It creates gentle data randomly and provides for an unlimited number of tests.

 

Metodologije testiranja

Testiranje ekvivalentnih klasa

Testovi ekvivalentnih klasa su moćne metodologije softverskih testera, ali malo poznato među programerima. Feed4JUnit olakšava koriscenje e za programere.

Osnovne ideje pristupa su:

  • Definisanje 'klase' ili grupe vrednosti koje se na sličan način obrađuju u kodu pod testom (npr. negativni brojevi, nule, pozitivne brojeve)
  • Testirati najmanje jednu instancu svake klase testa (npr. -6, 0, 42)
  • Testiranje graničnih vrednosti (npr. MIN_INT, -1, 0, 1, MAKS_INT)
  • Ako je test ima nekoliko parametara, proverite svaku važeću kombinaciju vrednosti definisanu gore (MIN_INT, -6, -1 , 0, 1, 42, MAKS_INT) za svaki parametar

Ako svi parametri imaju iste ekvivalentne klase, naš skup podataka dovesce do sledećeg broja testova:

Number of
parameters

Number of
tests
1
7
249
3
343

Ne biste želeli da kodirate 49 ili čak 343 testa rucnim podešavanjem, zar ne? Ti ne bi pokrio sve, ali se osloni na manje ili više arbitraran izbor. Feed4JUnit pomaze da se lako provere svi relevantni slučajevi automatskim formiranjem kartezijanskog proizvoda vrednosti samohranih parametara 'i korišćenje svakog od njih.

 

Dimno testiranje

Izvođenje dimnih testova sa slučajnim ali važecim podacima mogu snažno poboljšati pokrivenost koda i dokazne bagove iz veoma posebnih sazvežđa podaraka. Čak i ako ne možete jednostavno predvideti svaki rezultat slučajnih podataka, možete da proverite ograničenja rezultata ili barem proveriti runtime izuzetake..

U FeedJUnit, možete da koristite @Stoachstic belesku da generišete nasumične podatke ili @Covarage beleske da prvo generišete granične vrednosti pa onda sve vrednosti između. Budite svesni da je potrebno da ograničite InvocationCount u mnogim slučajevima (osim ako ne želite da testirate milijarde poziva):

@RunWith(Feeder.class)
public class AddTest {

    @Test
    @Coverage
    @InvocationCount(100)
    public void testAdd(int param1, int param2) {
        try {
         int result = MyUtil.add(param1, param2);
     } catch (Exception e) {
            // accept application exceptions, fail on runtime exceptions
            // like NullPointerException

           
if (e instanceof RuntimeException)
                throw e;

     }  
    }

}

 

Analiticki vodjeni testovi

Analitičar kao Excel. Programeri učine isto, ali uglavnom moraju ručno da prebace podatke sa probnih definisanih slučajeva u tabelama test koda. Ako se zahtevi promene, to je zamoran zadatak da se skenira test koda i sastavi sa podacima iz tabele. Mnogo lakše i održiv je automatski čitati tabelu iz Excel fajla i hraniti ga na test kodu. Podaci datoteke se mogu cak naci i na stranici Oran FTP servera i dinamički preuzeti odatle pri izvršavanju testa. Dakle, N analitičar ni ne mora da kopira se verziju sistema da radi zajedno sa razvojem.

@RunWith(Feeder.class)
public class AddTest {

    @Test
    @Source("http://buildserv.mycompany.com/wiki/myproject/tests/add.xls")
    public void testAdd(int param1, int param2, int expectedResult) {
      int result = MyUtil.add(param1, param2);
       assert result == expectedResult;
    }

}

Možete preuzimati datoteke sa FTP servera sa posebnom URL syntaxom: @Source("ftp://user:password@server/path/file.txt")


Korišćenje Feed4Junit u projektu

Koristeći Feed4JUnit u IDE

Za pokretanje testa u vasem projektu IDE (npr. Eclipse), preuzmite feed4junit distribuciju i dodajte sve fajlove koji se nalaze u njenom lib folderu vasoj klasi projekta.

Napišite test Feed4JUnit i uradite ga.

Za svaku prizivanje testa naci ce se namenski unos korišćenih parametara u probnom protokola. Eclipse ce prikazati JUnit pogled sličan ovome:

 

Korišćenje Feed4JUnit u Maven građi

Rasporedite vaš projekat i njegov pom kao što ste navikli, onda dodajte zavisnost na najnoviju verziju Feed4JUnit:

    <dependency>
        <groupId>org.databene</groupId>
        <artifactId>feed4junit</artifactId>
        <version>1.0.1</version>
    </dependency>

Nakon izvršavanja testova npr. korišćenjem "mvn test ', možete naći dva fajla za svaku klasu testa u folderu target/surefire-reports/. Fajlovi TEST-.xml daju podatke parametara svakog pozivanja test metoda, npr

<?xml version="1.0" encoding="UTF-8" ?>
<testsuite failures="0" time="0.01" errors="0" skipped="0" tests="10" name="LoginDbTest">
...
<testcase time="0.001" classname="LoginDbTest" name="testLoginDb[Alice, 1234]"/>
<testcase time="0" classname="LoginDbTest" name="testLoginDb[Bob, 0000]"/>
</testsuite>

Kada pokrenete "mvn site ', Maven će generisati izveštaj testa sa jedne linije po probnom prizivanju, prikazujući korišćene parametre ovako:

 

Specijalnie CSV i Excel (TM) karakteristike prikaza

Feed4JUnit podržava uvoz CSV fajlova i Excel (TM) Sheets, formule u Excel listovima su rešeni. U narednim poglavljima, pojam data filepredstavljaće CSV fajlove kao i fajlove Excel-a

Datoteka sa podacima po metodama

Kada označavamo test metodu sa @Source koja se odnosi na datoteku, svaka kolona je mapirana na metode parametra sekvencionalno, nezavisno od ime kolone i naziva parametra:

    @Test
    @Source("users.ent.csv")
    public void testMethodSource(String name, int age) {
        ...
    }

Odgovarajući podaci fajl se očekuje da imaju red zaglavlja i proizvoljan broj redova. Svaki red predstavlja jedan skup podataka po kojima se test metoda zove.. Ako datoteka users.ent.csv ima sledeći sadržaj:

name,age
Alice,23
Bob,34

test metoda se poziva dvostruko:. Prvo sa parametrima (Alice, 23), a zatim sa parametrima (Bob, 34)

 

CSV format

Feed4JUnit podržava CSV kao što je navedeno u RFC 4180. Tako, ćelije mogu biti dvaput citirane, npr uključiti znak za razdvajanje kao običan karakter. Kao primer, linija

Alice,"Alice","Bob,Charly"

je analiziran u skup podataka od tri niza vrednosti, gde prve dve stavke sadrže niz Alice i treći niz Bob,Charly.Imajte na umu da svaka od njih je obezbeđena bez navodnika.

Alice,,""

mapirana na skup podataka od tri vrednosti, prva je string Alice,druga null,treća prazan string.

 

Excel(TM) format

Excel listovi su uvozeni koriscenjem Apache POI biblioteke koja pruža bilo koju numeričku vrednost kao plutajuću tačku vrednosti. Dakle, budite spremni da se neki frakcioni brojevi ne analiziraju baš kao što biste vi ocekivali.

Excel listovi su uvozeni koriscenjem Apache POI biblioteke koja pruža bilo koju numeričku vrednost kao plutajuću tačku vrednosti. Dakle, budite spremni da se neki frakcioni brojevi ne analiziraju baš kao što biste vi ocekivali. emptyMarker.

Korisnik može da bira prilagođeni marker tekst da predstavlja prazan string, npr i koriste ga u Excel listu:

Onda emptyMarker treba da bude proglašena u @Source Feed4JUnit belešci:

    @Test
    @Source(uri = "values.ent.xls", emptyMarker = "<empty>")
    public void testMethodSource(String col1, String col2) {
        ...
    }

Konacno, kada testiraju, vrednosti koje se podudaraju sa emptyMarker-om zamenjuju se sa praznim stringovima. Primer daje setovi podataka:

1. Alice i prazan string
2. Bob i null vrednost

 

Kolonski bazirani podaci

Za testove sa izuzetno dugim listama parametara i nekoliko test slučajeva za izvrsenje, kolonski bazirani podatci formatiranje može biti pogodno za korisnika. U ovom slučaju, prva kolona se očekuje da bude u zaglavlju kolona i svaka dalja kolona predstavlja parametar postavljen za prizivanje test metode. Podaci navedeni u primeru će biti predstavljeni ovako:

name,Alice,Bob
age,23,34

i @Source napomena treba zastavu rowBased = false:

    @Test
    @Source(uri = "user-columns.ent.csv", rowBased = false)
    public void testMethodColumnSource(String name, int age) {
       ...
    }

 

JavaBean parametri

Podaci za listu JavaBean parametara se mogu čitati iz datoteke sa podacima. Pretpostavimo da imate JavaBean klase zemlja sa podrazumevanim konstruktorom i svojstvima "IsoCode" i 'name':

public class Country {
   
    private String isoCode;
    private String name;

    public String getIsoCode() {
        return isoCode;
    }

    public void setIsoCode(String isoCode) {
        this.isoCode = isoCode;
    }

    public String getName() {
       return name;
    }

    public void setName(String name) {
        this.name = name;
    }
   
}

Onda možete da obeležite metod JavaBean-Type-parametar sa @Source beleskom koja ukazuje na fajl:

    @Test
    public void testCsvBean(@Source("countries.ent.csv") Country country) {
        ...
    }

U ovom slučaju, imena kolona u datoteci podataka i materije su mapirane na Bean svojstava istog imena.

isoCode,name
DE,Germany
US,United States

 

Čitanje JavaBean grafikona iz datoteka sa podacima

Bean grafikoni mogu isto biti uvezeni iz jedne datoteke sa podacima. Pretpostavimo da imate 'User' JavaBean koja upucuje na ‘Country’JavaBean.

public class User {
   
    private String name;
    private int age;
    private Country country;

    public String getName() {
        return name;
    }

    public void setName(String name) {
       this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
   
    public Country getCountry() {
       return country;
    }
   
    public void setCountry(Country country) {
        this.country = country;
    }

}

Feed4JUnit priznaje da korisnik "Country' imovine je JavaBean i prilikom uvoza datoteka podataka za korisnika

    @Test
    public void testCsvNestedBean(@Source("users2.ent.csv") User user) {
       ...
    }

ona mapira podatke na osnovu rekurzivnog imenovanja imovine:

name,age,country.isoCode,country.name
Alice,23,DE,Germany
Bob,34,US,USA

 

Lociranje datoteka

Feed4JUnit koristi sledeći podrazumevane strategije gledajući imena datoteka navedene u @Source belesci:

  1. apsolutna (ako je apsolutna putanja kao C:\tests\my.csv or /tests/my.csv)
  2. putanju klase
  3. povezanost sa radnim direktorijumom

Za pronalaženje alternativnih strategija, usluga interfejs je podržan:. org.databene.benerator.anno.PathResolver

Podrazumeva se da Feed4JUnit koristi org.databene.benerator.anno.DefaultPathResolver koji zapošljava ponašanje opisano gore.

Alternativna strategija je po org.databene.benerator.anno.RelativePathResolver: To koristi podesivu osnovnu putanju, dodaje ime pakovanju testa za pokretanje (kao putanja komponenti) i konačno dodaje resursu put naveden kao URL. Dakle, kada se koristi osnovni put C: \ testovi, anotacije @Source ("p1/user.ent.csv") koriscen u com.my.UserTests test klasi je mapiran na fajl putanji C:\tests\com\my\p1\user.ent.csv

Ako vam treba alternativna strategije, možete da napišete prilagođenu primenu PathResolver interfejsa

Za izbor određene putanje resolvera, stavite fajl feed4junit.properties u projekatnom (ili radnom) direktorijumu i odredi pathResolver:

pathResolver=new org.databene.benerator.anno.RelativePathResolver('C:\\test')

Primer pokazuje kako da konfigurišete RelativePathResolver koristeći osnovne putanje C:\test.

PathResover izraz se tumaci koriscenjem DatabeneScript koji podržava većinu Java izraza. Glavna razlika je u tome da literali stringa koriste jednostruke navodnike kao što je prikazano u primeru. Takođe, imajte na umu da se string vrednosti tumače kao Java, tako da Windows putanja separatora \ je predstavljen Java odvojenim karakterom.

 

Dodatne informacije

Licenca

Feed4JUnit je Open Source, objavljen pod GNU javnom licencom, GPL 2.0. Imajte na umu, međutim, da je potreban Benerator koja ima drugačiju licencu, GPL 2.0 sa izuzecima.

 

Zahtevi

  • Koristeći JUnit kao osnovni okvir za definisanje testa. Ako želite da koristite TestNG, možete to uraditi sa Feed4TestNG: Ona se proteže TestNG sa podrškom za parametrizovane testove i obezbeđuje iste funkcije kao Feed4JUnit sa malo drugačijom sintaksom.

 

Ograničenja

  • S obzirom da JUnit čini dugo logovanje svakog testa prizivanja, Feed4Junit nije pogodan za microbenchmarking ili testiranje opterećenja
  • Izvođenje automatske ekvivalencije klase testova planirano je za Feed4JUnit, osnovni podaci generacije infrastruktura ga još uvek ne podržava. Ja ću to sprovesti da u budućim izdanjima.

 

Pomoć i Predlozi

Ako se zaglavite, našli ste grešku, imate ideje za Feed4JUnit ili želite da pomognete, posetite forum.

 

 
Published (Last edited): 11-11-2012 , source: http://databene.org/feed4junit.html