黄瓜测试用例一起运行时会失败,但是当我单独运行它们时它们会通过

时间:2018-11-28 15:29:21

标签: spring testing gradle intellij-idea cucumber

我正在将Spring与Cucumber(以及IntelliJ和Gradle)一起使用。 我的测试用例一起运行时失败,而单独运行时通过。 (3次中有2次失败,有时它可以工作...)

我也试图隔离有问题的Scenario或Senario组合,但是没有运气... 我尝试引入@After和@Before挂钩来重置帐户值的值... 我什至尝试切换senarios的位置,没有任何帮助...

我真的希望有人可以帮助我解决这个问题

功能:

Feature: Cash Withdrawal
  Scenario: Successful withdrawal from an account in credit
    Given my account has been credited with $100.00
    When I withdraw $20
    Then $20 should be dispensed
    And the balance of my account should be $80.00
  Scenario: Unsuccessful withdrawal due to technical fault
    Given my account is in credit
    But the cash slot has developed a fault
    When I request some of my money
    Then I should see an out-of-order message
    And $0 should be dispensed
    And the balance of my account should be unchanged
  Scenario: Unsuccessful withdrawal due to insufficient ATM funds
    Given my account is in credit
    And the ATM contains $10
    When I withdraw $20
    Then I should see an ask-for-less-money message
    And $0 should be dispensed
    And the balance of my account should be unchanged

还有我的步骤定义:

public class AccountSteps {

    @Autowired
    Account account;

    private Money originalBalance;

    @Given("^my account has been credited with (\\$\\d+\\.\\d+)$")
    public void myAccountHasBeenCreditedWith$(
            @Transform(MoneyConverter.class) Money amount)
            throws Throwable {
        account.credit(amount);
    }

    @Given("^my account is in credit$")
    public void myAccountIsInCredit$() throws Throwable {
        originalBalance = new Money(30, 00);
        account.credit(originalBalance);
    }

    @Then("^the balance of my account should be unchanged$")
    public void theBalanceOfMyAccountShouldBeUnchanged() throws Throwable {

        checkBalanceIs(originalBalance);
    }

    @Then("^the balance of my account should be (\\$\\d+\\.\\d+)$")
    public void theBalanceOfMyAccountShouldBe$(
            @Transform(MoneyConverter.class) Money amount) throws Throwable {

        checkBalanceIs(amount);
    }

    private void checkBalanceIs(Money amount) throws Throwable {
        int timeoutMilliSecs = 3000;
        int pollIntervalMilliSecs = 100;

        while (!account.getBalance().equals(amount) && timeoutMilliSecs > 0) {
            Thread.sleep(pollIntervalMilliSecs);
            timeoutMilliSecs -= pollIntervalMilliSecs;
        }

        Assert.assertEquals(
                "Incorrect account balance -",
                amount,
                account.getBalance());
    }
}

public class CashSlotSteps {

    @Autowired
    TestCashSlot cashSlot;

    @Given("^\\$(\\d+) should be dispensed$")
    public void $ShouldBeDispensed(int dollars) throws Throwable {
        Assert.assertEquals("Incorrect amount dispensed -", dollars,
                cashSlot.getContents());
    }

    @Given("^the cash slot has developed a fault$")
    public void theCashSlotHasDevelopedAFault() throws Throwable {
        cashSlot.injectFault();
    }

    @Given("^the ATM contains \\$(\\d+)$")
    public void theATMContains$(int dollars) throws Throwable {
        cashSlot.load(dollars);
    }
}

public class TellerSteps {

    @Autowired
    private Account account;

    @Autowired
    private AtmUserInterface teller;

    @When("^I withdraw \\$(\\d+)$")
    public void iWithdraw$(int amount) throws Throwable {
        teller.withdrawFrom(account, amount);
    }

    @Given("^I request some of my money$")
    public void iRequestSomeOfMyMoney() {
        int dollarsRequested = 10;
        teller.withdrawFrom(account, dollarsRequested);
    }

    @Then("^I should see an out-of-order message$")
    public void iShouldSeeAnOutOfOrderMessage() throws Throwable {
        Assert.assertTrue(
                "Expected error message not displayed",
                teller.isDisplaying("Out of order"));
    }

    @Then("^I should see an ask-for-less-money message$")
    public void iShouldSeeAnAskForLessMoneyMessage() throws Throwable {
        Assert.assertTrue(
                "Expected error message not displayed",
                teller.isDisplaying("Insufficient ATM funds"));
    }
}

2 个答案:

答案 0 :(得分:0)

您显然正在变异一个变量,该变量在两个未重置的测试之间共享。

通常是

  1. 静态可变变量
  2. 单例服务上的成员变量

我不确定您如何管理服务,但是如果使用spring,则可能需要调查案例2的@DirtiesContext。例如:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={...}) 
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
public class MyTest { ... }

更多信息here

答案 1 :(得分:0)

在这个例子中,我有一些钩子。删除帐户。

public class ResetHooks {
    @Before(order = 1)
    public void reset() {
        System.setProperty("webdriver.gecko.driver","C:\\...\\geckodriver.exe");
        if (!Base.hasConnection()) {
            Base.open(
                    "com.mysql.jdbc.Driver",
                    "jdbc:mysql://localhost/bank",
                    "user", "password");
        }

        Account.deleteAll();

        TransactionQueue.clear();
    }

}

-------------编辑----------

我的春季Cumcumber xml:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:annotation-config/>

    <context:component-scan base-package="hooks, nicebank, support" />

    <bean class="support.AtmUserInterface" scope="cucumber-glue" />
    <bean class="support.TestCashSlot" scope="cucumber-glue" />

    <bean class="support.AccountFactory" factory-method="createTestAccount"
          lazy-init="true" scope="cucumber-glue" />

    <bean class="org.openqa.selenium.support.events.EventFiringWebDriver"
          scope="cucumber-glue" destroy-method="close">
        <constructor-arg>
            <bean class="org.openqa.selenium.firefox.FirefoxDriver"
                  scope="cucumber-glue"/>
        </constructor-arg>
    </bean>
</beans>
相关问题