Codice di prova di spedizione. Perché non dovresti?


17

Vorrei spedire il codice di prova insieme a un prodotto. In particolare, fornire un'opzione in modo che chiunque disponga di una copia del nostro programma possa premere un pulsante di "autotest" o passare il test autonomo sulla riga di comando ed eseguire l'intera suite di unità | test di integrazione.

Per lo più, voglio fare questo per aiutare i problemi di debug rilevati sul campo, quindi quando arriva una segnalazione di bug da un utente finale c'è la possibilità che venga supportato da "e inoltre, questi tre test falliscono sulla mia macchina". Vorrei che i tester manuali potessero far funzionare l'unità | anche test di integrazione.

Tuttavia, il test del team ritiene che il codice di test non sia un codice di produzione e pertanto non debba essere spedito. Non capisco davvero questo argomento, dal momento che la maggior parte dei progetti open source fornisce una suite di test. Sembra essere insolito nel software chiuso.

Vorrei sostenere prove o aneddoti per entrambe le parti dell'argomento. Ho preso la mia ipotesi migliore su quale sito di scambio di stack sarebbe più appropriato, ma per favore fatemi sapere se questo è fuori posto.


8
Perché un test unitario in un programma chiuso (o un programma open source che non è stato modificato) fallirebbe mai? Se il tuo prodotto richiede una buona dose di installazione e i problemi di installazione sono spesso la fonte di bug, potrebbe avere senso spedire una sorta di app "convalida la mia configurazione" che fa cose come la convalida della connessione al database, la convalida delle connessioni a qualsiasi altro servizio esterno il tuo codice dipende, ecc. Non avrebbe senso che un test unitario non fallisse mai, dal momento che hai già convalidato che il codice funzioni.
Grotta di Giustino,


15
Perché un test unitario fallirebbe sul campo? In cima alla mia testa: programma corrotto. Hardware Dodgy. Condizioni di gara che non abbiamo visto a livello locale. Collegato a una libreria dinamica diversa. Conflitti con antivirus o sistema operativo. Utilizzato con una versione sorprendente del software correlato a causa di un aggiornamento incompleto. Interazione con altri processi che non si comportano come previsto. Ci sono molte ragioni per cui i bug si presentano sul campo e molti di loro potrebbero essere colpiti da un test unitario (per una data definizione di unità)
Jon Chesterfield,

7
@JonChesterfield: la creazione di una funzione di autotest nel programma è probabilmente una buona cosa. E se quella funzione di autotest può riutilizzare parzialmente il codice dai test delle unità, perché no? Ma una tale caratteristica e le parti riutilizzabili dovrebbero essere sviluppate con un punto di vista "è il codice di produzione".
Doc Brown,

2
@JonChesterfield Ho difficoltà a immaginare un test unitario che fallisce sulla maggior parte di queste cause. I test di integrazione sono un'altra cosa, però: posso vedere il merito nel spedirli se può essere fatto senza troppe cose extra.
Loren Pechtel,

Risposte:


19

A volte il codice di prova contiene frammenti di codice di terze parti, sia esterni che interni alla tua azienda. Questo accade quando i file degli utenti presentano dei bug; i tuoi test (come i test di regressione) quindi incorporano il codice fornito da loro per la riproduzione. Spesso, la licenza di tali frammenti di codice per riprodurre bug non è chiara. Quindi, dovresti essere consapevole dei problemi di proprietà intellettuale. Non vuoi spedire il codice di prova che rivela accidentalmente alcuni segreti commerciali o proprietà intellettuale di un dipartimento diverso della tua azienda o dei tuoi partner esterni.

In un'altra nota, il codice di prova è raramente tenuto agli standard del codice di produzione: le revisioni del codice non sono necessariamente eseguite; standard di codifica non applicati, ecc. Questo è sfortunato, ma banale, e non dovrebbe necessariamente riflettersi male sul team di test se non avevano raggiunto quell'obiettivo al momento dello sviluppo di questi test.

D'altra parte, molti test sono semplicemente imbarazzanti e non mettono nemmeno alla prova ciò che alcuni pensano sia in fase di test. Questo è un problema diverso ...

In definitiva, a causa di tutti questi fattori, potresti voler classificare i tuoi test come quelli che possono essere spediti come open source e quelli che semplicemente non possono. (Potresti voler scrivere alcuni test personalizzati tenendo a mente spedirli in mente, migrando lentamente gli altri in quel set.)


