是否可以覆盖在后台或场景中定义的被调用功能文件中的参数?

时间:2019-05-14 06:14:41

标签: java karate reusability

https://github.com/intuit/karate#calling-other-feature-files

上面的链接包含一个调用功能文件以重用代码的示例。重复使用的功能文件通过输入

调用
Background:
* configure headers = read('classpath:my-headers.js')
* def signIn = call read('classpath:my-signin.feature') { username:'john', password: 'secret' }
* def authToken = signIn.authToken

称为my-signin.feature:

Scenario:
    Given url loginUrlBase
    And request { userId: '#(username)', userPass: '#(password)' }
    When method post
    Then status 200
    And def authToken = response
    ...

在此示例中,my-signin.feature必须使用输入的用户名和密码运行。我知道您是否具备以下条件:

Background:
   * def username = "foo"
   * def password = "secret"
在my-signing.feature文件顶部的

,尝试重用功能文件的功能输入的参数将被覆盖。

我的问题是: 如果重用是能够调用其他功能文件的主要目的,那么是否有一种方法可以使调用功能文件覆盖用户名和密码参数(如果它们是在后台定义的)?

在我看来,让背景覆盖输入参数,而不是相反,会使* .feature文件更难重用。我知道我发现我的项目无法重新使用我已经编写的测试而没有将可重用的代码重构到另一个文件中,这让我感到有些沮丧。

1 个答案:

答案 0 :(得分:2)

空手道中的任何被调用功能都将具有一个魔术变量__arg,您可以在被调用脚本中为变量分配值之前进行检查。

Background:
 * def username = (__arg == null) ? "foo" : __arg.username
 * def password = (__arg == null)? "secret" : __arg.password

这将检查传递的值,

  • 如果未通过,则会分配默认值

* def signIn = call read('classpath:my-signin.feature')

  • 如果与参数一起传递,则将分配参数

* def signIn = call read('classpath:my-signin.feature') { username: 'notfoo', password: 'notsecret' }

为简单起见,除此以外,没有其他需要传递的参数。