Please ignore secret bonuses. Secret tests do NOT award bonus. Max hw grade is 30+2 bonus efficiency

Do you need help?

Notice Board

Per partecipare al corso di Fondamenti di programmazione 2023-24 loggatevi e attivatelo nella vostra pagina dei corsi preferiti. A quel punto il corso appare nel menù personale cliccando sul proprio avatar. Per i materiali degli anni precedenti seguite lo stesso metodo.

To join the Programming/Lab 2023-24 course, log-on and select it on the my courses page. It will appear on the personal menu of your avatar. For earlier years use the same method.

problemi col testing es 3

1
1824194 (1040 points)
6 15 23
in Es3 by (1.0k points)
closed by
salve volevo dirle che su ipython su console viene tutto regolare il terzo esercizio e facendo test inseriti manualmente me li stampa regolarmente ma quando vado a provare i test non mi avvia. Premetto che ho scaricato i plug in unittest e il framework py.test e ho avviato il run unit test e mi da tutto failed. Bisogna settare qualcos'altro per eseguire i test?
Grazie
796 views
closed with the note: risolto

4 Answers

andrea.sterbini (207920 points)
749 1267 2373
by (208k points)
Hai letto l'output? Ti dovrebbe dire perchè il test è fallito (ad esempio non hai modificato la lista in input nel modo corretto)
1
1824194 (1040 points)
6 15 23
by (1.0k points)
ho letto l'output e continua a dirmi che i due errori sono la lista di partenza non modificata e non stampa la parola più occorrente eppure nel provare in console la lista modificata appare corretta. Proverò a modificare il codice anche se ci ho provato diverse volte finora per vedere cosa non prende
Z
ZeroCrystal (4390 points)
7 14 46
by (4.4k points)
edited by

AGGIORNAMENTO: Ho risolto il mio problema, vi consiglio di leggere il mio commento qui in basso per vedere se la soluzione si può applicare anche al vostro caso. laugh


Anche io ho un problema simile, in pratica mi vengono due risultati diversi se provo ad eseguire il programma a mano (tutto OK) o con il tester (6 errori su 9).

Cercherò di spiegarlo nel modo più chiaro possibile.

Inizialmente per poter controllare più facilmente il funzionamento del mio programma ho deciso di passare alla funzione es3 i parametri necessari in modo manuale, copia-incollandoli dal file test_03.json.

Alla fine sono riuscito a sviluppare un algoritmo in grado di risolvere il problema in maniera corretta al 100%: la tupla restituita dalla funzione es3 contiene esattamente la lista e la stringa che ci si dovrebbe aspettare (rispettivamente expected_lista e expected_parola nel JSON), mentre alla lista passata in input sono stati rimossi tutti gli elementi necessari (corrisponde anche lei a expected_ls). Questo vale per tutti e tre i test cases presenti nel file JSON. In altre parole il programma funziona correttamente in tutti i casi previsti.

Tuttavia nel momento in cui vado ad eseguire il tester (test_03.py) si vengono a generare degli errori: il primo test case (quello 'gatto, cane, topo') passa tranquillamente, mentre i successivi due generano un IndexError che porta ovviamente all'interruzione immediata del test, restituendo di conseguenza 6 errori su 9 test.

È questo che non riesco a spiegarmi: come può lo stesso identico programma terminare in due modi così diversi in base a come viene eseguito?

I valori di input sono esattamente gli stessi, ma l'esecuzione cambia: tutto OK se passo i test cases a mano, 6 errori su 9 se uso il tester. Non posso correggere un programma che a me funziona senza il minimo problema. Se ci fosse veramente un bug allora mi si dovrebbe generare un IndexError in entrambe le situazioni.

Per adesso ho consegnato l'homework per vedere cosa ne pensano i grader ufficiali, ma dubito che il problema si risolva così facilmente.

Qualche idea? frown

VincenzoImperati (6290 points)
6 15 58
by (6.3k points)
Sono nella stessa tua situazione
Z
ZeroCrystal (4390 points)
7 14 46
by (4.4k points)
Dopo ore e ore a passate ad interrogarmi sul senso della vita mi è venuta un'illuminazione su quale fosse il problema del mio codice! (party)
Ve lo scrivo qui in caso qualcuno abbia fatto il mio stesso "errore".

