黄瓜与JUnit有何不同?

时间:2014-10-15 11:39:47

标签: junit cucumber

任何人都可以解释CucumberJunit

之间的区别

根据我的理解,它们都用于测试Java代码,虽然我不确定它们有什么区别?

它们只是同一测试套件的不同实现还是旨在测试不同的东西?

3 个答案:

答案 0 :(得分:22)

Cucumber和JUnit是不同的,可以解决不同的问题。

Cucumber是一个行为驱动设计(BDD)框架,它采用"故事"或者用人类可读语言(如英语)编写的场景,并将这些人类可读的文本转换为软件测试。

这是一个例子黄瓜故事:

Example Cucumber Test in plain English

黄瓜将知道如何将此文本转换为软件测试,以确保软件按照描述的方式工作。输出将告诉您故事是否实际上是软件的功能,如果不是,那么会有什么不同:

 failed test

这里修复了代码以使黄瓜测试通过: passed test

这就是所谓的"可执行规范"这是记录软件支持的所有功能的好方法。这与普通文档不同,因为没有相应的测试,阅读文档的人不知道文档是否是最新的。

可执行规范的其他好处:

  • 非程序员可以阅读和理解测试
  • 非程序员可以编写测试,因为他们用简单的英语。

BDD结果和可执行规范非常高。它们涵盖了整体功能,可能还有一些边缘情况作为示例,但不测试每个可能的条件或每个代码路径。 BDD测试也是"集成测试"因为他们会测试你的所有代码模块是如何协同工作的,但是他们并没有彻底地测试所有代码。

这就是JUnit的用武之地。

JUnit是一个较低级别的单元测试"允许开发人员在其代码中测试每个可能的代码路径的工具。您的代码(或类,甚至方法)的每个模块都是独立测试的。它比BDD框架低得多。使用与Cucumber示例相同的计算器故事,JUnit测试将测试许多不同的计算示例和无效输入,以确保程序正确响应并正确计算值。

希望有所帮助

答案 1 :(得分:1)

我认为Cucumber更多地用于集成测试,而JUnit更多地用于行为测试。此外,Cucumber语法比JUnit更准确,但更复杂。在这里你可以看到一个Cucumber测试例子:

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 {
    }
}

你可以看到JUnit更简单,但不一定强大:

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));
  }
} 

希望它有所帮助,

Clemencio Morales Lucas。

答案 2 :(得分:0)

黄瓜可以在其中进行BDD行为驱动开发。像你这样的东西可以将你的功能用例转换成Cucumber的故事。从这个意义上讲,您还可以将Cucumber作为功能用例文档的DSL。

另一方面,JUnit用于单元测试,这将是Java中的一种方法。因此,使用可以进行单元测试(很少)进行进行测试或完整系统测试,这是您的第一个案例Cucumber。单元测试仅为单元测试。