Filter anzeigen

All

News

Referenzen

  • #Software
  • #Development
  • #Testing
  • #JavaScript
  • #TDD
  • #Meetup
  • #Netzwerk
  • #JS Meetup
  • #Technologie
  • #ePrivacy
  • #DSVGO
  • #Datenschutz
  • #Digitalisierung
  • #Agil
  • #Apps
  • #Frontend
  • #Web
  • #Backend
  • #Informationsmanagement
  • #Referenzen
  • #Controlling
  • #Excel
  • #Microsoft
  • #Planning
  • #Projektmanagement
  • #Reporting
  • #SharePoint
  • #Prozesse
  • #Individualsoftware
  • #Förderung
  • #SAB
  • #UseCase
  • #Quality
  • #Electron
  • #React
  • #Tiefbau

Integration Tests

September 2019

von Paul Friedemann

#Software #Development #Testing
"Wieso hat da niemand daran gedacht?" So oder so ähnlich könnte die Beschwerde des Projektmanagers klingen, nachdem bei einem Release einer neuen Softwareversion Teile der Anwendungen nicht mehr funktionieren, die eigentlich gar nicht angefasst werden sollten. Die Ursache liegt meist darin, dass die Komponenten einzeln betrachtet zwar funktionieren, ihr Zusammenspiel aber nicht explizit geprüft wurde. Wie Sie solche Probleme verhindern können, lesen sie hier.

Nutzer simulieren oder doch noch nicht

Integration Tests haben einen kritischen Platz im Testplan, da sie einerseits annähernd so schnell sein sollen wie Unit Tests, andererseits jedoch die ersten Schritte zur Nutzersimulation wie bei E2E-Tests darstellen sollen. Doch was genau soll der Integration Test denn testen?

Die Grundlagen zu Integrations Tests

Sollten Unit Tests einzelne Komponenten auf ihre Funktionalität testen und diese somit gewährleisten, geht es bei Integration Tests um die Interaktion von Komponenten. Denn nur weil eine Komponente einzeln funktioniert, ist noch lange nicht klar, ob das Zusammenspiel ebenfalls klappt. Aus dem Unit Test Artikel sollte folgender Code bereits bekannt sein:

