Cucumber Java - 如何在下一步中使用从某个步骤返回的字符串?
Cucumber Java - How to use returned String from a step in next step?
我需要自动化一些网络服务,我为此创建了一些方法,我想为此使用 Cucumber,但我不知道如何在下一步中使用返回值。
所以,我有这个功能:
Feature: Create Client and place order
Scenario: Syntax
Given I create client type: "66"
And I create for client: "OUTPUTVALUEfromGiven" an account type "123"
And I create for client: "OUTPUTVALUEfromGiven" an account type "321"
And I want to place order for: "outputvalueFromAnd1"
我有这个步骤:
public class CreateClientSteps {
@Given("^I create client type: \"([^\"]*)\"$")
public static String iCreateClient(String clientType) {
String clientID = "";
System.out.println(clientType);
try {
clientID = util.createClient(clientType);
} catch (IOException e) {
e.printStackTrace();
}
return clientID;
}
@And("^I create for client: \"([^\"]*)\" an account type \"([^\"]*)\"$")
public static String createAccount(String clientID, String accountType) {
String orderID = "";
try {
orderID = util.createAccount(clientID,accountType);
} catch (IOException e) {
e.printStackTrace();
}
return orderID;
}
}
有什么办法一步步使用返回值吗?
谢谢!
在步骤之间共享状态,这是我解释你的问题的方式,不是通过检查返回值来完成的。这是通过在实例变量中设置值,然后在另一步骤中读取该实例变量来完成的。
为了实现这一点,我会改变你的步骤:
public class CreateClientSteps {
private String clientID;
private String orderID;
@Given("^I create client type: \"([^\"]*)\"$")
public void iCreateClient(String clientType) {
System.out.println(clientType);
try {
clientID = util.createClient(clientType);
} catch (IOException e) {
e.printStackTrace();
}
}
@And("^I create for client: \"([^\"]*)\" an account type \"([^\"]*)\"$")
public void createAccount(String clientID, String accountType) {
try {
orderID = util.createAccount(clientID, accountType);
} catch (IOException e) {
e.printStackTrace();
}
}
}
我改变的是
- 共享状态的两个字段 - 其他步骤可以稍后读取值
- 非静态方法 - Cucumber 为每个场景重新创建步骤 class,因此我不希望字段是静态的,因为这意味着它们的值会在场景之间泄漏
这就是您在同一 class 中的步骤之间共享状态的方式。也可以在不同 classes 中的步骤之间共享状态。这有点复杂。问你有没有兴趣
我用其他方式解决了,我知道这是去年的问题,但也许将来有人会发现这个有用。
所以,我创建了一个 'ClientsMap.java' 来存储最后一句话的输出。
例如:
public class ClientsMap {
private static ArrayListMultimap<Integer, String> multimapCardNumber = ArrayListMultimap.create();
...
public static void addCardNumber(String cardNumberValue) {
multimapCardNumber.put(multimapCardNumber.size(), cardNumberValue);
}
public static String returnSpecificCardNumber(int specificCardNumberPosition) {
String returnedCardNumber = multimapCardNumber.get(specificCardNumberPosition - 1).get(0);
return returnedCardNumber;
}
}
然后我创建了一些特定的关键字以用于以下句子:
And I want to make a card transaction with this parameters:
| XXX | 9999 |
| accountNumber | account1-client1 |
| cardNumber | cardNumber1 |
然后我有一个方法可以检查像 'cardNumber' 这样的关键字并像这样检索卡片的位置:
if (paramsList[i].startsWith("cardNumber")) {
String cardNumberPosition = paramsList[i].replaceAll("[^0-9]", "");
paramsList[i] = returnSpecificCardNumber(Integer.valueOf(cardNumberPosition));
}
并且在每个场景之后不要忘记删除地图。
我需要自动化一些网络服务,我为此创建了一些方法,我想为此使用 Cucumber,但我不知道如何在下一步中使用返回值。
所以,我有这个功能:
Feature: Create Client and place order
Scenario: Syntax
Given I create client type: "66"
And I create for client: "OUTPUTVALUEfromGiven" an account type "123"
And I create for client: "OUTPUTVALUEfromGiven" an account type "321"
And I want to place order for: "outputvalueFromAnd1"
我有这个步骤:
public class CreateClientSteps {
@Given("^I create client type: \"([^\"]*)\"$")
public static String iCreateClient(String clientType) {
String clientID = "";
System.out.println(clientType);
try {
clientID = util.createClient(clientType);
} catch (IOException e) {
e.printStackTrace();
}
return clientID;
}
@And("^I create for client: \"([^\"]*)\" an account type \"([^\"]*)\"$")
public static String createAccount(String clientID, String accountType) {
String orderID = "";
try {
orderID = util.createAccount(clientID,accountType);
} catch (IOException e) {
e.printStackTrace();
}
return orderID;
}
}
有什么办法一步步使用返回值吗?
谢谢!
在步骤之间共享状态,这是我解释你的问题的方式,不是通过检查返回值来完成的。这是通过在实例变量中设置值,然后在另一步骤中读取该实例变量来完成的。
为了实现这一点,我会改变你的步骤:
public class CreateClientSteps {
private String clientID;
private String orderID;
@Given("^I create client type: \"([^\"]*)\"$")
public void iCreateClient(String clientType) {
System.out.println(clientType);
try {
clientID = util.createClient(clientType);
} catch (IOException e) {
e.printStackTrace();
}
}
@And("^I create for client: \"([^\"]*)\" an account type \"([^\"]*)\"$")
public void createAccount(String clientID, String accountType) {
try {
orderID = util.createAccount(clientID, accountType);
} catch (IOException e) {
e.printStackTrace();
}
}
}
我改变的是
- 共享状态的两个字段 - 其他步骤可以稍后读取值
- 非静态方法 - Cucumber 为每个场景重新创建步骤 class,因此我不希望字段是静态的,因为这意味着它们的值会在场景之间泄漏
这就是您在同一 class 中的步骤之间共享状态的方式。也可以在不同 classes 中的步骤之间共享状态。这有点复杂。问你有没有兴趣
我用其他方式解决了,我知道这是去年的问题,但也许将来有人会发现这个有用。
所以,我创建了一个 'ClientsMap.java' 来存储最后一句话的输出。 例如:
public class ClientsMap {
private static ArrayListMultimap<Integer, String> multimapCardNumber = ArrayListMultimap.create();
...
public static void addCardNumber(String cardNumberValue) {
multimapCardNumber.put(multimapCardNumber.size(), cardNumberValue);
}
public static String returnSpecificCardNumber(int specificCardNumberPosition) {
String returnedCardNumber = multimapCardNumber.get(specificCardNumberPosition - 1).get(0);
return returnedCardNumber;
}
}
然后我创建了一些特定的关键字以用于以下句子:
And I want to make a card transaction with this parameters:
| XXX | 9999 |
| accountNumber | account1-client1 |
| cardNumber | cardNumber1 |
然后我有一个方法可以检查像 'cardNumber' 这样的关键字并像这样检索卡片的位置:
if (paramsList[i].startsWith("cardNumber")) {
String cardNumberPosition = paramsList[i].replaceAll("[^0-9]", "");
paramsList[i] = returnSpecificCardNumber(Integer.valueOf(cardNumberPosition));
}
并且在每个场景之后不要忘记删除地图。