|
Wings-Rendere i test unitari intelligenti e completamente automatizzatiprefazione Il test unitario è un mezzo molto efficace per garantire la qualità del software, sia dal punto di vista del concetto di intervento precoce nei test sia dalle caratteristiche dei test unitari che possono essere verificate ad alta velocità senza essere influenzate dall'interfaccia utente, quindi lo sviluppo guidato dai test promosso dall'industria, il driver di test menzionato qui si riferisce più al driver di test unitario. Tuttavia, il team di sviluppo generale esegue ancora raramente test unitari in modo sistematico, e il test per il software applicativo viene eseguito più da team professionisti per eseguire test black box. La difficoltà più grande dei test unitari non è che l'input e l'output non possano essere determinati, dopotutto sono già determinati nella fase di sviluppo del modulo, ma che la scrittura dei casi di test unitario richiederà molte ore lavoro agli sviluppatori e, secondo le statistiche rilevanti, il tempo dei casi di test unitario supererà di gran lunga il tempo di sviluppo della funzione stessa. Ecco alcune delle ragioni più comuni per cui lo sviluppo non scrive test unitari: ●I requisiti sono sempre infiniti, e ci sono ancora requisiti funzionali da realizzare nella fase successiva, e non c'è tempo per riempire l'unità ●Ci sono troppi test unitari da integrare, e non c'è modo di iniziare, quindi resisto soggettivamente. ● I test unitari sono difficili da scrivere. Da un lato, la ragione potrebbe essere che l'implementazione della funzione funzionale non è abbastanza ragionevole, e dall'altro non esistono (o non esistono) framework di test unitari e framework mock utili. ● I test unitari non sono inclusi nel carico di lavoro. In secondo luogo, i requisiti funzionali sono ancora instabili e la performance dei costi per scrivere test unitari non è elevata. In altre parole, se i requisiti cambiano domani, non solo il codice funzionale verrà eliminato, ma anche i test unitari. Se non scrivi test unitari, questa parte dello sforzo non sarà vana. In effetti, la causa principale di questi punti è che la scrittura dei test unitari richiede troppo tempo, il che porta infine alla perdita di potenza del motore guidato dai test, causando che la splendida visione dello sviluppo guidato dai test venga bloccata nello scenario reale, perché è troppo difficile e costoso costruire il motore per questo motore. Le varie unità "x" presenti sul mercato e i framework di unit testing risolvono solo il problema della generazione di frame esterni guidati dai test, senza alcuna logica di casi d'uso e capacità di generazione dati basate su una profonda comprensione dei programmi. Pertanto, rende gli sviluppatori resistenti in vari scenari legati allo sviluppo. Il rilascio di Wings (attualmente per C) risolve uno dei problemi più grandi per i programmatori e ha il potenziale di cambiare radicalmente lo status quo dei test unitari, alleviando efficacemente la pressione dei test a scatola nera a livello di sistema e dei test automatizzati basati su enormi risorse umane. I casi di test dei vincoli sono generati automaticamente dai programmi, e la tecnologia sottostante più critica è la tecnologia di parsing dei parametri complessi. Cioè, può definire arbitrariamente l'analisi parsing ricorsiva a livello di compilatore a livello di compilatore per tipi arbitrariamente complessi. Senza questa svolta in questa tecnologia critica, il sistema automatico di generazione dei casi di test sarebbe stato commercialmente incapace o evolversi per produrre dati di test conformi con efficienza molto bassa. Ad esempio, il famoso strumento di fuzzing American Fuzzy Lop non può identificare il tipo di struttura richiesta dal programma dell'utente e deve evolvere l'algoritmo di ricerca basandosi sullo strato più esterno. Le caratteristiche del programma sono che l'input a livello di interfaccia e i requisiti dati di un modulo interno sono lontani, e i dati esterni vengono solitamente trasformati strato dopo strato di trasformazione complessa per diventare il tipo di struttura dati richiesto dal modulo interno, quindi la quantità di calcolo e tempo necessari per esplorare dal livello esterno sarà inimmaginabile. Basandosi sull'American Fuzzy Lop, per poter generare un'affermazione SQL legittima, il modulo interno del programma deve essere esplorato in giorni, lontano dall'essere in minuti o ore. Un altro vincolo è che gli input che ogni programma può prendere in carico sono dati accuratamente strutturati e compilati con un gran numero di regole, ed è molto irrealistico ed estremamente dispendioso in termini di tempo generare questi dati tramite metodi casuali + esplorativi. Pertanto, non è fattibile generare casi d'uso generati automaticamente sia dalla scatola nera sia dall'input più esterno. Se il caso d'uso guidato è generato dall'analisi della struttura interna del software, è necessario avere una profonda comprensione della struttura di compilazione del software. Un sistema di generazione di casi di test valido dovrebbe basarsi sul centro del programma (punto di ingresso della chiave) come punto di ingresso più appropriato. Gli input di questi moduli hanno trasformato gli input fuzzy in parametri altamente strutturati. Finché queste strutture complesse possono essere identificate, i tipi di dati complessi possono essere degradati in tipi di dati semplici passo dopo passo, e la costruzione dei parametri può essere completata contemporaneamente, la generazione dei casi d'uso di guida può essere completata automaticamente. Il testing basato su moduli, che può essere classificato come tradizionale test unitario, è il modo migliore per individuare e contenere i difetti nella fase di R&S. Tuttavia, a causa delle limitazioni dei test unitari, è necessario sviluppare un gran numero di driver, e la promozione e l'applicazione nel settore sono molto limitate. Naturalmente, i test unitari possono essere eseguiti anche dopo l'integrazione del sistema per evitare la costruzione di programmi virtuali stub. Il prodotto Wings di Nebulas Testing, lanciato per la prima volta al mondo pochi giorni fa, è un sistema di generazione di casi di test unitari intelligente e completamente automatizzato, che ha studiato e risolto le seguenti difficoltà, e ora viene condiviso con voi. (1) Analisi approfondita dei parametri del programma Wings utilizza la tecnologia sottostante del compilatore per formare oggetti modulo basati sul file sorgente di input secondo la funzione. L'oggetto contiene i parametri di input della funzione, il tipo di valore di ritorno e altre informazioni, che possono essere utilizzate dal modulo funzione driver e dal modulo del caso di test. Ogni file è un'unità che esegue un'analisi approfondita di ogni parametro di ogni funzione al suo interno, e può ottenere analisi e decomposizione accurate per tipi annidati, tipi complessi, ecc., spiegare i tipi complessi livello per strato come tipi di dati di base e generare un file di descrizione (PSD) della struttura dei parametri. (2) Generazione automatica di moduli tramite azionamento di funzioni Secondo le informazioni di formato del file PSD, tutte le funzioni driver del programma sorgente sotto test sono generate automaticamente, e il processo di test unitario non si affida più agli sviluppatori per scrivere manualmente le funzioni di test, ma deve solo compilare insieme le funzioni driver generate e i file sorgente sotto test, e i risultati del test possono essere eseguiti e visualizzati. Il driver di prova genera automaticamente il programma in base alla descrizione PSD, costruisce completamente automaticamente tutti i parametri e le variabili globali necessarie che guidano il test sotto test, e può generare un driver di test strutturato secondo la gerarchia delle variabili complesse, il che può far risparmiare molto tempo nella scrittura di casi di test unitari. (3) Generazione e gestione automatica dei dati di test Viene utilizzato per generare automaticamente dati di test, che corrispondono alle informazioni estratte dalla funzione di test e i dati vengono memorizzati in un file JSON con una certa relazione logica gerarchica. I dati e il tipo di dato dopo la decomposizione e l'espansione corrispondono l'uno all'altro. Gli utenti possono marginalizzare arbitrariamente questi dati in base alle esigenze aziendali e utilizzare file JSON per visualizzarli in modo strutturato e gerarchico, cosa molto chiara. I dati di test includono i valori delle variabili globali e i valori dei parametri quando viene chiamata la funzione sotto test. Wings fornisce un metodo di test unitario per generare automaticamente funzioni di driver, che include principalmente i seguenti passaggi: Figura 1: Flusso di build guidato da test unitari 1 Estrazione delle informazioni del programma in fase di provaLe informazioni strutturali del programma sotto test includono principalmente le variabili globali e le informazioni sulla funzione nel programma, mentre le informazioni sulla funzione includono principalmente il numero di parametri, tipi di parametri e tipi di valori di ritorno della funzione. La cosa più importante è estrarre le informazioni sui simboli e i tipi per alcuni tipi complessi, e analizzarli in tipi di dati base livello per strato per completare la costruzione delle variabili globali e dei parametri funzionali. I tipi di variabili sono generalmente suddivisi in tipi di base, tipi di costruzione, tipi di puntatore e tipi nulli. Wings utilizza la tecnologia di compilazione sottostante per gestire diversi tipi di variabili in modi differenti. (1) Tipi base, come int senza segno u_int=20, Wings analizzerà il nome della variabile in u_int e il tipo di dato in int senza segno. (2) Tipi di costruzione, i tipi di costruzione sono grossomodo divisi in array, struct, comuni e tipi di enumerazione. ● Tipo di array, come intarray[2][3], nome array è array, tipo int e lunghezza dell'array 2D, comportamento 2, colonna 3. ●Tipo di struttura, per struct come array, struct linked list, ecc., diversi marcatori sono divisi. (3) Tipo di puntatore, ad esempio int **ptr = 0; , analizza il puntatore come un puntatore di livello 2 di tipo int. (4) Tipo nullo, che viene risolto come NULL. (5) I tipi di sistema, come File, size_t, ecc., sono segnati come tipi di sistema e verranno aggiunti al template e assegnati dall'utente. (6) Tipo di puntatore di funzione, analizzare il tipo di valore di ritorno, il tipo di parametro e il numero di parametri della funzione Per ogni unità di compilazione del programma sorgente sotto test, le informazioni sulla funzione analizzata vengono memorizzate nella corrispondente struttura PSD, e i seguenti esempi di codice sorgente sono descritti:
Nel programma sopra, annulla StructTypeTest3(myy_struct mm_struct[2])La struttura PSD salvata è la seguente:
I significati di ogni nodo nel file PSD sono i seguenti: ●StructTypeTest3 rappresenta il nome della funzione, parmType0 rappresenta il tipo di parametro e parmNum rappresenta il numero di parametri ●mm_struct rappresenta il simbolo del parametro della funzione, baseType1 rappresenta la classificazione dei tipi (tipo base di dati, tipo costruzione, tipo puntatore, tipo nullo), il tipo rappresenta tipi specifici, inclusi int, char, short, long, double, float, bool, e questi tipi di tipi senza segno e altri tipi di base, e ci sono alcuni tipi speciali come: ZOA_FUN tipo rappresenta il tipo di funzione, StructureOrClassType rappresenta il tipo di struct, ecc., e il nome rappresenta il nome dello struct, dell'unione e del tipo enum ●i_int rappresenta il tipo base, che è l'unità di assegnazione più piccola ●array_one rappresenta il tipo di array, RowSize rappresenta la lunghezza dell'array e l'array può essere suddiviso in array unidimensionali, bidimensionali, ecc ●point rappresenta il tipo di puntatore, il puntatore è diviso in puntatore di primo livello, puntatore di secondo livello, ecc., e il puntatore generale viene usato come parametro di funzione come array, quindi per il tipo base di puntatore viene utilizzato il metodo dell'array di allocazione dinamica per assegnare i valori, e l'utente può modificare il file di valori corrispondente secondo le necessità. ● w rappresenta il tipo di campo bit, e bitfileld rappresenta il numero di cifre ●functionPtr rappresenta il tipo di puntatore di funzione, che analizza rispettivamente il tipo di parametro, il numero di parametri e le informazioni sui valori di ritorno ●Dem sta per type consorzio ● dy rappresenta il tipo di enum, e il valore rappresenta il valore del tipo di enum ●file rappresenta il tipo di struttura, SystemVar rappresenta che questa variabile appartiene alla variabile nel file di intestazione di sistema; per questo tipo di variabile, Wings aggiunge variabili template alla libreria di template, gli utenti possono assegnare valori speciali in base a esigenze specifiche. Ad esempio, il tipo di file è gestito come segue:
Gli utenti possono anche aggiungere i propri metodi di assegnazione. Per i tipi di sistema, le Ali possono essere distinte dai tipi ordinari definiti dall'utente e, analizzando il tipo integrato del sistema, possono fermare l'analisi ricorsiva verso il basso. ●g_int rappresenta variabili globali, e globalType rappresenta variabili globali ●next rappresenta la struttura delle liste collegate, e NodeType rappresenta questa struttura come una lista collegata ●returnType rappresenta il tipo di valore di ritorno della funzione. 2 Generazione automatica di driverNel documento sopra, le informazioni strutturali delle variabili e delle funzioni globali vengono analizzate ed estratte, e le seguenti informazioni vengono utilizzate per salvare in PSD e completare la generazione complessiva del framework di guida del programma sorgente sotto test. La generazione è principalmente suddivisa nei seguenti aspetti: Ø Dichiarazione delle variabili globali Ø Operazione di assegnazione dei parametri della funzione, in base al numero di parametri della funzione, assegna a turno i valori Ø L'assegnazione delle variabili globali viene eseguita in modo sequenziale in base al numero di variabili globali utilizzate dall'analisi Ø Chiamata della funzione originale Alcuni punti da notare sono i seguenti: ●Durante il processo di generazione del driver, alcune funzioni speciali, come funzioni principali, funzioni statiche, ecc., non vengono temporaneamente elaborate perché non possono essere accessibili dal mondo esterno. ● Per ogni file sorgente sotto test, viene generato un file driver corrispondente. ● Il controllo del disco è incluso nel Driver_main.cpp per configurare automaticamente il numero di test della funzione tramite macro La funzione driver generata dal programma sorgente sopra descritto è la seguente: ● Tutte le variabili sono nominate prima del nome della variabile originale, aggiungi _ ●Ottenendo i dati di test corrispondenti, le variabili vengono assegnate a turno ●Per i parametri integrati del sistema e i parametri speciali dell'utente, il metodo di assegnazione è configurato uniformemente attraverso il metodo template. ●Assegnare e chiamare parametri alla funzione sotto test. 3 I dati di test vengono generati automaticamenteDi seguito è un insieme di dati generati in formato PSD nella Figura 3, ogni insieme di dati è salvato in formato JSON, rendendo più facile vedere la relazione gerarchica dei dati.
Per ogni unità di compilazione, viene generato di default un insieme di file dati di test corrispondenti a tutte le funzioni, e la generazione dei valori può essere modificata in base al numero di configurazioni. 4 MysqlVengono visualizzati i risultati dei test del programmaCome completare la generazione del framework driver, di seguito è riportata una spiegazione dettagliata dell'intero processo di generazione del programma open source MySQL. Di seguito è riportato il diagramma principale dell'interfaccia di Wings che testa Mysql: Clicca sul pulsante File per impostare la directory del progetto del programma sorgente in test. Dopo aver completato le impostazioni, clicca sull'operazione della funzione, che include principalmente parsing dei parametri, generazione del driver, generazione di file di valore e aggiunta di template. Le seguenti cartelle sono generate per l'analisi: Tra queste, il modulo di parsing dei parametri genera FunXml e GlobalXml, che memorizzano rispettivamente le informazioni sulla funzione e le variabili globali di ciascuna unità di compilazione estratta. Il modulo di generazione del driver sarà generato Wings_Projects cartella corrispondente, che memorizza i file del driver per ogni unità di compilazione Il modulo di generazione del valore memorizza i dati di test generati per ogni unità di compilazione. La figura seguente mostra le informazioni sulla struttura del file del driver caricate da Mysql, e l'albero di navigazione a sinistra è il file driver generato, che contiene le funzioni di ogni unità di compilazione, oltre ai parametri e alle variabili globali delle funzioni. Clicca su una delle unità di compilazione per caricare il corrispondente file driver e il file di valore corrispondente. Quanto sopra è il file driver e il file value corrispondenti alla generazione complessiva di Mysql, e il file driver è descritto in dettaglio nel codice seguente. ● Per ogni unità di compilazione, il riferimento della variabile globale è per esterno. ●La funzione driver è uniformemente denominata come metodo Driver_XXX, JSON viene usato come metodo per ottenere dati di test e tempi rappresenta il numero di test di una singola funzione. ●Per ogni operazione di assegnazione dei parametri, il formato di archiviazione PSD analizzato viene utilizzato per assegnare valori a ogni struttura di livello a turno. L'applicazione di Wings è molto semplice: di seguito è un indice statistico dei dati di test generati utilizzando codice Mysql che può essere compilato normalmente in Visual Studio 2015; ad esempio, l'intero processo di generazione non richiede alcun intervento manuale, basta formulare il percorso del codice sorgente che deve essere generato e guidato. mysqlDati di test | MysqlVersione | | CNumero di file di codice linguistico | | Tempo impiegato per analizzare (PSDTempo di generazione) | | Il tempo necessario per guidare la generazione | | Il valore viene generato dal tempo necessario per generarlo | |
Istruzioni di configurazione del computer: | Sistema operativo | | | Inter(R) Core(TM) i7-7700cpu 3.60GHz | | | | |
Di seguito sono riportati i risultati ottenuti utilizzando lo strumento statistico del codice sorgente, con oltre 4 milioni di righe di codice valido per il test unitario generati da Wings in modo completamente automatico. Ancora più interessante è che si può vedere che il costo dello sviluppo manuale di questi codici arriva fino a 1.079 mesi-uomini, e il costo arriva fino a 10,79 milioni.
Wings ha realizzato il primo passo di esplorazione da parte del programma per generare automaticamente il programma, la prima versione è attualmente rilasciata, gli sviluppatori interessati possono scaricarla direttamente sulla piattaforma code cloud (https://gitee.com/teststars/wings_release), la licenza commerciale offre un periodo di esperienza di funzione illimitato di un mese, puoi rapidamente sperimentare la potenza magica di Wings, la versione in lingua C di Wings supporta più piattaforme, come Visual Studio, VXWORKS, GCC, QT, ecc. Wings è progettato e sviluppato dal team di testing di Nebulas (www.teststar.cc), e gli sviluppatori interessati possono mettersi in contatto con il team di testing di Nebulas tramite la piattaforma interattiva di Codecloud per contribuire con le loro idee di design e feedback sull'uso del prodotto (per le eccellenti proposte adottate, Nebulas può estendere il suo periodo di utilizzo gratuito di almeno tre mesi). Wings ha un gene di base forte per migliorare notevolmente la qualità del software e, in futuro, Wings ottimizzerà profondamente la leggibilità dei programmi scritti automaticamente (più vicino al livello di scrittura dei buoni programmatori) e il supporto per il linguaggio C++.
|