Quali sono le tecniche per eseguire i test di accettazione in un'app cloud senza inquinare l'ambiente con i dati di test?

2

Stiamo scrivendo un'applicazione cloud in un'architettura di micro-servizi. Abbiamo una buona copertura di test unitari e di integrazione per i singoli servizi e abbiamo una serie di test di accettazione (pubblici) di livello API.

Per semplicità userò un esempio forzato per affrontare il problema in questione. Diciamo che ho una azienda e utente risorse e voglio testare che l'utente A ha accesso a società A la lista degli utenti ma non può elencare gli utenti di Azienda B .

Posso adottare uno dei due approcci di base:

  1. Supponiamo di avere uno stato nel sistema che è favorevole all'esecuzione di questo particolare scenario
  2. Bootstrap lo stato utilizzando le API pubbliche.

Non mi piace il primo approccio perché ora devo avere le stesse compagnie di test e gli stessi utenti di test in tutti gli ambienti, avviati in anticipo con qualche script o manualmente. Se i test non riescono a lasciare l'ambiente in uno stato incoerente, la modifica dello stato per assicurarsi di poter testare un nuovo scenario può influire su altri test che non ho toccato. Nella mia esperienza, questi test sono estremamente difficili da mantenere, specialmente quando si cresce o si modifica la funzionalità esistente.

Per i nostri test di accettazione siamo andati con il secondo approccio. Per il mio esempio, creerei due nuove risorse (casuali) dell'azienda, creerei utenti casuali in quelle società e quindi faremo richieste per garantire che gli utenti di una società non possano vedere gli utenti nell'altra. Questa tecnica ha molti vantaggi. Non assume nessuno stato precedente in nessun ambiente, quindi posso eseguirli praticamente ovunque con poco sforzo, i test non si influenzano a vicenda, posso parallelizzare tali test molto facilmente perché corrono sempre nella loro "sandbox". La scrittura di test in questo modo è anche incoraggiata dal libro Consegna continua .

Tuttavia ci siamo imbattuti in un piccolo intoppo. Le nostre API (attualmente) consentire per creare dati nel sistema ma non così tanto pulirlo . Alcuni dati hanno "cancellato" , ma siamo tenuti a conservare alcuni dati e solo "eliminazione morbida" .

Negli ambienti "inferiori" questo non è un grosso problema ma, avvicinandosi all'ambiente di produzione, è più difficile vendere "inquinare" l'ambiente .

Abbiamo bisogno di introdurre API speciali per ripulire i dati (hard delete), ma possono essere utilizzati solo dai test? Devo scrivere una suite di test separata per l'ambiente di produzione che presuppone un determinato stato e forse cambia lo stato delle risorse esistenti ma non aggiunge più dati (livello limitato di test). Eseguo solo test di accettazione durante la finestra di distribuzione e ripristino il database allo stato precedente (potrebbe non funzionare con uno scenario di distribuzione blu / verde)?

Il requisito da parte della direzione è che vogliono test di accettazione da eseguire contro l'ambiente di produzione frequentemente per mostrare che il sistema è ancora in una condizione accettabile in modo che possiamo vedere / risolvere i problemi prima che un utente li veda. Personalmente ritengo che dovrebbe essere sufficiente per eseguire test di accettazione dopo la distribuzione perché le versioni dei servizi e la loro configurazione non cambiano tra le distribuzioni. Gli unici problemi che possono / dovrebbero accadere tra le distribuzioni è che una parte del sistema 'va giù', come l'esaurimento delle connessioni DB, lo spazio su disco che si riempie, ecc ... che dovrebbero essere rilevabili dalla salute 'non funzionale' controllare il tipo di diagnostica Ho sbagliato?

    
posta c_maker 03.09.2017 - 16:21
fonte

2 risposte

1

Aggiungi "API" di pulizia

Ma non c'è bisogno di renderli disponibili. Potrebbe essere che hai solo uno script SQL per rimuovere i dati di test.

Un altro approccio è quello di tenere un paio di società di test in giro e riutilizzarle. Ma questo in realtà riduce il problema a un livello, ora devi ripulire gli "utenti" o qualsiasi altra cosa.

Inoltre, hai ulteriori problemi di test che interferiscono tra loro e che le aziende si corrompono.

Essere in grado di eseguire test su Prod è molto importante. Gli utenti segnalano problemi che possono essere o non essere bug. Vuoi essere in grado di eseguire un controllo per assicurarti che le cose funzionino come previsto.

    
risposta data 03.09.2017 - 17:36
fonte
1

Penso che la prima cosa che dovresti provare sia respingere "l'esigenza della gestione". Non vedo il punto di esecuzione di test di accettazione completi in produzione. I dati inutili non sono solo il problema causato dai test in produzione. Che ne dici dei bug introdotti dai tuoi test? Un altro problema è la paura di eseguire test in produzione, gli sviluppatori ci penseranno due volte prima di mettere il test in questa categoria. Quindi rischi di ottenere sempre meno test di accettazione.

Ci sono alcuni tecnici giganti che fanno test di alcuni tipi in produzione. Per esempio. Netflix esegue " Test di Iniezione di guasti " in produzione. Aprono persino la scimmia del caos di origine. Ma questi livelli di test simulano diversi tipi di errori nella produzione per verificare la resilienza dei servizi. Posso vedere il punto di eseguire tali test in produzione. Questi test coprono gli intervalli tra la produzione e gli ambienti UAT, come carico di attività o costoso bilanciamento del carico, ecc.

Piuttosto, dovremmo provare a rendere i sistemi più tracciabili e monitorabili . In teoria, gli ambienti della tua pipeline di distribuzione si avvicinano sempre di più alla tua produzione quando la attraversi.

Hai aggiunto gli argomenti per " Essere in grado di eseguire test su Prod è molto importante. " dicendo

For those production problems that can be only reproduced using someone's production data.

Questo è in realtà un po 'in contraddizione con l'idea del test di accettazione "sandbox". I test dovrebbero essere scritti in modo da non fare affidamento su nessuno stato esistente. Tuttavia, nel tuo commento, fai affidamento sui dati esistenti per riprodurre il problema.

Se davvero non riesci a respingerlo, dovresti provare a ottenere un ambito limitato su questi test che copre solo il divario tra il tuo UAT e la produzione.

Tutte le località menzionate prima non si adattano alla tua situazione e desideri ancora eseguire test di accettazione in produzione, quindi la strategia di dipendenza nessuno stato che hai menzionato è la traccia giusta da seguire. Probabilmente, è anche vantaggioso per te introdurre qualcosa di simile all'identità di co-relazione sulle tue entità / aggregati creati dai tuoi test e il tuo sistema live potrebbe non mostrarli all'utente reale. Ancora una volta, fai attenzione a questo approccio poiché introduce un'altra complessità sul tuo codice di produzione.

    
risposta data 04.09.2017 - 06:27
fonte

Leggi altre domande sui tag