Aktywne Wpisy

annlupin +34
źródło: annlupin0099987
Pobierz
annlupin +4
a jakie muzyczki do wina wicowie
źródło: annlupin6789098
PobierzSkopiuj link
Skopiuj link
źródło: annlupin0099987
Pobierz
źródło: annlupin6789098
PobierzRegulamin
Reklama
Kontakt
O nas
FAQ
Osiągnięcia
Ranking
Czy istnieje do Javy jakaś biblioteka/framework do generowania testowych danych? Marzy mi się coś takiego i jeśli nic takiego nie istnieje, to chyba sam to napiszę.
Przydałoby się w:
- testowaniu (testy jednostkowe - trzeba ręcznie wymyślać dane, które są powtarzalne),
- mockowaniu (na początku jak się pisze oprogramowanie, to jeszcze się nie ma danych i nie wiadomo jak dokładnie będzie to wyglądać),
- populacji bazy danych (jak nie mamy jeszcze produkcyjnych danych, to chcemy zapełnić bazę danymi zbliżonymi do produkcyjnych, żeby zobaczyć jak to będzie wyglądało i robić testy wydajnościowe).
Znalazłem coś takiego: https://github.com/DiUS/java-faker
Ale jest to bardzo ograniczone. Jak czegoś tam nie ma, to nie ma i już.
Chciałbym, żeby były takie funkcjonalności:
- Generowanie losowych danych: liczby z zakresu, ciągi znaków zgodnie z zakresem np. długość, zbiór, według wyrażenia regularnego, strumienie, pliki. Przykładowo:
Faker.getNumber(0, 10); // liczba od 0 do 10 np. 2, 7, 0Faker.getString(1, 5, "abcd"); // tekst składający się z od 1 do 5 znaków, losowo z tych liter np. baa, dacda
Faker.getString(1, 4, "abcd", false); // to samo co wyżej, tylko bez powtórzeń np. abc, dacd
Faker.getString(1, 10, "a-zA-Z"); // to samo co wcześniej tylko z zakresu liter np. aGdAd
Faker.getString(10, "0-9a-z "); // to samo co wyżej, tylko stały zakres np. Ar9 adRs 8
new File(Faker.getNumbers(0, 10).get(100, ", ").getFileStream()); // strumień (użyty jako plik) w losowymi liczbami od 0 do 10, tych liczb 100 oddzielonych separatorem przecinek
Faker.getByPattern([{"a-z", 1-5}, {" "}, {"0-9", 3}])).get(2); // tekst według wzorca, tutaj ciąg: od 1 do 5 małych liter, spacja, trzy cyfry i to dwa razy pobrane np. adyd 365, ghyde 455.
- Generowanie pseudo prawdziwych danych np. dowolne prawdziwe słowo, kolor, nazwa zwierzęcia, imiona, nazwiska, numery (NIP, kont bankowych, VIN, IMEI, ISBN, kody kreskowe), adresy (prawdziwe miasta, fejkowe ulice), daty, kwoty.
- Przy generowanie tych danych, żeby można było podać lokalizację (np. imiona w Polsce są inne niż w USA, inaczej wyglądają adresy, numery kont bankowych). Przykładowo:
Faker.getName("PL").get(3); // np. Janusz, Sebastian, MichałFaker.getName("US").get(3); // np. John, Todd, Michael
Faker.getName([{"US", 0.1}, {"PL", 0.9}]).get(4); // imiona zgodnie ze zbiorem lokalizacji, ale też zgodnie z prawdopodobieństwem (sumuje się do 1), czyli tylko 10% to imiona z USA np. Sebastian, Michael, Janusz, Paweł
- Przy generowaniu, żeby można było podać czy ma to być prawdziwe czy wygenerowane np.
Faker.getCity("Poland", true); // prawdziwe miasta np. Kraków, Warszawa, SzczecinFake.getCity("PL", false); // wygenerowane nieprawdziwe nazwy miast w języku polskim np. Klawiaturowo, Kotowo, Słoikowo (wygenerowane w sposób: dowolne słowo np. klawiatura, kot, słoik -> duża litera: Klawiatura, Kot, Słoik -> dodanie końcówki: Klawiaturowo, Kotowo, Słoikowo)
- Jeśli czegoś nie ma np. jakiś kod wewnątrz firmy lub coś mało znane, to żeby można było napisać własną implementację (zwykła funkcja, lambda, implementacja interfejsu).
- Generowanie całych zestawów danych (przydatne np. przy formularzach) np. osoba (imię, nazwisko, wiek, płeć), adres (państwo, ulica, numer domu, mieszkania, kod pocztowy), książka (tytuł, autor, liczba stron, ISBN). Przykładowo:
Person p = Faker.getPerson();p.getName();
p.getSurname();
- Robienie własnych zestawów danych np. to co wyżej:
Set person = Faker.makeSet().name("people").field("name" -> Faker.getName()). field("surname" -> Faker.getSurname());person.getField("name"); // bo Java nie umożliwi tutaj person.getName()
- Składanie zbiorów we własne np. chcemy, żeby osoba miała adres:
Person p = Faker.getPerson().addField("address" -> Faker.getAddress());- Strategie generowania:
RANDOM - całkowicie losowe np.
Faker.getName(1, 5, RANDOM); // Mdaf, Fgesd, Ads, PłucsPATTERN - według podanego schematu (np. sylaby ze słów)
Faker.getName(5, PATTERN, "SYLLABE=(2), SYLLABE=(2-4), SYLLABE=(2-4)"); // Odlabiu (ODkurzacz, LAptop, BIUrko), Okrzepa (OKno, dRZEwo, PAyk)DEFAULT - dane zaszyte w bibliotece (np. lista imion w USA, lista miast w Polsce),
Faker.getName("PL"); // Michał, JanuszUSER - podane z listy przez użytkownika (zaszyte w kodzie)
Name n = Faker.makeNames("Janusz, Michał, Seba, Mati");n.get(2); // Mati, Seba
FILE - tak samo jak USER, tylko wczytywane z pliku (separator to linie)
Faker.makeNames(FILE, new File("listOfNames.txt"), "/r/n");HTTP - tak samo jak wyżej, tylko pobierane z API:
Faker.makeNames(HTTP, GET, "[http://example.com/list-of-names",](http://example.com/list-of-names",) "/r/n"); // imiona w nowych liniachFaker.makeNames(HTTP, GET, "[http://example.com/list-of-names",](http://example.com/list-of-names",) JSON, "[].name"); // imiona w JSON, tablica obiektów i tam pole name w każdym
Faker.makeNames(HTTP, POST, "[http://example.com/list-of-names",](http://example.com/list-of-names",) "people { name} }", {[].name}"); // zapytanie POST, w body wysłane coś (np. do endpoint GraphQL), w odpowiedzi w JSON lista obiektów jak wyżej i z obiektów pole name
Te metody to przykłądowe. Pewnie trzeba by ujednolicić i uspójnić (np. generowanie liczb czy słów/sylab powtarza się w wielu miejscach, wymyślić sposób na ładne patterny, zrobić fluent Java API).
Coś jeszcze? Możecie zaproponować funkcjonalności. Nawet jakieś trudniejsze, żeby było to poważne narzędzie.