Testen von nebenläufigen Anwendungen

JennyB

Grünschnabel
Hallo,

ich bin gerade dabei Tests für nebenläufige Anwendungen zu schreiben. Und habe natürlich schon bei Google gesucht. Hat denn jemand schon mit MultithreadedTC Tests geschrieben? Ich habe mir dazu jetzt ein bisschen was angesehen, aber richtig schlau werde ich daraus leider nicht.
Wenn ich eine Klasse habe in der ich zwei Threads starte, wie kann ich die dann testen?

Quasi sieht der Code so aus:

Code:
 final Runnable runnableA = new Runnable() {
            public void run() {
                for (int i = 0; i < number; i++) {
                    classX.calc(i);
                }
            }
        };

        final Runnable runnableB = new Runnable() {
            public void run() {
                for (int i = 0; i < number; i++) {
                    classY.calc(i);
                }
            }
        };


        final Thread thread1 = new Thread(runnableA);
        final Thread thread2 = new Thread(runnableB);
     
        thread1.start();
        thread2.start();
     
        try {
            thread1.join();
            thread2.join();
        } catch (final InterruptedException e) {
            // TODO add Logger
            e.getMessage();
        }

Gibt es noch andere Möglichkeiten nebenläufige Anwendungen zu testen, eventuell sogar testgetrieben zu entwickeln?

LG Jenny
 
Hallo,

multithreaded Code auf Korrektheit zu testen, ist IMHO sehr sehr schwer. Insbesondere Deadlocks und Race Conditions sind sehr stark vom Timing bzw. von der Ausführungsreihenfolge des Threads abhängig was es schwer macht Fehler zu Produzieren und richtige Testszenarien aufzubauen.

schau mal hier:
ConcurrentTesting - Advanced Testing for Multi-Threaded Applications:
http://www.alphaworks.ibm.com/tech/contest

Testing Multithreaded Java Code
http://www.artima.com/lejava/articles/javaone_2008_andy_chou.html

http://www.theserverside.com/tt/articles/article.tss?l=TestingConcurrent

multithreadedtc
A framework for testing concurrent Java applications
http://code.google.com/p/multithreadedtc/

Gruß Tom
 
Hallo Tom,

erstmal danke für die Links, diese hatte ich mir bereits angesehen. Ich weiß das es nicht leicht ist solche Anwendungen zu testen, aber irgendwie muss es ja gehen.

Kennst du dich vielleicht mit dem Interface Callable aus? Damit kann man Werte und Exceptions zurück bekommen. Wie kann ich da prüfen, ob ein Thread beendet ist?

Wenn der Code zum Beispiel so aussieht:
Code:
public class MyCallable implements Callable {

    public Integer call() throws Exception {
        // some functions

        return 1;
    }

    public static void main(final String[] args) {
        final ExecutorService executor = Executors.newFixedThreadPool(3);
        executor.submit(new MyCallable());
        executor.shutdown();
    }
}

Wie kann ich dann, in einer anderen Klasse, prüfen ob die Ausführung beendet wurde?
 
Zurück