Domanda

Entrambi sono BDD (Behavior Driven Development) framework di unit test in grado di Scala scritti in Scala. E Spec è costruito su può coinvolgere anche il ScalaTest quadro . Ma cosa significa Spec offrono ScalaTest non lo fa? Quali sono le differenze?

È stato utile?

Soluzione

Tutte le specifiche e ScalaTest sono entrambi buoni strumenti con gli utenti felici, ma differiscono in diversi modi. Probabilmente si vorrà scegliere uno come strumento principale di prova a Scala, ma non c'è bisogno di rinunciare l'altro perché è possibile utilizzare pezzi di entrambi. Se ti piace la sintassi FeatureSpec di ScalaTest e la sintassi Mockito specifiche, per esempio, è possibile inserire entrambi i file jar nel classpath e utilizzare entrambi allo stesso tempo. Qui cercherò di catturare le principali differenze di filosofia di design che ho notato tra le specifiche e ScalaTest.

Probabilmente la principale differenza filosofica tra gli strumenti è che le specifiche è stato progettato per behavior-driven development (BDD), mentre ScalaTest è più generale. ScalaTest prevede tratti che si possono mescolare insieme per ottenere il comportamento desiderato nelle classi di test, tra cui BDD, e si può facilmente definire il proprio comportamento se si desidera qualcosa di diverso.

ScalaTest sostiene BDD attraverso i suoi tratti Spec, FeatureSpec, WordSpec, FlatSpec e GivenWhenThen, e ha anche caratteristiche che si possono mescolare per ottenere un bel sintassi matcher. Se vi piace "dovrebbe", è mescolare in ShouldMatchers. Se vi piace "necessario", è mescolare in MustMatchers. Ma se vi piace BDD, ma non ti piace la sintassi matcher, si può semplicemente utilizzare uno dei tratti di Spec ScalaTest senza mescolare in un tratto matchers. Spec ha una classe specifica che si estende, ed è necessario utilizzare la parola "must" nelle espressioni matcher. Una grande differenza filosofica che è evidente è che ScalaTest ti dà molto di più scelte. Per rendere questo spazio di scelta più facile da navigare, fornisco un albero di decisione qui:

http://www.scalatest.org/quick_start

La sintassi di abbinamento è anche diversa tra ScalaTest e spec. In ScalaTest Ho provato a vedere quanto lontano potevo andare con la notazione dell'operatore, e finito con espressioni matcher che leggono molto simile frasi in inglese, con spazi tra le parole. Spec Matcher sintassi esegue parole insieme più con il caso di cammello.

Tutte le specifiche ha più matchers di ScalaTest, e che penso che riflette una differenza di atteggiamento di progettazione. Io in realtà tagliato probabilmente 2/3 della sintassi matcher ho costruito e considerato per il rilascio. Vorrei aggiungere più matchers nelle versioni future, ma volevo essere sicuro che sapevo utenti in realtà volevano qualcosa prima ho aggiunto. Tuttavia matchers di ScalaTest include una sintassi proprietà matcher dinamica prende un po 'di quel gioco. Per esempio, in Spec è possibile scrivere su un java.io.File:

file must beDirectory

In questo modo richiamare il isDirectory e assicurarsi che sia vero. ScalaTest non ha matchers speciali per java.io.Files attualmente, ma in ScalaTest, si potrebbe utilizzare un controllo dinamico come questo:

