Tein Python-skriptiä, johon jäi bugi, joka ilmeni vasta kun käyttäjä syötti viiteen kysymykseen syötteen. Debuggaaminen taidoillani oli hidasta, kun piti viiteen eri kohtaan laittaa kommentti tyyliin
a = raw_input("Anna syöte?") b = raw_input("Anna syöte?") c = raw_input("Anna syöte?") d = raw_input("Anna syöte?") e = raw_input("Anna syöte?")
muutettiin muotoon
#a = raw_input("Anna syöte?") a = 1 #b = raw_input("Anna syöte?") b = 2 #c = raw_input("Anna syöte?") c = 2 #d = raw_input("Anna syöte?") d = 1 #e = raw_input("Anna syöte?") e = 1
Nyt pystyin skippaamaan syötteen lukemisen ja tulostelemaan muuttujia, jolloin löysin bugin. Mutta onko jotenkin fiksumpaa tapaa debugata Python-skriptiä siten, että se skippaisi syötteen lukemisen ja hyppäisi suoraan kohtaan, jossa bugia kannattaa tutkia? Onko debuggereissa toimintoa, jolla voisi sanoa, että viiteen ensimmäiseen inputiin vastataan 1, 2, 2, 1, 1 ja sitten asetetaan breakpointti?
Jos et halua koodia muokata, niin voisit myös kirjoittaa syötettävät tiedot tiedostoon ja antaa syötteen ohjelmalle tiedostosta.
Silti sattaa hyvinkin olla järkevämpää muuttaa testauksen ajaksi koodia niinkuin olet tuossa tehnytkin. Sitä en sit tiedä miksi siinä menisi merkittävästi aikaa, eli miksi se muodostuisi debuggaamista merkittävästi hidastavaksi tekijäksi.
Toki laajemmissa projekteissa kannattaa käyttää koneellista testausta ja sitäkin ajatellen tehdä koodi testausystävällisemmiksi niin, että testitapaukset voidaan ajaa koneellisesti ilman syötteen antoa käsin.
Grez kirjoitti:
Sitä en sit tiedä miksi siinä menisi merkittävästi aikaa, eli miksi se muodostuisi debuggaamista merkittävästi hidastavaksi tekijäksi.
Ei siinä mennytkään liikaa aikaa, mutta mietin vaan että voiko asiat tehdä kätevämmin. Vaikka että joku toinen skripti nauhottaisi kaikki inputit ja hiiren liikkeet, jotta joku harvinainen bugi, joka esiintyy vaan tietyillä yhdistelmillä eri inputeista pystyttäisiin helposti toistamaan. Tässä vielä muisti hyvin mitä kuhunkin muuttujaan oli syöttänyt, mutta muistaminen voi vaikeutua jos vika ilmenee vaikka useiden kymmenien inputien antamisen jälkeen.
Huomiona se etten pythonia varsinaisesti osaa, mutta googlen avulla sain seuraavanlaisen tehtyä, jos siitä vaikka jotain apua olisi:
from functools import wraps def counter(func): @wraps(func) def tmp(*args, **kwargs): tmp.count += 1 return func(*args, **kwargs) tmp.count = -1 return tmp @counter def debug_lue(t): return [1, 2, 2, 1, 1][debug_lue.count] def lue(teksti): return raw_input(teksti + ": ") DEBUG = True if DEBUG == True: lue = debug_lue a = lue("Eka") b = lue("Toka") c = lue("Kolmas") print a, b, c # 1 2 2
Jeps. Hyvin toimii ja näköjään osaat ainakin tässä asiassa enemmän Pythonia kuin minä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.