我对自动化测试和黄瓜也很新颖。我写了一个简单的cucumber-Junit示例,其中包含三个场景。钩@Before和@after在开始时被调用两次
我期待在每个场景开始时调用@Before
,在每个场景之后调用@After
。所以总共只能执行三次,因为有三种情况。
当我跑我的以下步骤定义,首先@Before
被调用,那么@After
,然后再@Before
,则方案1,那么@After
,然后@Before
,然后场景2,然后@After
,然后直接情景3.因此没有在场景3之前和之后分别调用@Before
和@After
。另一方面,它们在执行第一个场景之前被调用两次。任何想法我在这里做错了吗?我的Hook项目中没有任何.rb文件。
我@Before contains
:System.out.println("Setup performed");
和我@After
包含System.out.println("CleanUp Performed");
import cucumber.api.PendingException;
import cucumber.api.java.After;
import cucumber.api.java.Before;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
import cucumber.api.java.en.When;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
public class CalculatorSteps {
private Calculator calculator;
@Before
public void setUp() {
calculator = new Calculator();
System.out.println("Setup Performed...");
}
//Scenario : add two numbers - With regular expression
@Given("^I have a calculator$")
public void i_have_a_calculator() {
assertNotNull(calculator);
}
@When("^I add (\\d+) and (\\d+)$")
public void i_add(int arg1, int arg2) {
calculator.add(arg1, arg2);
}
@Then("^the result should be (\\d+)$")
public void the_result_should_be(int result) {
assertEquals(result, calculator.getResult());
}
//Scenario : Subtract one number from another - With regular expression
@Given("^I have a calculatorr$")
public void i_have_a_calculator1() throws Throwable {
assertNotNull(calculator);
}
@When("^I subtract (\\d+.\\d+) from (\\d+.\\d+)$")
public void i_subtract_from(int arg1, int arg2) {
calculator.subtract(arg1, arg2);
}
@Then("^the result should be (\\d+.\\d+)$")
public void the_result_should_be1(double result1) {
assertEquals(result1, calculator.getresult1(), 0.5);
}
@After
public void cleanUp() {
System.out.println("CleanUp Performed...");
}
}
特性文件看起来像:
Feature: Calculator
I use Calculator instead of calculating myself
#Scenario: Add two numbers
#Given I have a calculator
#When I add 2 and 3
#Then the result should be 5
@smokeTest
Scenario Outline: Add two numbers
Given I have a calculator
When I add <num1> and <num2>
Then the result should be <ans>
Examples:
| num1 | num2 | ans |
| 2 | 3 | 5 |
| 4 | 5 | 9 |
@regressionTest
Scenario: Subtract one number from another
Given I have a calculator
When I subtract 2.5 from 7.5
Then the result should be 5.0
输出的样子:
Feature: Calculator
I use Calculator instead of calculating myself
Setup Performed...
CleanUp Performed...
Setup Performed...
Scenario Outline: Add two numbers # src/test/java/cucumber/junit/maven/cucumber_jvm/maven/calculatorFeature.feature:19
Given I have a calculator # CalculatorSteps.i_have_a_calculator()
When I add 2 and 3 # CalculatorSteps.i_add(int,int)
Then the result should be 5 # CalculatorSteps.the_result_should_be(int)
CleanUp Performed...
Setup Performed...
Scenario Outline: Add two numbers # src/test/java/cucumber/junit/maven/cucumber_jvm/maven/calculatorFeature.feature:20
Given I have a calculator # CalculatorSteps.i_have_a_calculator()
When I add 4 and 5 # CalculatorSteps.i_add(int,int)
Then the result should be 9 # CalculatorSteps.the_result_should_be(int)
CleanUp Performed...
#@regressionTest
Scenario: Subtract one number from another # src/test/java/cucumber/junit/maven/cucumber_jvm/maven/calculatorFeature.feature:23
Given I have a calculator # CalculatorSteps.i_have_a_calculator()
When I subtract 2.5 from 7.5 # CalculatorSteps.i_subtract_from(int,int)
Then the result should be 5.0 # CalculatorSteps.the_result_should_be1(double)
3 Scenarios (3 passed)
9 Steps (9 passed)
0m0,074s
尝试过counter
后和@DaveyDaveDave代码,输出如下所示:开始时打印的计数器行不在正确的位置,但至少可以正确执行。但是我仍然想知道为什么在最后的减法情况下它不执行@Before
,@Given
和@After
。
Feature: Calculator
I use Calculator instead of calculating myself
@Before Count is: 0
@Given Count is: 1
@After Count is: 2
@Before Count is: 3
@smokeTest
Scenario Outline: Add two numbers # src/test/java/cucumber/junit/maven/cucumber_jvm/maven/calculatorFeature.feature:19
Given I have a calculator # CalculatorSteps.i_have_a_calculator()
When I add 2 and 3 # CalculatorSteps.i_add(int,int)
Then the result should be 5 # CalculatorSteps.the_result_should_be(int)
@Given Count is: 4
@After Count is: 5
@Before Count is: 6
@smokeTest
Scenario Outline: Add two numbers # src/test/java/cucumber/junit/maven/cucumber_jvm/maven/calculatorFeature.feature:20
Given I have a calculator # CalculatorSteps.i_have_a_calculator()
When I add 4 and 5 # CalculatorSteps.i_add(int,int)
Then the result should be 9 # CalculatorSteps.the_result_should_be(int)
@After Count is: 7
@regressionTest
Scenario: Subtract one number from another # src/test/java/cucumber/junit/maven/cucumber_jvm/maven/calculatorFeature.feature:23
#Given I have a calculator
When I subtract 2.5 from 7.5 # CalculatorSteps.i_subtract_from(int,int)
Then the result should be 5.0 # CalculatorSteps.the_result_should_be1(double)
3 Scenarios (3 passed)
8 Steps (8 passed)
0m0,072s
您确定这些方法实际上是以错误的顺序执行,还是只是记录按错误的顺序写入?我猜猜Cucumber的输出是通过一个适当的记录器来完成的,它可能会做一些缓冲,而且只有在记录发生后的某个时间点,实际上打印到控制台上,你的'@ Before'和'@ After'方法是直接写入标准输出,这将立即发生。 – DaveyDaveDave
不要以为你需要第二个'@Given(“^我有一个calculatorr $”)''。尝试从步骤文件中删除该文件。 –
@DaveyDaveDave实际上好的指针!我没有直接在我的钩子中使用System.out.println,而是在主Calculator类中编写了方法。这样可以避免在开始前后两次显示但前后两次分别在第三个场景(@regressionTest)之前和之后执行。然而,在我的Runner类中,我已经指定了两个标签。 format = {“pretty”,“html:target/cucumber”},tags = {“@ smokeTest,@ regressionTest”} – Ragini