Non sono un ingegnere del software. Sono uno studente di dottorato nel campo della geoscienza.
Quasi due anni fa ho iniziato a programmare un software scientifico. Non ho mai usato l'integrazione continua (CI), principalmente perché all'inizio non sapevo che esistesse ed ero l'unica persona che lavorava su questo software.
Ora, poiché la base del software è in esecuzione, altre persone iniziano a interessarsi e vogliono contribuire al software. Il piano prevede che altre persone in altre università stiano implementando aggiunte al software principale. (Ho paura che possano introdurre dei bug). Inoltre, il software è diventato piuttosto complesso ed è diventato sempre più difficile da testare e ho anche intenzione di continuare a lavorarci.
Per questi due motivi, ora sto pensando sempre più all'utilizzo di CI. Dato che non ho mai avuto una formazione da ingegnere informatico e nessuno intorno a me ha mai sentito parlare di CI (siamo scienziati, non programmatori), trovo difficile iniziare il mio progetto.
Ho un paio di domande in cui vorrei ricevere qualche consiglio:
Prima di tutto una breve spiegazione di come funziona il software:
Il software è controllato da un file .xml contenente tutte le impostazioni richieste. Si avvia il software semplicemente passando il percorso al file .xml come argomento di input e viene eseguito e crea un paio di file con i risultati. Una singola corsa può richiedere ~ 30 secondi.
È un software scientifico. Quasi tutte le funzioni hanno più parametri di input, i cui tipi sono per lo più classi piuttosto complesse. Ho più file .txt con grandi cataloghi che vengono utilizzati per creare istanze di queste classi.
Ora veniamo alle mie domande:
unit test, test di integrazione, test end-to-end? : Il mio software ora ha circa 30.000 righe di codice con centinaia di funzioni e ~ 80 classi. Mi sembra strano iniziare a scrivere unit test per centinaia di funzioni già implementate. Quindi ho pensato di creare semplicemente alcuni casi di test. Prepara 10-20 diversi file .xml e avvia il software. Immagino che questo sia ciò che viene chiamato test end-to-end? Ho letto spesso che non dovresti farlo, ma forse è ok come inizio se hai già un software funzionante? O è semplicemente una stupida idea provare ad aggiungere CI a un software già funzionante.
Come si scrivono i test unitari se i parametri della funzione sono difficili da creare? supponiamo che io abbia una funzione
double fun(vector<Class_A> a, vector<Class_B>)
e di solito, dovrei prima leggere in più file di testo per creare oggetti di tipoClass_A
eClass_B
. Ho pensato di creare alcune funzioni fittizie comeClass_A create_dummy_object()
senza leggere i file di testo. Ho anche pensato di implementare una sorta di serializzazione . (Non intendo testare la creazione degli oggetti di classe poiché dipendono solo da più file di testo)Come scrivere i test se i risultati sono molto variabili? Il mio software utilizza grandi simulazioni monte-carlo e funziona in modo iterativo. Di solito, hai ~ 1000 iterazioni e ad ogni iterazione stai creando ~ 500-20.000 istanze di oggetti basate su simulazioni monte-carlo. Se solo un risultato di una iterazione è leggermente diverso, tutte le iterazioni imminenti sono completamente diverse. Come gestisci questa situazione? Immagino che questo sia un punto importante rispetto ai test end-to-end, poiché il risultato finale è altamente variabile?
Qualsiasi altro consiglio con CI è molto apprezzato.