Il problema di terze parti è davvero un buon punto. Raggruppare il codice di prova in "visibile esternamente" e "forse riservato" sarebbe soggetto a errori e un notevole sovraccarico. È praticamente un rompicapo da solo, grazie.
Jon Chesterfield,

Sì, difficile da fare dopo il fatto. Penserei che avresti avuto più fortuna con uno sforzo dedicato per sviluppare test di spedizione.
Erik Eidt,

@ErikEidt: ho preso la libertà di dare un suggerimento per la rimozione di "come open source", perché probabilmente non è quello che l'OP aveva in mente - penso che voglia spedire i test come closed source.
Doc Brown,

@DocBrown, prendo il tuo punto. Probabilmente una questione di interpretazione poiché l'OP ha menzionato "open source" da qualche parte nel post. In ogni caso la tua modifica generalizza bene il punto.
Erik Eidt,

18

Test di spedizione? Sì. Test delle unità di spedizione? No.

Come dici nel commento, il problema che potresti incontrare quando esegui il prodotto su un computer client includerà problemi come il collegamento con la DLL errata, in genere questo non è qualcosa che un test di unità catturerà (che senza dubbio avrà deriso la dll per testare il codice).

Ora, distribuendo una suite di test di integrazione, che chiama l'interfaccia utente che chiama la logica che chiama la dll ... che funzionerà molto meglio. I test di integrazione possono mostrare altri aspetti delle installazioni fallite che i test unitari non verrebbero visualizzati. (ad esempio il mio prodotto attuale richiede un'installazione di codec k-lite, che non ci è consentito raggruppare a causa delle licenze. I test unitari potrebbero mostrare che il nostro codice funziona correttamente, ma non funziona ancora per la soddisfazione dei clienti. Allo stesso modo, la nostra configurazione dei codec potrebbe non aver funzionato correttamente, i test unitari non lo mostrerebbero).

Quindi spedisci invece alcuni dei tuoi test di integrazione, che sarebbero esattamente ciò che desideri per un prodotto installato, integrato.


2

Potrei capire questa preoccupazione fortemente nelle aree in cui stai coprendo ogni singolo pollice dell'hardware, come un motore di gioco AAA di nuova generazione multithread che utilizza ogni singolo core della CPU, intrinseci SIMD, GPU, GPGPU, ecc. Mentre offri una piattaforma multi-piattaforma Prodotto.

In quei casi, il tuo peggior incubo sarà spesso quei casi in cui i tuoi test (unità e integrazione) passeranno per le prime 5.000 macchine / piattaforme disparate testate, ma falliranno per il 5.001 a causa di un bug del driver per un oscuro modello GPU Solo pensando questo mi dà i brividi - non è possibile testarli o prevederli in anticipo.

Soprattutto se scrivi shader di GPU, puoi finire per giocare a una lotteria inversa in cui metà del codice che scrivi invocherà comportamenti indefiniti, poiché ci sono poche garanzie standard portatili applicate da tutti i modelli / driver GPU coinvolti. Mentre sta diventando sempre meno come giocare a dragamine in questi giorni, questo dovrebbe dare alla gente qualche idea: http://theorangeduck.com/page/writing-portable-opengl . Provarlo alla fine degli anni '90 e all'inizio degli anni 2000 fu davvero orribile, ed era un dragamine fino in fondo.

