Ein paar Fragen zu Unit-Testing

sepan

Grünschnabel
Hallo,

bei den ganzen automatischen xUnit-Tools (junit, nunit, ...) fällt mir eines auf: es sind im Grunde alles nur Mikrotests, die einzelne Methoden in jeweils einer neuen Instanz testen.
Ich habe eigentlich kaum die Möglichkeit, einen komplizierteren Test über mehrere Objekte/Methoden zu fahren, die verkettet sind.

method1 (wenn OK, dann) method2 -> (wenn OK, dann) method3 -> etc...

Frage 1: Wie testet man eigentlich automatisiert komplizierte Vorgänge, die verkettet sind, also ein erfolgreicher Methodenaufruf bewirkt den nächsten Aufruf in der Kette (z.B. Webshop: Seite aufrufen, Waren aussuchen, Checkout, Kundendaten eingeben, Abschicken).

Frage 2 : Wie testet (simuliert?) man am besten nebenläufige Vorgänge (2 oder mehrere Benutzer bearbeiten gleichzeitig mehrere Datensätze)?

Eigentlich wäre das dann ja schon module testing statt unit testing (wenn unit == method als kleinste Einheit einer Klasse). Kennt jemand brauchbare Tools? (Insbesondere Java und .NET)
 
Prinzipiell sind Unittests genau dazu gedacht: die kleinstmögliche Unit (Klasse) zu testen. Nichtsdestotrotz kannst du mit den xUnit Frameworks auch Integrationstests über mehrere Layer hinweg fahren.

Was du scheinbar vorhast sind funktionale Tests bzw. Oberflächentests. Dabei kommt es stark auf den Typ der Anwendung an. Webanwendungen kann man zum Beispiel mit Selenium testen.

Load bzw. Stresstests werden in Java vorallem mit Tools wie JMeter gefahren.

Ergo: es ist wichtig jeder Form des Testings genügend Zeit zu widmen, da jede Art verschiedene Fehler aufdeckt. Gerade Unittests sollte man nicht unterschätzen, da sie zum einen Fehler sehr früh erkennen lassen und zum anderen man durch das Testen auch erst zu nem guten (testbaren) Klassendesign kommt.

Gruß
Ollie
 
Hallo,

Ich habe eigentlich kaum die Möglichkeit, einen komplizierteren Test über mehrere Objekte/Methoden zu fahren, die verkettet sind.
Natürlich kannst du das machen...

Java:
/**
 * 
 */
package de.tutorials;

import org.junit.Test;

import de.tutorials.RetryExample.IBusinessService;
import static org.junit.Assert.*;
/**
 * @author Thomas.Darimont
 *
 */
public class UnitTestingExample {
    @Test
    public void businessService(){
        IBusinessService businessService = new BusinessService();
        BusinessObject businessObject = new BusinessObject();
        //... populate businessObject
        AnotherBusinessObject anotherBusinessObject = businessService.businessOperation(businessObject);
        Assert.someCondition(expectedState,anotherBusinessObject);
        
        YetAnotherBusinessObject yetAnotherBusinessObject = businessService.anotherBusinessOperation(businessObject);
        Assert.someCondition(yetAnotherExpectedState,yetAnotherBusinessObject);
        
        //...
    }
}
Hängt alles von der Art und Weise ab wie du den Unit test spezifizierst... hier sind JUnit / TestNG / NUnit
ausreichend mächtig.


Falls du noch JUnit 3.x verwendest solltest du dir mal JUnit 4.x und TestNG anschauen die bieten
einige sehr hilfreiche Neuerungen.
http://testng.org/doc/
http://www-128.ibm.com/developerworks/java/library/j-junit4.html
http://www.devx.com/Java/Article/31983

Neben Unit tests gibts u.a. noch Akzeptanztests. Das sind Tests welche die Systemfunktionalität
aus Sicht der Anwender überprüfen. Diese sind mehr Highlevel als einfache Unit tests und können
mit entsprechenden Frameworks (z.Bsp. Fitnesse) relativ einfach (auch vom Anwender) spezifiziert werden.

Akzeptanztest Framework Fitnesse:
http://www.fitnesse.org/
http://fitnesse.org/FitNesse.DotNet
http://entwickler.com/itr/online_artikel/psecom,id,787,nodeid,11.html
http://typo3.it-agile.com/fileadmin/docs/Akzeptanztests-FIT.pdf

Webapplications kann man sehr gut mit webtest / Selenium testen:
http://webtest.canoo.com/webtest/manual/WebTestHome.html
http://www.openqa.org/selenium/

Frage 2 : Wie testet (simuliert?) man am besten nebenläufige Vorgänge (2 oder mehrere Benutzer bearbeiten gleichzeitig mehrere Datensätze)?
Auch für dieses (IMHO SEHR schwierige Thema) gibts mittlerweile Unterstützung:
Z.Bsp. via ConTest:
http://www.ibm.com/developerworks/java/library/j-contest.html
..oder: osherove
http://weblogs.asp.net/rosherove/ar...ed-unit-tests-with-osherove-threadtester.aspx

Gruß Tom
 
Zurück