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目录。以下是我的目录结构;
注意,setp_definations需要放在test/java下的一个子目录下边,feature文件放在resourse下边。这样,intelj就能够认出feature文件,并且能把feature和step_defination文件相关联起来。
maven中需要加入cucumber的相关jar包,以下为基本所需要的一些jar包:
<dependencies>
<dependency>
<groupId>info.cukesgroupId>
<artifactId>cucumber-javaartifactId>
<scope>testscope>
<version>1.2.4version>
dependency>
<dependency>
<groupId>info.cukesgroupId>
<artifactId>cucumber-jvmartifactId>
<version>1.2.4version>
<type>pomtype>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
dependency>
dependencies>
junit为非必需,但是在判断案例是否运行成功的时候最好使用junit来进行判断一下。
接下来新建feature文件。在新建完feature文件之后,直接右击鼠标,应该是会出现以下 几个菜单,
点击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
提示我们需要建立step_defination了。
这个时候可以使用cucumber的工具,直接建立相关的step_defination,光标指在某一行,然后点击alt+enter键(代码提示键),则会提示以下内容:
之后则可以直接
建立新文件,如果你以前建立过java类,但是在这个时候看不到以前的类,不用多想了,肯定是你的工程环境出现问题了。
在新建完java类之后,截图如下:
重新运行一下程序,这个时候如果仍然出现上边这种情况,即unddfined step
这个情况证明我们的工程是有问题的,问题在哪里呢?
点击右上角的server,点击edit configrations
这个时候,底部有提示,glue目录需要填写相应的信息,但是我们点击后边的。。。之后发现依然是空白的,这里究竟应该填什么呢?
这里应该直接填入step_defination的目录,即你新建的java类存放的目录,我这里放在了com.cucumber 目录下,所以我直接写的是com/cucumber,程序就能够正常运行了。
正常运行截图如下
之后一步一步更改step_definatio文件,直到全部finish。
以下贡献两个自己写的案例,
Feature: Adding Test
Scenario: Test Add
Given i input "2" and "2"
When the calculator is run
Then the out put should be "4"
Feature: AddMuilty
Scenario Outline: test multy
Given i input "" and ""
When the calculator is run
Then the out put should be ""
Examples:
| input1 | input2 | result |
| 2 | 3 | 5 |
| 2 | 4 | 6 |
| 3 | 3 | 6 |
/**
* 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());
}
}
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;
}
}