Diskuze: Machr na PHP - Testovací data

PHP PHP Machr na PHP - Testovací data American English version English version

Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:

Zdravím programátory,
v pravidelné minisoutěži o placku a samolepky budeme programovat generátor testovacích dat v PHP. Určitě se vám stává, že potřebujete svou aplikaci s databází na něčem testovat. Nejlepší testování je samozřejmě na velkém množství dat. Nojo, ale jak ho do aplikace dostat jinak, než tam ručně přidávat uživatele, články, produkty...?

Navrhněte PHP třídu, pomocí které bude možno naplnit databázovou tabulku testovacími daty. Třída by měla umět generovat jména, příjmení, čísla, telefony, emaily, datumy a další základní datové typy. Nemusíte v ní mít milion jmen, stačí třeba 10, jde hlavně o princip.

Třída bude obsahovat nějakou metodu (třeba napln()), které zadáte název databázové tabulky a nějakým způsobem ji předáte co má do kterých sloupců vygenerovat. Mohlo by to vypadat třeba takhle:

$mockGenerator = new MockGenerator();
$mockGenerator->napln('uzivatele', 100, array(
   'jmeno' => MockGenerator::JMENO,
   'prijmeni' => MockGenerator::PRIJMENI,
   'pocet_clanku' => MockGenerator::CISLO,
   'narozen' => MockGenerator::DATUM_MINULOST,
));

Jak vidíte, k určení co se má kam generovat jsem použil konstanty. Třída si z pole načte názvy sloupců a zjistí co tam chceme. No a potom nám jednoduše vloží třeba 100 náhodných záznamů.

Úlohu lze splnit v podstatě jednoduše během, řekněme asi 2 hodin? Pokud chcete generátor nějak reálně používat, zamyslete se i nad generováním souvisejících dat (vazba M:N, 1:N, 1:1 a podobně).

Čas si dejme jako vždy do pondělí 7.4. do 10:00. Zkuste si to, třída se vám v aplikacích fakt hodí :P

Odpovědět  +6 2.4.2014 13:04
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Michal Vašíček
Tým ITnetwork
Avatar
Michal Vašíček:

OOP nutnost? A pokud ne, budeš neOOP hodnostit zvlášť? (nemám proti OOP šanci :P)

Nahoru Odpovědět  -20 2.4.2014 15:24
Příspěvek může obsahovat stopy arašídů, sarkasmu a sóji.
Avatar
Denis Homolík (Alfonz):

No když to má být třída tak asi to bez OOP nepůjde. :D

Nahoru Odpovědět  +13 2.4.2014 15:33
Vše je možné, dokud si to myslíte!
Avatar
Michal Vašíček
Tým ITnetwork
Avatar
Nahoru Odpovědět  -3 2.4.2014 18:33
Příspěvek může obsahovat stopy arašídů, sarkasmu a sóji.
Avatar
Denis Homolík (Alfonz):

Stačí tohle: http://machr.8u.cz/test.php Používá se to takhle:

$random = LoremRandom();
$tabulka = $random->Generate('user',100);
print_r($tabulka);

Místo 'user' jde ještě použít products, adress, mail, phone. Budu to ještě upravovat tak se prosím nedivte, že to bude občas házet errory. :)

Nahoru Odpovědět  +1 2.4.2014 18:48
Vše je možné, dokud si to myslíte!
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Denis Homolík (Alfonz)
David Čápka:

Mělo by to umět naplnit databázovou tabulku :)

Nahoru Odpovědět 2.4.2014 19:03
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
vojtamaniak
Člen
Avatar
vojtamaniak:

Také jsem to udělal, možná by to šlo i jednodušeji, ale co se dá dělat :D
Dá se v tom náhodně vygenerovat jméno, příjmení, číslo, datum (v minulosti a v budoucnosti), pohlaví, telefon, adresa, povolaní, email.

Zdrojové kódy: http://leteckaposta.cz/807953212
Pohled do PMA: http://pasteboard.co/1PHJ4HDr.png

Používá se to nějak takto (samozřejmě se musí requirovat ten soubor s tou třídou :) ):

$datagen = new DBDataGenerator();
$datagen->napln("tabulka", 20, array("sloupec" => DBDataGenerator::JMENO));

Uděluje to povolání, jména, přijmení, a částečně i email podle pohlaví a uděluje to email podle jména a přijmení.

Pokud chcete, aby email byl složen ze jména a příjmení, musíte uvést email v tom arrayi jako poslední (nebo alespoň za jméno a příjmení)

Soubor index.php obsahuje script na vytvoření DB a naplnění jí všemi možnými údaji.

