intel j idea cucumber java搭建教程

Cucumber 是一个能够理解用普通语言 描述的测试用例的支持行为驱动开发(BDD)的自动化测试工具,用Ruby编写,支持Java和.Net等多种开发语言。

cucumber是非常重要的,那么如何在java中正确使用cucumber呢? inteljidea是一款非常棒的java编辑器,那么在idea中如何搭建cucumber环境呢?

首先,最新版本的intelj idea是支持cucumber的,官方的教学文档地址为:https://www.jetbrains.com/help/idea/2016.1/cucumber.html?origin=old_help

首先需要新建一个maven工程,我在新建的时候最初建立的是webapp。但是在添加cucumber的时候出现了问题,因为目录结构不正确。后来索性就直接建立了一个普通的maven工程。注意要有src main目录和 test目录。以下是我的目录结构;

idea 安装 TypeScript Vue idea如何安装cucumber插件_java

注意,setp_definations需要放在test/java下的一个子目录下边,feature文件放在resourse下边。这样,intelj就能够认出feature文件,并且能把feature和step_defination文件相关联起来。

maven中需要加入cucumber的相关jar包,以下为基本所需要的一些jar包:

<dependencies>
        <dependency>
            <groupId>info.cukes</groupId>
            <artifactId>cucumber-java</artifactId>
            <scope>test</scope>
            <version>1.2.4</version>
        </dependency>
        <dependency>
            <groupId>info.cukes</groupId>
            <artifactId>cucumber-jvm</artifactId>
            <version>1.2.4</version>
            <type>pom</type>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

junit为非必需,但是在判断案例是否运行成功的时候最好使用junit来进行判断一下。

接下来新建feature文件。在新建完feature文件之后,直接右击鼠标,应该是会出现以下 几个菜单,

idea 安装 TypeScript Vue idea如何安装cucumber插件_ide_02

点击create,即会自动建立一个运行的server(只针对这个feature)。

在feature文件中输入内容,如下:

Feature: Mernagria

  Scenario: registe new pet
    Given I am on the "new pet" page
    And I click the "registe" button
    Then I should go to the "register" page

这个时候,直接运行这个server会出现以下问题,undefined step

idea 安装 TypeScript Vue idea如何安装cucumber插件_maven_03

提示我们需要建立step_defination了。

这个时候可以使用cucumber的工具,直接建立相关的step_defination,光标指在某一行,然后点击alt+enter键(代码提示键),则会提示以下内容:

idea 安装 TypeScript Vue idea如何安装cucumber插件_java_04

之后则可以直接

idea 安装 TypeScript Vue idea如何安装cucumber插件_ide_05

建立新文件,如果你以前建立过java类,但是在这个时候看不到以前的类,不用多想了,肯定是你的工程环境出现问题了。在新建完java类之后,截图如下:

idea 安装 TypeScript Vue idea如何安装cucumber插件_cucumber_06

重新运行一下程序,这个时候如果仍然出现上边这种情况,即unddfined step

idea 安装 TypeScript Vue idea如何安装cucumber插件_maven_03

这个情况证明我们的工程是有问题的,问题在哪里呢?

点击右上角的server,点击edit configrations

idea 安装 TypeScript Vue idea如何安装cucumber插件_ide_08

这个时候,底部有提示,glue目录需要填写相应的信息,但是我们点击后边的。。。之后发现依然是空白的,这里究竟应该填什么呢?

这里应该直接填入step_defination的目录,即你新建的java类存放的目录,我这里放在了com.cucumber 目录下,所以我直接写的是com/cucumber,程序就能够正常运行了。

正常运行截图如下

idea 安装 TypeScript Vue idea如何安装cucumber插件_java_09

之后一步一步更改step_definatio文件,直到全部finish。 以下贡献两个自己写的案例,

  1. 这个是运行一个案例的。
Feature: Adding Test

  Scenario: Test Add
    Given i input "2" and "2"
    When the calculator is run
    Then the out put should be "4"
  1. 这个是同时运行多个案例的
Feature: AddMuilty

  Scenario Outline: test multy
    Given i input "<input1>" and "<input2>"
    When the calculator is run
    Then the out put should be "<result>"
    Examples:
      | input1 | input2 | result |
      | 2      | 3      | 5      |
      | 2      | 4      | 6      |
      | 3      | 3      | 6      |
  1. 这个是我写的step_defination文件
/**
 * Created by Scott on 16/5/11.
 */
public class Add {

    Calculator calculator;


    @Given("^i input \"([^\"]*)\" and \"([^\"]*)\"$")
    public void iInputAnd(String arg0, String arg1) throws Throwable {
        // Write code here that turns the phrase above into concrete actions
        calculator = new Calculator();
        calculator.setNum1(Integer.parseInt(arg0));
        calculator.setNum2(Integer.parseInt(arg1));

    }

    @When("^the calculator is run$")
    public void theCalculatorIsRun() throws Throwable {
        // Write code here that turns the phrase above into concrete actions
        calculator.calculate();
    }

    @Then("^the out put should be \"([^\"]*)\"$")
    public void theOutPutShouldBe(String arg0) throws Throwable {
        // Write code here that turns the phrase above into concrete actions
        assertEquals(Integer.parseInt(arg0),calculator.getTotle());
    }


}
  1. 这是我写的类文件
public class Calculator {

    private int num1;
    private int num2;
    private int totle;

    public int getNum1() {
        return num1;
    }

    public void setNum1(int num1) {
        this.num1 = num1;
    }

    public int getNum2() {
        return num2;
    }

    public void setNum2(int num2) {
        this.num2 = num2;
    }

    public int getTotle() {
        return num1 + num2;
    }

    public void calculate(){
        totle = num1 + num2;
    }
}