Per questo tipo di casi, spesso hai bisogno di team di oltre 10.000 tester con una gamma davvero ampia di hardware e sistemi operativi per solidificare davvero il prodotto e sentirti sicuro prima di rilasciarlo in modo stabile. Non tutte le aziende possono permettersi di avere una base di test così ampia, e non tutte hanno la disciplina per farlo nel modo giusto (tutti i problemi ampiamente evidenti dovrebbero essere risolti prima di avere così tanti tester in qualche fase interna pre-alfa / alfa oppure un'inondazione di report ridondanti può gettare gli sviluppatori in un panico patch-and-pray).

Ciò che raccomando in questo caso è quello che altri hanno suggerito, concentrarsi su una serie distribuita di test di integrazione. È possibile raggrupparlo con il programma di installazione, richiedendo agli utenti di passare un controllo di diagnostica di base con attenzione prestando attenzione a fornire dettagli sul motivo per cui l'installazione non è riuscita e possono essere trasferiti all'utente.

Un'altra cosa (se riesci a convincere il capo) è avere una vasta gamma di hardware disponibile per un'integrazione contigua. Maggiore è la varietà di combinazioni hardware / OS, più è bello. Volete anche una varietà di hardware di merda che modella i minimi requisiti hardware minimi per i vostri server CI: non lo sapete mai.

Ma c'è un'altra cosa che suggerirei:

Registrazione

Se hai a che fare con qualcosa di simile allo scenario che ho descritto sopra, spesso non puoi probabilmente testare queste cose che tendono ad essere le più problematiche (quei peggiori possibili problemi che si presentano nel momento peggiore possibile e non possono nemmeno presentarsi nemmeno nel suite di test più esaustiva poiché è un problema limitato a una combinazione hardware / SO molto specifica).

Tuttavia, la maggior parte di questi tipi di problemi come oscure incompatibilità hardware o vere e proprie anomalie del driver o collegamenti contro il dylib sbagliato (non ho mai affrontato questa preoccupazione) non ti porterà molto lontano all'avvio del software. Di solito si schianta e brucia abbastanza presto, parlando rozzamente.

Raccomando, per amor di sanità mentale, di abbracciare l'inevitabile. Non puoi assolutamente fare nulla riguardo a queste cose che non puoi assolutamente provare in modo completo. Non cercare di prevenire l'uragano (impossibile), ma sali su quelle finestre.

In genere qui, la cosa migliore che possiamo fare è scoprire il problema il più presto possibile, dove si presenta il più dettagliato possibile (per restringere il nostro elenco di sospetti) e risolvere il problema al più presto dopo che è stato segnalato.

In questo caso, la registrazione può essere un vero toccasana. Per questo tipo di campi, puoi creare questi log tecnici di spam che nessuno avrebbe mai letto. Spesso è rilevante solo l'ultima riga registrata nel registro prima che l'utente abbia riscontrato un arresto anomalo a causa di un errore del driver, ad esempio È possibile scrivere un processo esterno o un hook che monitora gli arresti anomali e quindi mostra l'ultima riga del registro che gli utenti possono copiare e incollati, ad esempio oltre a un crash dump.

Poiché ciò spesso richiede informazioni granulari e molte delle aree più sensibili nel codice a questi problemi hardware / piattaforma / driver sono critiche per le prestazioni, c'è questo problema imbarazzante in cui la registrazione può avvenire a una frequenza così frequente da rallentare effettivamente giù il software.

Un trucco utile in questo caso è fare affidamento sul presupposto che qualcosa eseguito una volta verrà eseguito correttamente la seconda volta, la terza volta, ecc. Questo non è il presupposto più valido, ma spesso è "abbastanza buono" (e infinitamente migliore di niente) . Con ciò, puoi usare un po 'di stato esterno per tenere traccia di quando qualcosa è già stato registrato e saltare i successivi tentativi di registrazione per quei casi davvero granulari in cui il codice verrà invocato ripetutamente in un ciclo.

Spero comunque che questo aiuti. Mi sono imbattuto in questo tipo di tentazione in passato e ho un po 'di paranoia sulla codifica GPU (GPGPU e shader) come risultato di alcune esperienze passate tra me e il mio team (a volte vedendo solo altri membri del team affrontare questi davvero tardi e post-release mi hanno dato i brividi, come un glitch di ATI su uno specifico modello Radeon che si schiantava nel rendering di linee antialias, successivamente riportato e contrassegnato come un problema noto con solo una soluzione alternativa disponibile).

La registrazione è stata la cosa che ci ha salvato i mozziconi lì, permettendoci di vedere spesso il problema su quel 10,001 oscuro prototipo di macchina con una GPU a bordo di cui non abbiamo mai sentito parlare, con l'ultima riga di codice che ci consente di individuare immediatamente dove l'errore è sceso a 2 o 3 righe di codice come sospetto, ad es. Se si trova all'interno di uno shader elaborato, siamo una specie di SOL poiché non possiamo effettuare la registrazione all'interno di uno shader GPU, ma possiamo almeno usare la registrazione per vedere quale shader ha subito il problema per iniziare le indagini.


2
Memorizzare il codice di registrazione è intelligente. Al momento non produciamo registri, in gran parte a causa di problemi di prestazioni, quindi il debug comporta un dump principale. Anche l'integrazione dei test diagnostici con l'installer è una buona idea. Grazie per la risposta dettagliata.
Jon Chesterfield,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.