在要素文件中使用占位符

时间:2018-03-12 08:36:00

标签: java cucumber-jvm cucumber-java

我想在功能文件中使用占位符,如下所示:

dev

uat等的值取决于执行测试的环境(stageprodMap<String, String>或{{1} })。因此,情景大纲不适用于这种情况。

有没有标准方法可以做到这一点?理想情况下,会有一些维护@Before的内容可以在public class MyStepdefs { @When("^I send GET "(.*)"$) public void performGET(final String url) { // … } } 左右填充,并在Cucumber和Step Definition之间自动运行,这样在步骤定义中不需要代码。

给出以下步骤定义

performGET()

一个适当的设置,当调用${server1}时,String uri中的占位符Map应该已经替换为-des3中的值的查找。

Cucumber-Java有这样的标准方法或功能吗?我不介意这是否涉及依赖注入。如果涉及依赖注入,我更喜欢Spring,因为在我的用例中Spring已经被用于其他原因。

2 个答案:

答案 0 :(得分:2)

简单的答案是你做不到。

您的问题的解决方案是从您的方案中一起删除附带的详细信息,并在步骤定义中访问特定的服务器信息。

  • 服务器和数据库显然属于一体,所以我们将它们描述为单个实体,即服务。
  • 有关其余电话的详细信息并不能真正传达您的意见 实际上在做。功能没有描述实现细节,它们描述了行为。
  • 测试记录是否已插入数据库是另一种不良做法,并且不再描述行为。您应该能够通过获取数据的其他API调用或证明其他服务器已收到信息的其他进程替换它。如果没有这样的方法来提取可用的数据,您应该创建它们。如果无法创建它们,您可能想知道是否需要存储信息(您的服务似乎具有与黑洞相同的属性:))。

我会通过改写故事来解决这个问题:

Feature: Talk to two services
  Scenario: Forward foobar data from Service A  to Service B
    Given "Service A" has key-value information
    When I forward the foobar data from "Service A" to "Service B"
    Then "Service B" has received the key-value information

现在我们有两个实体Service A和Service B,您可以创建一个ServiceInformationService来查找有关Service A和B的信息。您可以将此ServiceInformationService注入到步骤定义中。

因此,当您需要有关服务A的某些信息时,您可以

Service a = serviceInformationService.lookup("A");
String apiHost = a.getApiHost():  
String dbHost = a.getDatabaseHOst():  

在服务的实现中,您查找该服务的属性System.getProperty(serviceName + "_" + apiHostKey),并确保您的CI设置A_APIHOST和A_DBHOST,B_APIHOST,B_DBHOST等。

您可以将集合的名称放在您查找的属性文件中,方法与查找系统属性的方式类似。虽然如果可能,我会避免与数据库直接交互。

答案 1 :(得分:1)

gherkin with qaf支持您要查找的功能。它支持使用${prop.key}使用属性文件中定义的属性。此外,它还提供强大的resource configuration功能,可用于不同的环境。它还支持web-services