2014-10-15 15 views
8

Kann jemand den Unterschied zu mir zwischen Cucumber und JunitWie unterscheidet sich Gurke von JUnit?

Von meinem Verständnis erklären sie beide Java verwendet werden, den Code zu testen, obwohl ich den Unterschied nicht sicher bin?

Sind sie einfach unterschiedliche Implementierungen der gleichen Testsuite oder zum Testen verschiedener Dinge?

+1

Was für eine Schande auf die> 3 Downvoters! Dies ist eine absolut gültige Frage für jemanden, der Gurke und Testeinheit neu ist. –

Antwort

16

Gurke und JUnit sind unterschiedlich und lösen verschiedene Dinge.

Cucumber ist ein BDD-Framework (Behavior Driven Design), das "Geschichten" oder Szenarien in menschenlesbaren Sprachen wie Englisch erstellt und diesen lesbaren Text in einen Softwaretest umwandelt.

Hier ist ein Beispiel Gurke Geschichte:

Example Cucumber Test in plain English

Gurke wird dann weiß, wie dieser Text in ein Software-Test, um die Option Software, um sicherzustellen, wie beschrieben funktioniert. Der Ausgang wird Ihnen sagen, ob die Geschichte tatsächlich ist, was die Software tut, und wenn nicht, was anders war:

 failed test

Hier ist, wo der Code festgelegt ist die Gurke Testdurchlauf zu machen: passed test

Dies macht eine so genannte "ausführbare Spezifikation", die eine gute Möglichkeit darstellt, alle Funktionen zu dokumentieren, die von Ihrer Software unterstützt werden. Dies unterscheidet sich von der normalen Dokumentation, denn ohne den entsprechenden Test weiß jemand, der das Dokument liest, nicht, ob die Dokumentation aktuell ist.

Andere Vorteile von Spezifikationen Executable:

  • Nicht-Programmierer können die Tests
  • Nicht-Programmierer kann schreiben die Tests, da sie in einfachem Englisch lesen und verstehen.

BDD Ergebnisse und ausführbare Spezifikationen sind sehr hohes Niveau. Sie decken die allgemeinen Merkmale und vielleicht einige Randfälle als Beispiele ab, aber nicht jede mögliche Bedingung oder jeden Codepfad. BDD-Tests sind auch "Integrationstests", da sie testen, wie alle Ihre Code-Module zusammenarbeiten, aber sie testen nicht alles gründlich. Dies ist

wo JUnit kommt.

JUnit ist ein niedrigeres Niveau "Unit-Test" Werkzeug, mit dem Entwickler alle möglichen Codepfade in ihrem Code zu testen. Jedes Modul Ihres Codes (oder Klassen oder sogar Methoden) wird isoliert getestet. Es ist viel niedriger als ein BDD-Framework. Unter Verwendung derselben Rechnergeschichte wie im Gurken-Beispiel würden JUnit-Tests viele verschiedene Berechnungsbeispiele und ungültige Eingaben testen, um sicherzustellen, dass das Programm korrekt reagiert und die Werte korrekt berechnet.

Hoffe, dass hilft

+1

+1, "BDD-Tests sind auch" Integrationstests ", in denen sie testen, wie alle Ihre Code-Module zusammenarbeiten, aber sie testen nicht alles gründlich", sehr hilfreiche Erklärung –

0

Gurke ist in denen Sie BDD-Verhalten Driven Development tun können. So etwas wie du kannst deinen funktionalen Anwendungsfall in Gurkengeschichte umwandeln. In diesem Sinne können Sie auch Cucumber zu DSL für Functional Use Case Document machen.

JUnit auf der anderen Seite ist für Unit-Tests, die eine Methode in Java wäre. Eine Anwendung kann also ein Unit-Test (selten aber auch) sein, um einen Inigrationstest oder einen vollständigen Systemtest durchzuführen, das ist Ihr erster Fall Gurke. Komponententest ist nur Komponententest.

1

Ich denke, Gurke ist mehr für Integrationstests verwendet, während JUnit mehr in Verhaltenstests verwendet wird. Außerdem ist die Cucumber-Syntax genauer als JUnit, aber viel komplexer. Hier können Sie eine Gurke Testbeispiel siehe:

package com.c0deattack.cucumberjvmtutorial; 

import cucumber.annotation.en.Given; 
import cucumber.annotation.en.Then; 
import cucumber.annotation.en.When; 
import cucumber.runtime.PendingException; 

public class DepositStepDefinitions { 

    @Given("^a User has no money in their account$") 
    public void a_User_has_no_money_in_their_current_account() { 
     User user = new User(); 
     Account account = new Account(); 
     user.setAccount(account); 
    } 

    @When("^£(\\d+) is deposited in to the account$") 
    public void £_is_deposited_in_to_the_account(int arg1) { 
     // Express the Regexp above with the code you wish you had 
     throw new PendingException(); 
    } 

    @Then("^the balance should be £(\\d+)$") 
    public void the_balance_should_be_£(int arg1) { 
     // Express the Regexp above with the code you wish you had 
     throw new PendingException(); 
    } 

    private class User { 
     private Account account; 

     public void setAccount(Account account) { 
      this.account = account; 
     } 
    } 

    private class Account { 
    } 
} 

Sie können sehen, dass JUnit einfacher ist, aber nicht unbedingt weniger leistungsfähig:

import static org.junit.Assert.assertEquals; 

import org.junit.AfterClass; 
import org.junit.BeforeClass; 
import org.junit.Test; 

public class MyClassTest { 

    @Test(expected = IllegalArgumentException.class) 
    public void testExceptionIsThrown() { 
    MyClass tester = new MyClass(); 
    tester.multiply(1000, 5); 
    } 

    @Test 
    public void testMultiply() { 
    MyClass tester = new MyClass(); 
    assertEquals("10 x 5 must be 50", 50, tester.multiply(10, 5)); 
    } 
} 

Hoffe, dass es hilft,

Clemencio Morales Lucas.

Verwandte Themen