In realtà c'è un motivo se uno stesso programma viene eseguito differentemente dal tester ripetto che avviandolo a mano: dando un'occhiata allo script del tester (test_03.py) mi sono reso conto che il nostro programma viene importato una sola volta nel momento in cui il tester viene eseguito (a riga 7 per la precisione).

Il problema sta tutto qui: essendo il modulo caricato una sola volta alla sua prima esecuzione il programma funziona come dovrebbe (il primo test mi dava infatti risultato positivo). Tuttavia per effettuare il secondo e il terzo controllo il modulo non veniva ricaricato o resettato al suo stato originale, ma veniva semplicemente eseguita una seconda ed una terza chiamata al metodo es3.

Questo è stato fatale per il mio algoritmo in quanto utilizza una variabile dichiarata globalmente messa a disposizione di più funzioni interne al mio programma (ovvero dichiarata prima del metodo es3). Nel momento in cui andavo ad eseguire i test manualmente, implicitamente andavo a caricare ogni volta da zero il mio modulo, permettendo quindi alle variabili di inizializzarsi correttamente.

Tuttavia il tester esegue più chiamate consegutive di es3(), quindi il modulo dopo la prima esecuzione non viene ricaricato e perciò la mia variabile globale, durante l'esecuzione del secondo test case, possedeva ancora i valori impostati durante il test case precedente!

In pratica il primo è un avvio pulito del programma (con tutte le variabili fresche di inizializzazione), mentre le esecuzioni successive partono da uno stato "sporco" in quanto le mie variabili globali mantenevano ancora i dati del test precedente portando alla nascita di errori totalmente imprevisti.

La mia soluzione è stata quella di scrivere qualche riga di codice all'inizio del metodo es3() che mi permettessero di "pulire" tutte le eventuali rimanenze e scarti rimasti da una esecuzione passata di quel metodo.

Spero che questa osservazione vi permetta di risolvere anche i vostri problemi! :)
alessioclemente (19640 points)
16 67 153
by (19.6k points)
Quindi, visto che io passo 4 test, non è lo stesso problema giusto?
Z
ZeroCrystal (4390 points)
7 14 46
by (4.4k points)
Forse no, ma a un mio amico ha permesso di risolvere il tutto quindi ho pensato di scriverlo anche qui.
alessioclemente (19640 points)
16 67 153
by (19.6k points)
In che modo hai pulito il tutto?
Z
ZeroCrystal (4390 points)
7 14 46
by (4.4k points)
Nel mio caso avevo dichiarato un dizionario a livello globale che utilizzavo per condividere informazioni tra due funzioni diverse, perciò mi è bastato aggiungere una chiamata al metodo clear() del dizionario subito all'inizio della funzione es3 in modo tale da garantirmi che ad ogni nuova esecuzione non rimangano "scarti" delle esecuzioni precedenti.
andrea.sterbini (207920 points)
749 1267 2373
by (208k points)
Ma come cavolo vi viene in mente di usare variabili globali???????????
alessioclemente (19640 points)
16 67 153
by (19.6k points)
Anche a me, provo ad dare in input le liste contenute sul file json e funziona tutto bene, vado a far partire i test e si blocca qui : test_letto_da_json_e_moltiplicato_per_1000_00002_Lista_ls_di_100_parole__ed__un_testo_di_4000_caratteri__ls_e_testo_sono_esplicitati_nel_file_Istanza2_e1_txt_

i test prima mi da ok, e qui si ferma, senza nemmeno stamparmi l'output dell'errore. Però come detto prima io ho provato a dare in input i valori contenuti in quel test e va bene...
a
andreaconti (720 points)
0 2 5
by (720 points)
Stesso problema anche a me
Sickboy (28240 points)
7 25 68
by (28.2k points)
Anche a me, provato con i valori in json e tutto bene la tupla perfetta e la lista modificata come richiesto poi andando a testare mi da errore i  tutti i test, anche nel primo gatto cane topo.
andrea.sterbini (207920 points)
749 1267 2373
by (208k points)
Leggete bene gli errori, vi indicano perchè.
alessioclemente (19640 points)
16 67 153
by (19.6k points)
Non ho errori prof, mi si blocca il grader, anche se testando gli input funzionano tutti
andrea.sterbini (207920 points)
749 1267 2373
by (208k points)
Prova a disattivare i test lunghi cambiando nome ai metodi che iniziano per 'test' nel file test_0X.py
Oppure prova a consegnarlo, così posso testarlo.