我正在将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"));
}
}
答案 0 :(得分:0)
您显然正在变异一个变量,该变量在两个未重置的测试之间共享。
通常是
我不确定您如何管理服务,但是如果使用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>