Come posso testare il codice irraggiungibile?

1

Supponiamo che la tua azienda venda software che viene fornito con testo personalizzabile e che il lavoro del tuo team è personalizzarlo. Il coinvolgimento del cliente include un contratto in cui il cliente specifica tutte le risorse testuali e in cui il team garantisce un ciclo di test completo.

Da qualche parte nel codice c'è una logica che assomiglia a questa:

var response = proxy.Foo(request);
if (!response.IsOK)
{
    switch (response.ErrorCode)
    {
        case Constants.BadProfile:
            DisplayError(Resources.BadProfile);
            break;
        case Constants.BadRequest:
            DisplayError(Resources.BadRequest);
            break;
        default:
            DisplayError(Resources.GeneralError);  //Should never happen
            break;
    }
}

In base al modo in cui il codice viene scritto, è letteralmente impossibile generare una condizione di dati che genera il terzo errore. Ma il team di ingegneri l'ha messo lì solo in caso di un difetto di codice futuro o per evitare la situazione in cui il cliente non è aggiornato e il proxy genera un errore nuovo e sconosciuto.

Detto questo, il cliente ha personalizzato tutte e tre le risorse dei messaggi di errore e QA vuole testarle tutte e tre.

Sarebbe ragionevole che la QA insista sui test per garantire che la risorsa di errore generale sia corretta? Come possono produrre quell'errore?

Oppure l'inclusione del messaggio di errore è un errore nei requisiti, poiché specifica una caratteristica senza criteri di accettazione definibili?

Nota: proxy in questo esempio è un servizio di terze parti, quindi non è possibile eseguire il rig per generare un errore imprevisto. Ovviamente potremmo modificare il codice client per forzare l'errore, ma non testeremo il codice base che finirà in produzione.

Modifica:

Il "proxy" in questo caso non è un client WCF o REST. È una DLL binaria scatola nera. Non c'è separazione di preoccupazioni, nessuna iniezione di dipendenza e nessun trasporto conveniente da intercettare. Non c'è un posto dove spremere il risultato senza sforzo in modo così eroico da minare la credibilità del test e il dispendio di sforzi per un caso così delicato.

D'altra parte, la rimozione completa del backstop solo per colpire una statistica al 100% del QA sembra un po 'distopica, cioè contraria al senso comune.

Potremmo semplicemente "nascondere" la funzione e non dirlo al cliente, ma il testo contiene preziose informazioni di supporto specifiche per ogni cliente.

    
posta John Wu 05.12.2018 - 04:14
fonte

3 risposte

6

Scherzi a parte, prendi in giro quel proxy. È un limite del sistema che stai testando.

Creare:

  • Uno stub completo che sostituisce interamente il sistema di terze parti. Rendilo abbastanza intelligente da gestire una richiesta in diversi modi, in modo che tu possa esplorare tutte le opzioni.
  • Una spia che si trova tra il codice e il codice di terze parti. Rendilo abbastanza intelligente da passare in modo condizionale alle richieste e restituire in modo condizionato una risposta diversa. Dovrebbe essere in grado di registrare le interazioni. Ciò consente di esplorare tutte le opzioni, ma anche di fornire una finestra per vedere come si integra la tua applicazione.

Se non puoi farlo tu stesso, rimettilo nel team di ingegneri. Loro possono scrivere un confine che ti dà copertura del test. Inoltre, renderà più semplice il test del proprio sistema tramite test unitari.

Se quel proxy è una rappresentazione di un protocollo di comunicazione cross-process ben definito, allora sei fortunato, perché ci sono molte spie / stub off-the-shelf.

Se viene fornito da una libreria di terze parti / protocollo non standard, gli sviluppatori avranno bisogno di utilizzare i loro meccanismi di astrazione linguistica per fornire facciata / adattatori e un modo per usare la versione di stub / spy anziché l'opzione della libreria di terze parti.

    
risposta data 05.12.2018 - 07:06
fonte
1

Se l'unica cosa che vuoi è testare se tutti questi messaggi di errore sono stati personalizzati correttamente, c'è una soluzione più efficiente per questo che investire mesi di lavoro per creare scenari di test per ogni situazione di errore, solo per fare l'applicazione mostra il testo personalizzato con un errore "reale". Invece,

  • chiedi al team di ingegneri di fornire alcune funzioni aggiuntive, semplici, "personalizza testo degli errori" che consente di visualizzare ogni messaggio di errore disponibile dalle risorse in una finestra di dialogo o in una forma di dimensioni e stile simili a la finestra di dialogo o la forma in cui verrebbe visualizzata regolarmente, nel caso si verifichi un errore.
  • chiedi loro di creare la funzione in un modo che consenta anche di passare rapidamente tra il testo originale e il testo personalizzato a scopo di confronto.

Questo eviterà qualsiasi necessità di modificare qualsiasi codice come lo snippet dalla tua domanda, eviterà la necessità di prendere in giro quel proxy e lo renderà più semplice di un ordine di grandezza per te (così come per il QA) per testare tutte le personalizzazioni. E, come bonus, diventerà banale testare la personalizzazione dei messaggi di errore che altrimenti apparirebbero solo in un codice (quasi) irraggiungibile.

    
risposta data 05.12.2018 - 11:41
fonte
0

Come testare Switch case? La spedizione può essere effettuata da oggetti.

switch (response.ErrorCode)
{
    case Constants.BadProfile:
        DisplayError(Resources.BadProfile);
        break;
    case Constants.BadRequest:
        DisplayError(Resources.BadRequest);
        break;
    default:
        DisplayError(Resources.GeneralError);  //Should never happen
        break;
}
  • Rifiuta Passa al dizionario / mappatura e modifica errorCodeToMessage

    DisplayError(errorCodeToMessage.getDefault(response.ErrorCode, Resources.GeneralError))
    
  • Mappatura dei refattori sull'uguaglianza per chiedere l'oggetto. Quindi, puoi impostare il codice di errore prima.

    response.getErrorResourceId()
    
  • Non mi piace se la logica di basso livello chiama la GUI. Ci possono essere tante astrazioni e pensieri tra cui mi piace aver scritto esplicitamente.

Pensando, il mio codice perfetto sarebbe:

var response = proxy.Foo(request);
if (response.isOK()) {
    ...
} else {
    displayResponseError(response)
}

void displayResponseError() {
    errorCode = response.errorCode
    message = getMessageForResponseErrorCode(errorCode)
    displayErrorMessage(mesage)
}

getMessageForResponseErrorCode(errorCode) {
   return getMappingFromErrorCodeToMessage().get(errorCode, getDefaultErrorMessage())
}

Questo codice ha quattro metodi da testare. Potrebbero essere tutti nella risposta, se possibile.

    
risposta data 06.12.2018 - 01:51
fonte

Leggi altre domande sui tag