Le démarrage et l'arrêt d'un serveur Jetty entre JUnit tests
Je suis en train de simuler les essais de divers enchaînements de mon programme, la configuration d'un serveur Jetty dans un @Before
méthode et la fermeture dans un @After
.
Mon premier test s'exécuter correctement, mais lors de la tentative pour publier des données dans les tests suivants com.sun.jersey.api.client.ClientHandlerException: java.net.SocketException: Software caused connection abort: recv failed
se produit. Est-il possible que je peux obtenir mon Serveur (et le Client?) pour arrêter proprement entre les tests?
Mon Avant et Après le code est comme suit:
@Before
public void startServer() {
try {
server = new Server(8080);
ServletContextHandler root = new ServletContextHandler(server, "/ingest", ServletContextHandler.SESSIONS);
root.addServlet(new Servlet(), "/*");
server.start();
client = new Client();
client.setChunkedEncodingSize(16 * 1024);
FileInputStream stream = new FileInputStream(testFile);
try {
client.resource(uri).type(MediaType.APPLICATION_OCTET_STREAM).post(stream);
} catch (Exception e) {
e.printStackTrace();
} finally {
Closeables.closeQuietly(stream);
client.destroy();
}
} catch (Exception e) {
e.printStackTrace();
fail("Unexpected Exception when starting up server.");
}
}
@After
public void shutDown() {
if (output.exists()) {
output.delete();
}
try {
server.stop();
} catch (Exception e) {
e.printStackTrace();
}
}
Vous devez vous connecter pour publier un commentaire.
Les meilleures pratiques dans les scénarios de test est de ne pas coder en dur le port. Qui ne mène qu'à des conflits lors de l'exécution à l'étranger, notamment sur les systèmes CI qui ont encore une charge modérée ou une variété de projets.
dans la Jetée 9 (même idée dans les 6, 7, 8)
Il s'avère que ce que j'avais était en fait de travail, mais en raison de la nature asynchrone de la
server.stop()
, mon nouveau serveur a été de tenter d'instancier avant que la précédente du serveur de l'arrêt de fil avait complètement exécuté.Un simple
Thread.sleep(n)
après laserver.stop()
donne le serveur le temps qu'il faut pour arrêter entre les tests. Malheureusement, le serveur semble prématuré de prétendre qu'il a arrêté de prévenir ainsi une solution exacte par le biais de la vérification de l'état du serveur - mais peut-être il ya quelque chose de sondage sur le serveur; peut-être examiner le pool de threads pourrait fournir un résultat cohérent?En tout cas, comme ce n'est que pour des fins de test, simplement de démarrer le serveur dans le
@BeforeClass
et de l'arrêt dans@AfterClass
empêche tout le serveur à l'arrêt cafouillage, mais méfiez-vous de ensuite, à partir d'un autre serveur sur le même port dans votre suite de tests.server.join()
d'attendre qu'il s'arrête.Ma conjecture est qu'il se faisait un conflit de port. Ce que nous faisons pour nos tests, et étonnamment, le gain de performance n'est pas mauvais. Nous avons commencé par le démarrage d'un serveur unique avant tous les tests que la réponse suggère, mais nous avons dû passer à soutenir le test de mutation. Un inconvénient de s'appuyer sur Maven, c'est que vous avez pour le faire démarrer sur le côté pour exécuter un test unique dans un IDE.
Pour toute personne intéressée, à notre mise en œuvre est ici: embedded-test-jetée. Il exécute plusieurs serveurs à la fois sur des ports différents(pour des tests parallèles), vérifie la disponibilité des ports, prend en charge SSL, etc.
- Je les traiter à l'aide d'un certain nombre de choses. Tout d'abord, après chaque test, assurez-vous que votre serveur est à l'arrêt, et
join()
sur elle. Soit le faire dans@After
ou@AfterClass
en fonction de ce que vous faites.Ensuite, avant chaque test, assurez-vous que le port est disponible. J'utilise l'extrait disponible à Sockets: Découvrez le port de la disponibilité à l'aide de Java
Ensuite, le code d'installation devient
Le petit plus
sleep
à la fin assure que le port est disponible; car il suffit de vérifier qu'il est disponible pourrait rendre le système pas utiliser. Une autre option est de simplement définirSO_REUSEADDR
lorsque vous ouvrez le port après l'avoir vérifiée.Essayer:
alors quelque part, vous dites:
Article utile:
http://www.codeproject.com/Articles/128145/Run-Jetty-Web-Server-Within-Your-Application
Je me rends compte que ce n'est pas directement la réponse à votre question... mais le démarrage et l'arrêt d'un serveur dans
@Before
et@After
méthodes est inefficace lorsque vous avez plus d'un test d'intégration qui nécessite un serveur en cours d'exécution, que le serveur va être redémarré pour chaque test.Vous souhaitez mai à envisager le démarrage et l'arrêt de votre serveur autour de l'ensemble de votre suite de tests. Si vous utilisez Maven pour les versions, vous pouvez le faire avec la combinaison de failsafe et de la Jetée de plugins.