Snad jsem napsal vše :D

EDIT: Jen telefonní čísla nejsou dokonalá, takže se na ně možná potom podívám a nějak je zdokonalým.

Editováno 2.4.2014 19:17
 
Nahoru Odpovědět  +1 2.4.2014 19:15
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na vojtamaniak
David Čápka:

Tohle vypadá pěkně :) Zkusíš i ty vazby?

Nahoru Odpovědět  +1 2.4.2014 20:21
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
vojtamaniak
Člen
Avatar
vojtamaniak:

Díky :) Na ty vazby se podívám. Jen jsem trochu nepochopil, jak bych měl udělat ty vazby. Mám udělat ještě nějaké další tabulky s náhodně generovanými daty a propojit je přes cizí klíče? :)

Editováno 2.4.2014 21:16
 
Nahoru Odpovědět 2.4.2014 21:16
Avatar
Nahoru Odpovědět  ±0 3.4.2014 4:49
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Hurass
Člen
Avatar
Hurass:

Taky jsem něco zkusil vytvořit.
https://github.com/…ataGenerator

 
Nahoru Odpovědět  ±0 3.4.2014 19:41
Avatar
Marek Z.
Redaktor
Avatar
Marek Z.:

Tady je můj výtvor:
http://leteckaposta.cz/773520550

Zvolíte si do jaké tabulky to uložíte, kolik provede záznamů a jaké popřípadě pohlaví (defaultně 0 = oboje).
Pokud tabulka nebude existovat tak ji vytvoří a provede záznam.

Live: http://sifler.php5.cz/generator/
Při živé ukázce pouze vypisuji data a jejich tvar do sql dotazu.

Nahoru Odpovědět 6.4.2014 14:59
Chybami se člověk učí, běžte se učit jinam!
Avatar
Marek Z.
Redaktor
Avatar
Marek Z.:

EDIT: Stažení zde -> http://leteckaposta.cz/192338006
Před tím to je verze pro LIVE ukázku, zde máte sql dotaz který provede uložení do db.. :)

Nahoru Odpovědět 6.4.2014 15:03
Chybami se člověk učí, běžte se učit jinam!
Avatar
Michal Žůrek (misaz):

Ahoj,
i já zde (po delší době) přidávám svůj výtvor. Snažil jsme se ne aby to umělo v základu napevno generovat třicet milionů různých hodnot, ale aby to bylo objektové. Proto je implementace vlastních generátorů hodnot hračka. Jednoduše si přidáte třídu, která bude implementovat rozhraní IRandomizableItem. Pak ji přidáte metody RandomValue(), která vygeneruje onu hodnotu, CollumnSqlType(), která vrátí typ pro SQL. Jediná metoda, která v interface chybí a přesto je potřeba je metoda load(), která může mít 0-5 parametry (právě proto tam chybí), právě tam si můžete načíst potřebné věci. Do load Vám bude předáno:

[item] položka, které generujete hodnotu (využívá toho email, který pracuje s jménem a přijením)
[collumnName] Jméno sloupce kam dáváte hodnotu
[params] Parametry, využívá toho třeba Datum, který generuje náhodné datum z rozmezí zadaných v parametrech.
[tables] všechny tabulky. Využívá toho Bind
[tablesCollumns] sloupce všech tabulek. Využívá toho Bind.

Dále třída musí mít veřejné attributy $insertToDefinition (bool) a $insertToTable (bool), které říkají zdali se má hodnota v sloupci posílat do databáze a do definice. využívá toho třeba Id, ostatní mají u obou true.

pokud potřebujete tabulku vygenerovat, zavoláte na objekt SampleDataGenerator metodu Generuj, které předáte název tabulky, počet hodnot a pole ve formátu

nazevSloupce (string) => DatovyTypAParametry (string)

kvůli parametrům jsem nemohl použít konstanty. Název typu s parametry se zapisuje ve formátu:

typ:parametry

Binding

Propojování bindingu funguje jednoduše, že do typu sloupce zadáte bind a jako parametr předáte tabulku a sloupce (tabulka.sloupec). Např:

bind:lide.jmeno

Bindingy nefungují na Id (ostatně to se do databáze přidává celé trochu jinak). Pokud chcete bindovat Id, použijte:

Randint:0-pocetPolozek

Download: http://misaz.moxo.cz/…r-db-dat.zip
Online: není potřeba

Jo a jinak: základ jsem měl za cca 2,5 hodiny, pak objektový přepis a dodělávání trvalo asi +- 6hodin. Ale koneckonců jsem s tím spokojen.

