Problema:
Se l'esecuzione di tutti i test case richiede troppo tempo, specifica manualmente un sottoinsieme di test da eseguire durante lo sviluppo. Ma quando finalmente spingo a CI, può succedere che abbia rotto qualche altro test o una funzionalità che viene controllata da loro. Quindi ho eseguito l'underselected test. Allo stesso modo, a volte dopo aver apportato delle modifiche non so quali test particolari dovrei eseguire, quindi eseguo una selezione troppo ampia (o ottimisticamente la lascia in CI :)).
Soluzione proposta:
Un flag in un test runner (ad esempio pytest
) che include in un test eseguito qualsiasi caso di test che può essere influenzato da ciò che è cambiato nel progetto. Non una soluzione a prova di proiettile, ma un'approssimazione di esso. Può ad esempio: dopo ogni prova eseguire la copertura del negozio di ogni caso di test separatamente. Quindi controlla se le linee di ogni copertura sono attualmente diverse (o c'è un nuovo test) - se è così, aggiungilo ai test da eseguire. Può anche monitorare quali file non di origine sono accessibili e gli hash di essi.
Come puoi vedere, ci sono ancora casi in cui alcuni test potrebbero interrompersi e non saranno inclusi. Ma il punto è di ridurre radicalmente la probabilità che un programmatore sottolieni i casi di test o sprechi un po 'di tempo in attesa dell'esecuzione di un test troppo ampio. Se ha funzionato in modo accettabile, per impostazione predefinita potremmo utilizzare solo questo flag e non definire l'ambito del test manualmente. Solo su CI ci sarebbe un test completo.
Domanda:
Ci sono grossi problemi che seppelliscono questa idea? So che i test dovrebbero essere rapidi e più si toccano, meno dovrebbe essere il tipo. Ma dire che non vogliamo queste cose "perché dovremmo risolvere il problema sorgente" (la durata della suite di test completa) è come dire che non abbiamo bisogno di test perché non dovremmo creare bug in primo luogo - non molto utile.
Possibilmente grandi problemi che vedo:
- la creazione di una copertura separata per ogni caso di test potrebbe essere un grosso sovraccarico
- ^ potrebbe non essere nemmeno possibile con gli strumenti correnti
- la somma dei costi di tempo di tali test aggiunti automaticamente può vanificare lo scopo (l'aggiunta di qualcosa a livello di modulo (in Python) può eseguire molti test)