我将为我的RESTful API构建e2e测试,并为此使用Cucumber
。
我还将使用cucumber-spring
在StepDef之间共享状态。
让我们假设RESTful API与动物园有关。以下是一些情况。
好的,到目前为止很容易。但是,如果:
客户购买了另一张票。如果我使用与第一个票证相同的定义,则它将重复使用相同的状态变量,并且第一个票证将不再可用。如果我创建另一个定义,我将有重复的代码,这将使情况变得混乱。
另一个客户注册并购买了票,因此我想确保动物园不拥挤。与上述相同的问题-应该使用什么定义以及什么状态变量?
答案 0 :(得分:1)
NoraUi框架使这成为了单例类生活(https://github.com/NoraUi/NoraUi/blob/master/src/main/java/com/github/noraui/utils/Context.java)。
您可以使用此机制在上下文中存储变量。这样就可以根据每种情况(或example
的情况下,每种Scenario Outline
)来重置上下文。
public static void saveValue(String key, String value) {
getInstance().scenarioRegistry.put(key, value);
}
public static String getValue(String key) {
return getInstance().scenarioRegistry.get(key);
}
在您的黄瓜代码中,您可以用来写:
Context.saveValue(targetKey, targetStringValue);
在您的黄瓜代码中,您可以阅读:
String value = Context.getValue(textOrKey) != null ? Context.getValue(textOrKey) : textOrKey;
答案 1 :(得分:1)
简单的解决方案是不要尝试过多地使用步骤定义。人们使用Cucumber犯的最大错误之一是尝试通过步骤定义获得大量重用。只要您的步骤定义共享辅助方法,实际上有多少步骤定义就根本不重要。
下面是红宝石,但我确定您可以翻译
When 'I buy a ticket' do
@ticket = buy_ticket
end
When 'I buy a second ticket' do
@second_ticket = buy_ticket
end
When 'I buy a discounted ticket' do
@discount_ticket = buy_ticket
end
When 'I buy a family ticket' do
@family_ticket = buy_ticket
end
现在您的其余情况都可以讨论second_ticket或family_ticket。
注意:这里没有重复,所有步骤都调用相同的方法来创建票证(您可以使用参数来处理,并且可能需要支持额外的buy_ticket复杂性)。