//Produktiv-Code
type  OperationType  =  "add"  |  "mult"  |  "div" | "mod";
function  processNumbers(x: number, y: number, operation: OperationType): number {
  switch (operation) {
    case  "add":
      return  x  +  y;
    case  "mult":
      return  x  *  y;
    case  "div":
      return  x  /  y;
    case  "mod":
     return  x  %  y;

  return  0;
}

Mithilfe der Unit Tests konnte die Funktionalität dieser Funktion gewährleistet werden. Eine andere Funktion soll zwei Preise verarbeiten können:

//Produktiv-Code
function handlePrices(price1: string, price2: string): string {
  return processNumbers(price1, price2, 'add');
}

Sollte in diese Funktion jemand Preise der Form "13€", also als String, eingeben, so wird die getestete Funktion processNumbers nicht funktionieren, da sie nicht auf Strings ausgelegt ist. Wenn eine statisch typisierte Sprache TypeScript verwendet wird, wird hier der Compiler bereits Fehler anzeigen, weil processNumbers mit Strings aufgerufen wird. Bei dynamischen Sprachen können solche Art Probleme mit Integration Tests frühzeitig aufgedeckt werden.

Aufbau eines Integration Tests

Integration Tests sind in ihrem Aufbau den Unit Tests sehr ähnlich. Es gibt wieder drei Abschntte: eine Initialisierung, die eigentliche Aktion und die Behauptung:

//Test-Code
describe('Test handlePrices', () => {
  it('should return true for two valid prices', () => {
    const price = '13€';
    const expectedResult = '26€';

    const result = handlePrices(price, price);

    expect(result).toEqual(expectedResult);
  });
});

Würde man den Test mit dem oben geschriebenen Produktiv-Code ausführen, würde dieser fehlschlagen. Daher müssen am Code Änderungen vorgenommen werden, um die gewünschte Funktionalität zu erreichen. Unter der Annahme, dass Preise an letzter Stelle das Eurozeichen haben und davor der Zahlenwert steht, ergibt sich die folgende Funktion:

//Produktiv-Code
function handlePrices(price1: string, price2: string): string {
  const value1 = parseInt(price1.slice(0, -1));
  const value2 = parseInt(price2.slice(0, -1));
  return processNumbers(value1, value2, 'add') + '€';
}

Nach der Überarbeitung wird die Funktion den Test bestehen.

Komplexität von Integration Tests

Das oben aufgeführte Beispiel ist erneut sehr simpel, um den Rahmen dieses Artikels nicht zu sprengen. In größeren Anwendungen können in Integration Tests auch Netzwerkanfragen getestet werden oder die Reaktion einer Komponente auf einen Button-Klick, also deutlich komplexere Strukturen. Wichtig ist es, den Unterschied zwischen Unit und Integration Tests zu kennen. Beim Integration Test muss man sich darauf verlassen können, dass die verwendeten Funktionen das tun, was sie sollen, also in diesem Fall die korrekte Addition zweier Zahlen durch die processNumbers-Funktion. Die Anzahl der Integration Tests sollte im Vergleich zur Anzahl der Unit Tests geringer sein, da nicht für jede einzelne Funktion ein Test geschrieben wird und auch weil Integration Tests deutlich aufwendiger sind. So kann aufgrund von Netzwerkanfragen oder ähnliches die Dauer eines Tests einige Sekunden dauern und dadurch eine Vielzahl solcher Tests auch sehr viel Zeit benötigen. Daher sollten Unit Tests und Integration Tests seperat gehalten werden.

Was kommt nach Integration Tests?

Mit Unit und Integration Tests ist das Projekt bereits sehr gut getestet und kann in vielen Fällen schon einwandfrei funktionieren. Um jedoch die eigentliche Nutzeraktion zu simulieren, gibt es End-To-End-Testing, welches in einem weiteren Artikel besprochen wird.

Sollten Sie Fragen zu Integration Tests oder Testing allgemein haben, dann wenden Sie sich an launch@esveo.com, wir helfen Ihnen gern weiter!

Integration Tests

September 2019

von Paul Friedemann

#Software #Development #Testing

"Wieso hat da niemand daran gedacht?" So oder so ähnlich könnte die Beschwerde des Projektmanagers klingen, nachdem bei einem Release einer neuen Softwareversion Teile der Anwendungen nicht mehr funktionieren, die eigentlich gar nicht angefasst werden sollten. Die Ursache liegt meist darin, dass die Komponenten einzeln betrachtet zwar funktionieren, ihr Zusammenspiel aber nicht explizit geprüft wurde. Wie Sie solche Probleme verhindern können, lesen sie hier.

Nutzer simulieren oder doch noch nicht

Integration Tests haben einen kritischen Platz im Testplan, da sie einerseits annähernd so schnell sein sollen wie Unit Tests, andererseits jedoch die ersten Schritte zur Nutzersimulation wie bei E2E-Tests darstellen sollen. Doch was genau soll der Integration Test denn testen?

Die Grundlagen zu Integrations Tests

Sollten Unit Tests einzelne Komponenten auf ihre Funktionalität testen und diese somit gewährleisten, geht es bei Integration Tests um die Interaktion von Komponenten. Denn nur weil eine Komponente einzeln funktioniert, ist noch lange nicht klar, ob das Zusammenspiel ebenfalls klappt. Aus dem Unit Test Artikel sollte folgender Code bereits bekannt sein:

//Produktiv-Code
type  OperationType  =  "add"  |  "mult"  |  "div" | "mod";
function  processNumbers(x: number, y: number, operation: OperationType): number {
  switch (operation) {
    case  "add":
      return  x  +  y;
    case  "mult":
      return  x  *  y;
    case  "div":
      return  x  /  y;
    case  "mod":
     return  x  %  y;

  return  0;
}

Mithilfe der Unit Tests konnte die Funktionalität dieser Funktion gewährleistet werden. Eine andere Funktion soll zwei Preise verarbeiten können:

//Produktiv-Code
function handlePrices(price1: string, price2: string): string {
  return processNumbers(price1, price2, 'add');
}

Sollte in diese Funktion jemand Preise der Form "13€", also als String, eingeben, so wird die getestete Funktion processNumbers nicht funktionieren, da sie nicht auf Strings ausgelegt ist. Wenn eine statisch typisierte Sprache TypeScript verwendet wird, wird hier der Compiler bereits Fehler anzeigen, weil processNumbers mit Strings aufgerufen wird. Bei dynamischen Sprachen können solche Art Probleme mit Integration Tests frühzeitig aufgedeckt werden.

Aufbau eines Integration Tests

Integration Tests sind in ihrem Aufbau den Unit Tests sehr ähnlich. Es gibt wieder drei Abschntte: eine Initialisierung, die eigentliche Aktion und die Behauptung:

//Test-Code
describe('Test handlePrices', () => {
  it('should return true for two valid prices', () => {
    const price = '13€';
    const expectedResult = '26€';

    const result = handlePrices(price, price);

    expect(result).toEqual(expectedResult);
  });
});

Würde man den Test mit dem oben geschriebenen Produktiv-Code ausführen, würde dieser fehlschlagen. Daher müssen am Code Änderungen vorgenommen werden, um die gewünschte Funktionalität zu erreichen. Unter der Annahme, dass Preise an letzter Stelle das Eurozeichen haben und davor der Zahlenwert steht, ergibt sich die folgende Funktion:

//Produktiv-Code
function handlePrices(price1: string, price2: string): string {
  const value1 = parseInt(price1.slice(0, -1));
  const value2 = parseInt(price2.slice(0, -1));
  return processNumbers(value1, value2, 'add') + '€';
}

Nach der Überarbeitung wird die Funktion den Test bestehen.

Komplexität von Integration Tests

Das oben aufgeführte Beispiel ist erneut sehr simpel, um den Rahmen dieses Artikels nicht zu sprengen. In größeren Anwendungen können in Integration Tests auch Netzwerkanfragen getestet werden oder die Reaktion einer Komponente auf einen Button-Klick, also deutlich komplexere Strukturen. Wichtig ist es, den Unterschied zwischen Unit und Integration Tests zu kennen. Beim Integration Test muss man sich darauf verlassen können, dass die verwendeten Funktionen das tun, was sie sollen, also in diesem Fall die korrekte Addition zweier Zahlen durch die processNumbers-Funktion. Die Anzahl der Integration Tests sollte im Vergleich zur Anzahl der Unit Tests geringer sein, da nicht für jede einzelne Funktion ein Test geschrieben wird und auch weil Integration Tests deutlich aufwendiger sind. So kann aufgrund von Netzwerkanfragen oder ähnliches die Dauer eines Tests einige Sekunden dauern und dadurch eine Vielzahl solcher Tests auch sehr viel Zeit benötigen. Daher sollten Unit Tests und Integration Tests seperat gehalten werden.

Was kommt nach Integration Tests?

Mit Unit und Integration Tests ist das Projekt bereits sehr gut getestet und kann in vielen Fällen schon einwandfrei funktionieren. Um jedoch die eigentliche Nutzeraktion zu simulieren, gibt es End-To-End-Testing, welches in einem weiteren Artikel besprochen wird.

Sollten Sie Fragen zu Integration Tests oder Testing allgemein haben, dann wenden Sie sich an launch@esveo.com, wir helfen Ihnen gern weiter!

Bevorzugte Kontaktaufnahme

esveo wird alle hier bereitgestellten Informationen ausschließlich in Übereinstimmung mit der Datenschutzerklärung verwenden