Faire quelque chose avant ou après tous les tests Scalatest

J’ai une suite de tests scalatest qui testent différents points de terminaison d’une API RESTful. Je veux vraiment qu’ils soient séparés en différents fichiers pour une meilleure organisation.

Mon problème est de savoir comment démarrer quelque chose (un serveur HTTP dans mon cas, mais peu importe ce que c’est) avant tous les tests et le fermer une fois tous les tests terminés.

Je sais à propos de BeforeAndAfterAll, mais cela ne fait qu’avant / après à l’intérieur d’un fichier de test. J’ai besoin de quelque chose comme ça, mais pour tous les tests, par exemple:

– démarrer le serveur http avant les tests
– exécuter toutes les suites de tests
– arrêter le serveur http

La façon de procéder consiste à utiliser des suites nestedes. Suite a une méthode nestedSuites qui retourne un IndexedSeq [Suite] (dans 2.0, dans 1.9.1 c’était une liste [Suite]). Suite dispose également d’une méthode runNestedSuites chargée d’exécuter toutes les suites nestedes. Par défaut, les appels runNestedSuites nestedSuites, et sur chaque Suite renvoyée, invoquent l’exécution directe ou, si un Dissortingbuteur est transmis, les suites nestedes dans le dissortingbuteur afin qu’elles puissent être exécutées en parallèle.

Donc, ce que vous voulez vraiment faire, c’est de transformer Foo et Bar en classes et de les renvoyer à partir de la méthode nestedSuites de EndpointTests. Il y a une classe qui rend cela facile, appelé Suites. Voici un exemple d’utilisation:

import org.scalatest._ import matchers.MustMatchers class Foo extends FunSpec with MustMatchers { describe("Message here...") { it("Must do something") { } it("Must be ok") { } } } class Bar extends FunSpec with MustMatchers { describe("Hello you...") { it("One more!") { } } } class EndpointTests extends Suites(new Foo, new Bar) with BeforeAndAfterAll { override def beforeAll(configMap: Map[Ssortingng, Any]) { println("Before!") // start up your web server or whatever } override def afterAll(configMap: Map[Ssortingng, Any]) { println("After!") // shut down the web server } } 

Un problème potentiel est que si vous utilisez la découverte pour trouver des suites à exécuter, les trois EndpointTests, Foo et Bar seront découverts. Dans ScalaTest 2.0, vous pouvez annoter Foo et Bar avec @DoNotDiscover, et Runner de ScalaTest ne les découvrira pas. Mais il en sera toujours de même. Nous améliorons actuellement sbt pour qu’il passe sur des suites autrement découvrables qui sont annotées avec DoNotDiscover, mais ce sera dans sbt 0.13, ce qui n’est pas encore le cas. En attendant, sbt peut les ignorer en ajoutant un paramètre constructeur inutilisé à Foo and Bar.

Sinon, vous pouvez simplement utiliser un object.

 object TestServer { startServer() } 

Lorsque vous accédez à l’object, il sera initialisé, démarrant le serveur. Créez simplement un trait commun dans le corps duquel vous accédez à l’object. Puis mélangez ce trait dans tous vos tests. Terminé.

Si votre serveur fonctionne en mode démon (par exemple, une application Play! En mode test), il sera automatiquement arrêté une fois tous les tests exécutés.

Ok, a trouvé un moyen. Il semble (sauf si quelqu’un ici peut me corriger) que Scalatest n’a pas la possibilité d’une suite “maître”. Mais … vous pouvez en construire un.

Vous pouvez composer une suite à partir de traits. Donc, en utilisant mon exemple de terminal:

 class EndpointTests extends FunSpec with MustMatchers with BeforeAndAfterAll with Foo with Bar { override def beforeAll(configMap: Map[Ssortingng, Any]) { println("Before!") // start up your web server or whatever } override def afterAll(configMap: Map[Ssortingng, Any]) { println("After!") // shut down the web server } } 

Ok, mais qu’en est-il des tests? Notez le avec Foo avec Bar . J’apporte les tests dépendants en tant que traits. Vois ici:

 trait Foo extends FunSpec with MustMatchers { describe("Message here...") { it("Must do something") { } it("Must be ok") { } } } trait Bar extends FunSpec with MustMatchers { describe("Hello you...") { it("One more!") { } } }