Editováno 6.4.2014 17:29
Nahoru Odpovědět  +1 6.4.2014 17:26
Nesnáším {}, proto se jim vyhýbám.
Avatar
mayo505
Redaktor
Avatar
mayo505:

Taktiež sa pridávam. Snažil som sa to spraviť čím najjednoduchšie použiteľné aj pochopiteľné, ale niektoré metódy môžu zo začiatku pôsobiť dosť neprehľadne, najmä kvôli množstvu parametrov. Snažil som sa to zrozumiteľne popísať tak snáď sa to bude dať pochopiť :)

https://www.dropbox.com/…/testgen.rar
Archív obsahuje aj kód na vytvorenie databázy, ktorú používam v príkladoch a tiež obrázok s jej štruktúrou :)

 
Nahoru Odpovědět  ±0 6.4.2014 18:57
Avatar
mayo505
Redaktor
Avatar
mayo505:

Ospravedlňujem sa, zabudol som to pomenovať podľa nicku. Tu je správny link
https://www.dropbox.com/…enerator.rar

 
Nahoru Odpovědět 6.4.2014 23:44
Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:

Chlapi, projel jsem to a dospěl jsem k následujícímu hodnocení:

Hurass - Při pojmenování konstant se dodržuje konvence NAZEV_KONSTANTY. V metodě generate() bych spíše přidával hodnoty do pole a to nakonec spojil pomocí implode() na string, než z nich vyráběl string, u kterého potom umaži poslední čárku. Hodnoty bych vkládal jako prepared statement. setNumber() by se asi měla jmenovat getNumber(). Jinak Ok, hezké jednoduché řešení.

mayo505 - Vypadá to, že máme konečně i řešení, které počítá s vazbami. Pokud bychom dali do DB omezení na cizí klíče, muselo by se předtím asi volat SET FOREIGN_KEY_CHEC­KS=0; a na konci SET FOREIGN_KEY_CHEC­KS=0;, jelikož propojování probíhá až na konci. "od užívateľa nie sú žiadne dáta" - to sice ne, ale není důvod proč ty prepared statements nepoužít ;-) Pěkné řešení, asi jen to volání UPDATE v cyklu se mi úplně nelíbí, při větším množství dat by to bylo pomalé. Dala by se použít klauzule IN.

Michael Olšavský - API jsi rozšířil na předávání dalšího pole s parametry. V praxi by bylo možná lepší udělat na to nějaké třídy a funkce, jakmile se předávají pole v polích, tak jde přehlednost dolů. Třeba něco jako:

$generator = new Generator('uzivatele');
$generator->addId('id', 10, true)
          ->addString('text', 1000)
          ->addPhone('telefon', '+420')
          ->addCislo('cislo', 0, 150);
$generator->fill(100);

Řešení přes call_user_func() je zajímavé, sám jsem tyhle reflexní věci před nedávnem začal docela používat. Alternativou by bylo udělat si nějaký slovník a poukládat do něj funkce. Řešení se mi líbí.

Misaz - Vzal jsi to hodně robustně, ale proč ne :) Bind() je tam velmi zajímavé, pokud jsem to správně pochopil, tak se tím dají řešit i cizí klíče, i když si nejsem jistý, jestli i u vazeb M:N. Dobrá fíčura je vytváření tabulky. Správně použité rozhraní, pár malých tříd pro jednotlivé generátorky. Jen občas koukni do slovníku, jak se některá slova píší, máš tam věci jako parrams, collumns a pod.

Sifler - Vytvoření tabulky je sice zajímavá fíčura, ale máš tam na pevno napsané sloupce pro tabulku user (user_id a podobně). Metody se píší s malým počátečním písmenem. Render se používá když něco vypisuješ, tady bych to pojmenoval generateData(). Máš tam hodně zápisů, které by šly zapsat úplně jednoduše. Třeba:

if($sex == 0){
  return rand(1, 2);
}else{
  return $sex;
}

by se zapsalo jako:

if (!$sex)
  return rand(1, 2);
return $sex;

Nebo dokonce jako:

return ($sex) ? $sex : rand(1, 2);

Také nepoužíváš prepared statements.

vojtamaniak - Metody ve zdrojáku máš nějak divně odsazené a nepoužíváš prepared statements. Byl jsi první a máš to pěkné. Nicméně ostatní tě stihli předběhnout co se týče funkcí.

Nejvíce se mi líbila řešení od mayo505 a Michal Žůrek (misaz), proto získávají placku. Publikujte prosím svá díla a potom napište x adresu. Všem ostatním děkuji za účast a těším se u další soutěže :)

