Una suite di test per diverse implementazioni di un protocollo

-1

Abbiamo un protocollo di registrazione che definisce l'output di librerie di registrazione , ad esempio:

  • ogni riga dovrebbe essere un JSON
  • ogni riga non deve superare 1 MB

Esistono diverse implementazioni di questo protocollo di registrazione, ad es. le librerie di registrazione scritte in lingue diverse (Java, Python, ecc.). Vorrei creare una serie di test che posso eseguire su qualsiasi libreria di registrazione per verificare che sia conforme al protocollo di registrazione. Non voglio che gli autori di una nuova libreria portino il test esistente. Invece, voglio che riutilizzino i test esistenti.

Le soluzioni sono già note a questo tipo Kit di compatibilità dei test reattivi per gli stream , ma lavorano per implementazioni nella stessa lingua (o almeno per le lingue JVM). Nel mio caso le implementazioni possono essere di lingue diverse.

Come posso rendere indipendente la lingua dei test?

Idea iniziale

  1. La mia prima idea si basa sul presupposto che le librerie di logging prendano sempre uno o due argomenti:

    logging.error("Serious problem occurred", exception)
    

    e registra l'output in un file di registro

    { level: "error", message: "Serious problem occurred", stacktrace: "....."}
    
  2. Il cablaggio di test passerebbe alcune stringhe alla libreria di test e verificherà l'output.

  3. Il cablaggio di test comunica con una libreria di logging attraverso una pipeline, quindi l'unica cosa che il creatore della libreria deve fornire è un wrapper per la gestione delle comunicazioni con un'imbracatura di test (tramite pipeline).

C'è un approccio migliore?

    
posta dzieciou 13.11.2017 - 18:01
fonte

1 risposta

5

I test indipendenti dalla lingua sono interamente possibili, ma il problema è che è necessario definire un formato indipendente dalla lingua per questi casi di test e scrivere parser / driver di test per questo formato in ciascuna lingua. Potrebbe accadere che un tale test driver risultasse più complicato del protocollo che si sta testando.

Tali test indipendenti dal linguaggio possono utilizzare specifiche in stile Cucumber , un formato ad-hoc o un linguaggio di marcatura come XML o YAML.

Nel tuo caso, potrebbe essere un semplice caso di test YAML:

---
name: Simple error
error: Serious problem occurred
output:
  json:
    level: error
    message: Serious problem occurred
...

Ora purtroppo questo test case è estremamente debole perché l'input e l'output atteso sono molto simili. Ma è un inizio.

Avrai anche difficoltà a astrarre le proprietà specifiche della lingua, come ad esempio:

  • il formato delle tracce dello stack (che alcune lingue come C o C ++ non hanno in un modo standardizzato)
  • iniettare e affermare oggetti specifici del linguaggio come oggetti di eccezione (che alcuni linguaggi come C e in qualche grado C ++ e Perl non hanno)

Invece di scrivere casi di test indipendenti dal linguaggio, potrebbe essere molto più semplice scrivere una specifica breve ma chiara del protocollo. Quindi, tutte le implementazioni possono essere riviste (manualmente) per la conformità. Naturalmente, un'implementazione può ancora avere casi di test individuali.

    
risposta data 13.11.2017 - 21:51
fonte

Leggi altre domande sui tag