在Cucumber中存储REST API响应的最佳方法是什么

时间:2019-01-07 07:48:27

标签: java spring rest cucumber e2e-testing

我将为我的RESTful API构建e2e测试,并为此使用Cucumber。 我还将使用cucumber-spring在StepDef之间共享状态。

让我们假设RESTful API与动物园有关。以下是一些情况。

  • 客户使用登录名/密码在动物园站点中注册。我需要在该州存储客户ID。另外,我还需要存储完整的http响应进行注册,因为我希望能够检查客户是否提供了太弱的密码,该http响应是否包含正确的http状态代码。
  • 客户向动物园购买了股票行情。出于相同的原因,我还需要存储票证ID和响应。

好的,到目前为止很容易。但是,如果:

  • 客户购买了另一张票。如果我使用与第一个票证相同的定义,则它将重复使用相同的状态变量,并且第一个票证将不再可用。如果我创建另一个定义,我将有重复的代码,这将使情况变得混乱。

  • 另一个客户注册并购买了票,因此我想确保动物园不拥挤。与上述相同的问题-应该使用什么定义以及什么状态变量?

2 个答案:

答案 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复杂性)。