file must be a ('directory)

Ogni volta che si passa un simbolo dopo be, userà riflessione per cercare (in questo caso) un metodo o un campo denominato directory o un metodo denominato isDirectory. C'è anche un modo per fare questo statica, definendo un BePropertyMatcher (che richiede solo 2 o 3 righe di codice di solito). Quindi, fondamentalmente in ScalaTest cerco di fornire più funzionalità con meno API.

Un'altra differenza atteggiamento progettuale generale tra specifiche e ScalaTest comporta conversioni implicite. Per impostazione predefinita, si ottiene una sola conversione implicita quando si utilizza ScalaTest, che è quella che mette l'operatore === su tutto. (Se è necessario, è possibile "spegnere" questa conversione implicita con una sola riga di codice. L'unica ragione per cui si avrebbe bisogno di fare è che se si stava tentando di provare qualcosa che ha un proprio operatore ===, e si ottiene un conflitto .) ScalaTest definisce molte altre conversioni implicite, ma per usarli è necessario in modo esplicito "invitare" li nel codice mescolando in un tratto o fare un'importazione. Quando si estende classe Specification in specifiche penso che praticamente ottiene decine di conversioni implicite di default. Io non sono sicuro di quanto che importa, in pratica, ma immagino che la gente vorrà testare il codice che utilizza i propri impliciti, e, a volte ci può essere un conflitto tra impliciti del quadro di prova e quelli del codice di produzione. Quando ciò accade Penso che possa essere più facile per risolvere il problema in ScalaTest di spec.

Un'altra differenza di atteggiamento progettuale che ho notato è la comodità con gli operatori. Un obiettivo che avevo era che qualsiasi programmatore guardando qualcun altro codice di prova che utilizza ScalaTest sarebbe in grado di indovinare quale sia il significato era senza guardare nulla fino nella documentazione ScalaTest. Volevo codice client ScalaTest essere goccia morti evidente. Un modo questo obiettivo si è manifestato è che ScalaTest è molto conservatore sugli operatori. Mi definisco solo cinque operatori in ScalaTest:

  • ===, il che significa uguali
  • >, il che significa maggiore di
  • <, a meno di
  • >=, maggiore o uguale
  • <=, minore o uguale.

Questo è tutto. Quindi, queste cose più o meno quello che sembrano significare. Se vedete nel codice di qualcun altro:

result should be <= 7

La mia speranza è che non sarà necessario eseguire la documentazione delle API di indovinare che cosa significa che <=. Al contrario, le specifiche è molto più libera con gli operatori. Niente di male, ma si tratta di una differenza. Gli operatori possono rendere il codice più conciso, ma il compromesso è che si può avere per correre alla documentazione quando si trova cose come ->-, >>, |, |>, ! o ^^^ (che tutti hanno un significato speciale in Spec) nel codice di prova del tuo collega .

Un altra differenza filosofica è che io cerco di fare è solo leggermente più facile in ScalaTest utilizzare uno stile funzionale, in cui è necessario condividere un appuntamento fisso, mentre Spec per default continua la tradizione dell'approccio setUp e tearDown popolare da JUnit, in cui si riassegna Vars prima di ogni prova. Tuttavia, se si desidera verificare in questo modo, è anche molto facile in ScalaTest. Hai solo bisogno di mescolare nel tratto BeforeAndAfter.

Per informazioni più dettagliate su ScalaTest, è possibile guardare la presentazione "Get Higher con ScalaTest" Ho dato alla Devoxx Conference 2009 qui:

http://parleys.com/play/514892260364bc17fc56bde3/chapter0/about

Altri suggerimenti

Le principali differenze sono (per lo più dal punto di vista specifiche :-)):

  • ScalaTest fornisce più "stili di test" di specifiche (si può visitare ogni punto di proiettile sulla avvio rapido pagina per ottenere una vista dettagliata su ogni stile)

  • ScalaTest ed occhiali hanno un diverso insieme di matchers. È possibile confrontare i loro qui per ScalaTest e < a href = "http://code.google.com/p/specs/wiki/MatchersGuide" rel = "noreferrer"> qui per le specifiche. Su quel lato delle cose, spec ha un sacco di piccole caratteristiche che che hanno la possibilità quando si scrive la vostra specifica: matchers xml, matchers composizione (un modo semplice per riutilizzare matchers di trasformandole), fallimenti precise, le differenze dettagliate per lunghe stringhe, .. .

  • Mockito è stato dato un bel sostegno BDD in specifiche: Mockito

  • DataTable che permettono di raggruppare un sacco di piccolo esempio in una sorta di tavolo (se si può stare operatori utilizzato come delimitatori della tabella)

  • In specifiche, è possibile definire esempi che sono annidati come libidum e automaticamente ripulito ad ogni livello

Questo è certamente un confronto molto parziale e di parte ed esistono molte altre differenze (e le librerie sono ancora in evoluzione, ...).

Alla fine della giornata penso che in realtà dipende il test / stile che specifica. Se si tratta di semplice (semplice struttura specifica, messe a punto, le aspettative, ...), allora entrambe le librerie appariranno molto simili. In caso contrario, entrambi hanno il loro introito su come le cose dovrebbero essere fatte. Come ultimo esempio di questo si può dare un'occhiata a marcatura: in ScalaTest e in spec .

Spero che questo aiuta.

Per quanto ne so, salvo alcune caratteristiche altamente specializzati, si tratta di preferenze personali secondo lo stile.

supporto IDE può essere un altro punto

Ho cercato di ottenere Specifiche di lavorare con Eclipse con JUnit, e ho trovato la soluzione ufficiale per essere un po ' "hacky". configurazione Spec: http://code.google.com/p/specs/wiki / RunningSpecs # Run_your_specification_with_JUnit4_in_Eclipse

L'integrazione di ScalaTest (anche attraverso JUnit) con sembra un po 'meno hacky. Eppure, non ho nessuno di loro a lavorare così come JUnit e Java.

configurazione ScalaTest: http: // gruppi. google.com/group/scalatest-users/web/running-scalatest-from-eclipse

Se uno dei fattori decisione è la fase di compilazione, ScalaTest sembra funzionare meglio.

Al momento stiamo utilizzando specs2 nel nostro progetto, ma soffrono di lenta tempi di compilazione nei test. Ho appena finito un POC per trasferirsi in ScalaTest e ho visto i tempi di compilazione scendono di un fattore di circa 0,82 solo cambiando il 2 quadri in alcune delle nostre fonti.

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