Domanda

programmo per lo più in scala e Java, usando ScalaTest a Scala e JUnit per il test dell'unità. Vorrei applicare gli stessi test per diverse implementazioni della stessa interfaccia / trait. L'idea è quella di verificare che il contratto di interfaccia viene applicata e per controllarne Liskov principio di sostituzione.

Per esempio, quando il test implementazioni di liste, i test possono includere:

  • Un esempio dovrebbe essere vuoto, se e solo se e solo se ha dimensioni pari a zero.
  • Dopo aver chiamato chiara, la dimensione dovrebbe essere pari a zero.
  • Aggiunta di un elemento nel mezzo di una lista, incrementerà di uno l'indice degli elementi rhs.
  • ecc.

Quali sono le migliori pratiche?

È stato utile?

Soluzione

Questo suona come potrebbe essere un lavoro per i test condivisi. test condivisi sono prove che sono condivisi da diversi oggetti fissaggio. Vale a dire, lo stesso codice di test viene eseguito su dati diversi. ScalaTest ha il supporto per questo. Cerca "test condivisi" nella documentazione del vostro stile preferito tratto che rappresenta i test come funzioni (SPEC, WordSpec, FunSuite, FlatSpec, etc.). Un esempio è la sintassi per FlatSpec:

it should behave like emptyList

test di condivisione nella documentazione FlatSpec

Altri suggerimenti

In Java / JUnit, io in genere gestire questo avendo un testcase astratta da cui test per la classe di test specifica erediterà tutti i test e hanno un metodo di configurazione istanziare l'implementazione. Non riesco a guardare il video abyx postato in questo momento, ma ho il sospetto che sia questa idea generale.

Un'altra possibilità interessante se non ti dispiace l'introduzione di un altro framework di test sarebbe quella di utilizzare JDave classi Specification.

Non ho provato ad utilizzare uno di questi con ScalaTest o con tratti Scala e implementazioni, ma dovrebbe essere possibile fare qualcosa di simile.

test Contratto sono facili da fare con JUnit 4, qui 'un video di Ben Rady.

Per Scala, prendere in seria considerazione ScalaCheck. Tutti questi contratti sono esprimibili specifiche di una riga in ScalaCheck. Quando eseguito, ScalaCheck produrrà un numero configurabile di ingressi campione casuale, e verificare che tutte le specifiche tenere. Si tratta del modo più semanticamente dense possibile creare unit test.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top