Editováno 7.4.2014 11:30
Nahoru Odpovědět  +3 7.4.2014 11:29
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
mayo505
Redaktor
Avatar
Odpovídá na David Čápka
mayo505:

Ďakujem za hodnotenie a gratulujem aj misazovi :)
Prepared statements som nepoužil hlavne preto, lebo už samotná trieda ma stála dosť času tak som sa zameral radšej na to. Ale keď mám pravdu povedať aj som chcel, ale musel by som použiť PDO::quote(), ktorú by som na hodnoty pospájané čiarkou nemohol použiť priamo a z môjho pohľadu sa správa trochu zvláštne (pridáva úvodzovky na začiatok aj na koniec aj vtedy keď to netreba :)

Čo sa týka toho UPDATE to máš pravdu, na celú databázu bolo treba pár sekúnd, ale nevedel som ako by som tu klauzulu IN použil (vlastne stale neviem) :)

 
Nahoru Odpovědět 7.4.2014 12:38
Avatar
vojtamaniak
Člen
Avatar
vojtamaniak:

Taky gratuluji vítězům :) Holt to zkusím příště :)

 
Nahoru Odpovědět 7.4.2014 13:17
Avatar
Zdeněk Bauer
Redaktor
Avatar
Odpovídá na vojtamaniak
Zdeněk Bauer:

Vidíš? Já ti furt říkám že divně zarovnáváš :P

 
Nahoru Odpovědět 7.4.2014 14:30
Avatar
Odpovídá na mayo505
Michal Žůrek (misaz):

ne quote používat nemusíš, postačí ti prepare a execute.

Nahoru Odpovědět 7.4.2014 17:43
Nesnáším {}, proto se jim vyhýbám.
Avatar
Odpovídá na David Čápka
Michal Žůrek (misaz):

Placku na PHP již mám. Stačí mi ji přidat do profilu, fyzická mi 1× stačí. I tentokrát vám dám na výběr jak by měl článek o tomto výtvoru vypadat.

  1. Klasicky článek, který bude asi velmi podobný postu, kterým jsem jej zapojil do soutěže. Podobně jsem publikoval třeba: http://www.itnetwork.cz/…loni-jeskyne
  2. Step by step tutorial. Pdobně jsem publikoval třeba: http://www.itnetwork.cz/…ime-formular
  3. Nakopávací článek. Článek, který vám řekne jak to udělat správně. Myslím, že u výtvoru založeného z největší části na OOP je toto dobrá varianta. Podobně jsem publikoval třeba: http://www.itnetwork.cz/…avrh-doplnku

Hlasujte odpovědí na tento post. Prosím nehádejte se a neberte názor ostatních. :)

Editováno 7.4.2014 17:49
Nahoru Odpovědět 7.4.2014 17:49
Nesnáším {}, proto se jim vyhýbám.
Avatar
Michal Vašíček
Tým ITnetwork
Avatar
Nahoru Odpovědět 7.4.2014 18:06
Příspěvek může obsahovat stopy arašídů, sarkasmu a sóji.
Avatar
Nahoru Odpovědět  +1 7.4.2014 18:07
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
Marek Z.
Redaktor
Avatar
Nahoru Odpovědět 7.4.2014 18:13
Chybami se člověk učí, běžte se učit jinam!
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Nahoru Odpovědět 7.4.2014 18:30
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
mayo505
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
mayo505:

V tomto prípade stačí, ale keby teoreticky niečo zadával užívateľ (napríklad názov stlpca) tak by som sa tomu nevyhol

 
Nahoru Odpovědět 7.4.2014 18:31
Avatar
Odpovídá na mayo505
Michal Žůrek (misaz):

jo to máš pravdu, ale většinou uživatel název sloupce nezadává.

Nahoru Odpovědět 7.4.2014 18:40
Nesnáším {}, proto se jim vyhýbám.
Avatar
Ondrca
Redaktor
Avatar
Ondrca:

David Čápka Ty nás teda dlouho napínáš :D

Nahoru Odpovědět  +3 9.4.2014 20:29
Zase jsem o něco chytřejší
Avatar
Odpovídá na Michal Žůrek (misaz)
Michal Žůrek (misaz):

Klasický článek tedy dostal 0 hlasů.
Step by step má 3 hlasy.
Nakopávací má 1 + 1 = 2 hlasy.

Tak z toho máme step by step. Možná ho stihnu napsat do konce týdne.

Nahoru Odpovědět  +1 14.4.2014 18:00
Nesnáším {}, proto se jim vyhýbám.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 30 zpráv z 30.