J'ai un programme d'interface graphique qui exécute des scripts d'automatisation de test. Il est destiné aux utilisateurs de configurer facilement certains paramètres et de lancer le script d'automatisation qu'ils souhaitent.
Une chose que je dois ajouter est la possibilité d'arrêter instantanément le processus de test de course. Quelque chose comme comment en éclipse, le bouton "Terminer" s'arrêtera instantanément tout ce qui est en cours d'exécution. P>
C'est ce que le code qui lance les tests de test semble: P>
ExecutorService executorService = Executors.newFixedThreadPool(10); public void runScript() { executorService.execute(this); } //this method gets called when I click the "stop" button public void stopRun() { executorService.shutdownNow(); } @Override public void run() { //same stuff as from earlier code }
7 Réponses :
SPAWN Un processus JVM enfant à l'aide de ProcessBuilder ou d'exécution et vous pourrez mettre fin à ce processus lorsque l'utilisateur demande que le script s'arrête en cours d'exécution. P>
Enregistrez tous les processus créés et tuez-les lorsque votre programme se termine:
public class ProcessFactory { private static Set<Process> processes = new HashSet<>(); private static boolean isRunning = true; public static synchronized Process createProcess(...) throws ... { if (!isRunning) throw ... ... // create your spawned process processes.add(process); return process; } public static synchronized void killAll() { isRunning = false; for (Process p : processes) p.destroy(); processes.clear(); } public static void registerShutdownHook() { Runtime.getRuntime().addShutdownHook(new Thread() { void run() { killAll(); } }); } }
Vous pouvez utiliser ExecuTertorservice pour lancer l'exécution des tests dans un autre fil. Vous pouvez choisir de disposer de nombreux fils en parallèles ou moins d'un thread pour tous les tests de séquence en choisissant quel service exécuteur dont vous avez besoin. P>
Après cela, lancez l'exécution de tous les tests de la même instance de service exécuteur en appelant la méthode Soumettre (). Vous pouvez arrêter l'exécution de tous les runnables soumis en appelant la méthode shutdownow (). P>
Il est important d'utiliser la même instance d'exécuteurService, sinon vous démarrez chaque test dans un fil différent et vous ne permettez pas de casser la chaîne d'exécution (ou en appelant shutdownow () sur tous). P>
qu'en est-il de cela,
Ajouter un booléen statique volatil et faire ressembler le code de thread ... Vous pouvez ajouter un bouton dans votre interface graphique principale qui définit simplement le runthread code> sur false Donc, le fil se termine presque instantané en laissant tout le code restes intact lorsque vous appuyez sur la touche
Stop CODE>. P>
public class ScriptRunner implements Runnable {
volatile static Boolean runThread = true;
public void runScript() {
Thread testRun = new Thread(this);
testRun.start();
}
public void terminate(){
runThread = false;
}
@Override
public void run() {
//various other things are configured for this,
//but they're not relevant so I left them out
TestNG tng = new TestNG();
//While this runs, various browser windows are open,
//and it could take several minutes for it all to finish
tng.run();
}
}
Que diriez-vous d'un nouveau fil? Vous devez ajouter un thread de fil privé; code> dans l'interface graphique et lorsque vous démarrez
thread = new thread(){
@Override
public void run(){
//start process here
}
};
thread.start();
Dans votre interface graphique quelque part, vous avez quelque chose comme lorsque vous souhaitez arrêter appeler p> modifie le code dans scriptrunner < / p>
Je travaillais récemment sur le cadre exécutant. Ici j'ai répertorié mon problème
http://programTalk.com/java/executetorservice-not-shuting-down/down/ < / a> Soyez prudent si vous faites certaines opérations IO, le service exécuteur peut ne pas arrêter immédiatement. Si vous voyez le code ci-dessous } p> p> stopthread code> est important car il indique à votre programme que le thread a été invité à s'arrêter. Et vous pouvez arrêter une itération ce que vous faites.
Je modifierai votre code comme celui-ci: p>
Système.exit (0); mettra fin à la JVM instantanément
@OluCode Oui, mais cela ne tue-t-il pas aussi ma demande d'interface graphique? J'ai besoin d'un moyen de tuer l'objet de test de course.
Si c'est un thread, utilisez un gestionnaire de threads comme exécutetorservice pour gérer la durée de vie du fil pour vous et appelez ServiceObject.Shutdownow ();
Pourquoi ne pas enregistrer le fil code> Testner code> en dehors de la
exécuter () code> la périmètre et terminez-la d'une autre méthode?
@OluceCode merci, mais cela ne semble pas fonctionner. Le shutdownow (); ne fait que l'arrêt de la chose immédiate que l'objet Testng est en train de faire (par exemple, si l'objet doit exécuter 10 tests chacun dans un navigateur séparé, appeler Shutdownow () n'arrête que 1 test à la fois)
@CeilingGecko qui semble intéressant, pourriez-vous élaborer un peu plus s'il vous plaît?
Où placez-vous le threadmanager?
@Oluce j'ai modifié ma question pour montrer le nouveau code que j'essaie avec le service d'exécution
10 signifie votre 10 threads en cours ... est-ce ce que vous vouliez dire?
Je ne fais que tourner 1 thread (bien que l'objet Testg crée de nombreux threads pendant sa durée de vie). J'ai essayé avec seulement 1 et avec 50 (pour le diable de celui-ci), et le résultat était le même.
Yeah Coz Les 10 vont courir jusqu'à 10 threads à un point à un point basé sur le nombre de threads soumis à l'aide de la méthode de soumission de ExecuTelservice
Si votre classe de test commence à démarrer un autre thread, cela continuera à fonctionner si vous arrêtez votre fil SCRIPTRUNNER.
Juste l'ouvrir dans un nouveau fil;) et pour arrêter le programme tuer le fil