【问题标题】:If then else implementation to chose baseURL in Karate DSLIf then else implementation to select baseURL in Karate DSL
【发布时间】:2019-12-03 17:17:05
【问题描述】:

我对空手道有一点棘手的要求。我的 karate.config 中有一组 baseURL,它们是根据实现选择的。这是它的sn-p:

 if (env == 'qa') {
  config.apiKey = apiKey;
  config.tsp_api = 'https://api.qa.tceu.net';
  config.svt_dcm = 'https://svt.qa.tceu.net';
  config.acn_dcm = 'https://acn.qa.tceu.net';
  config.sos_dcm = 'https://sos.qa.tceu.net';
  config.cust_dcm = 'https://cust.qa.tceu.net';

这里 tsp,svt,acn,sos,cust 是一些动作。

我有一个将动作作为参数传递的功能文件:

# Vehicle Initiates the action
 When def Perform_Report_Notification = call read('./../common/performActionNotification.feature') { action: '#(action)' } 

在调用的 performActionNotification.feature 中,我需要根据传递的操作从 karate.config 文件中获取 url。例如,如果 action 是 sos,那么 url 应该是 sos_dcm。如果 action 是 svt 那么 url 应该是 svt_dcm

这是 performActionNotification.feature 中的 sn-p 以及我目前正在为 sos 做的事情:

Given url sos_dcm
And path '/AU/v1.0/TSP/'+ action
And request RequestPayload
When method post
Then status 200

我想实现类似于 if then else 的东西:

if (action == 'sos') 
then myurl == 'sos_dcm'
else if (action == 'acn')
then myurl == 'acn_dcm'
else if (action == 'svt')
then myurl == 'svt_dcm'

Given url myurl
And...
And...
...

我尝试了一种 hack,它可以工作,但它不是一种干净的方式。我没有从 karate.config 读取 URL,而是以这种方式对其进行硬编码:

Given url 'https://'+act+'.qa.tceu.net'

我尝试的另一件事是

* def myurl = action +'_dcm' #so if action is acn then the variable myurl would be acn_dcm
Given url myurl 
...
....

但这会将 url 硬编码为“acn_dcm”,而不是从 karate.config 中选择定义的 url。

有人可以建议最好的实现方式吗?

【问题讨论】:

  • 老实说,不确定这是否值得。如果您对正在更改的 url 的一部分使用变量,您仍然需要在某处进行设置。

标签: karate


【解决方案1】:

这里有一个提示。 JSON 实际上是一个非常有用的数据结构(想想 hash-map 或字典),您可以在不需要 if 语句的情况下查找值。

* def data =
"""
{
  qa: {
     sos: 'https://sos.qa.tceu.net',
     acn: 'https://acn.qa.tceu.net'  
  }  
}
"""
* def env = 'qa'
* def urls = data[env]
* def action = 'sos'
* def actionUrl = urls[action]
* match actionUrl == 'https://sos.qa.tceu.net'

这应该会让你上路:)

编辑 - 另见:https://stackoverflow.com/a/67868935/143475

【讨论】:

  • 感谢@Peter。有没有办法可以匹配 karate.config 文件中的 actionUrl。原因是我想在配置文件中定义所有端点。如果任何端点发生变化,我想避免改变js文件的特性的情况。除了这些 URL,我们可以有类似的东西: match actionUrl == sos_dcm 并且这个值来自 karate.config?
  • '想要避免 js文件的特性发生变化的情况'修正为'想要避免特性发生变化的情况或者上面的js文件
  • @Mihir 对不起,你失去了我。你能用 Java 或 JS 举例说明你正在尝试什么吗?空手道不能做任何“魔术”。如果你不能用编程语言做你想做的事——很可能你不能用空手道:)
  • @Mihir 请注意 - actionUrl 如果已定义,则很可能来自配置 - 就像全局变量一样。你还需要什么!?
  • 我写了一条评论并删除了它,因为您上面的解释回答了它。谢谢@彼得
【解决方案2】:

我终于使用了彼得最优雅的解决方案,它就像一个魅力!

这是我最终实现的,不需要对端点 URL 进行硬编码,并且由 karate.config 文件中的端点驱动。

  * def data =
        """
        {
        qa: {
                    sos: '#(sos_dcm)', # sos_dcm endpoint defined in karate.config file
                    acn: '#(acn_dcm)',
                    svt: '#(svt_dcm)' 
                }  
        }
        """
        * def env = karate.properties['env']; # Driven by maven commandline arg -Denv=qa as an example
        * def urls = data[env]
        * def action = act  # act comes from the calling feature file and has values - sos/acn/svt
        * def myUrl = urls[action]

        Given url myUrl
        ...
        ...

【讨论】:

    【解决方案3】:

    我建议考虑使用 javascript 作为条件逻辑

    所以 javascript 函数接受一个动作参数,然后 if 和 else 语句返回您需要的 url 的变量。

    在发出请求调用之前执行 javascript 函数。并使用js返回的变量来判断逻辑。

    使那个js文件成为一个通用函数,可以被多个特性文件访问。

    function determineUrl(action) {
      var url = "${urDefaultUrl}";
      if (action == "sos") url == "${full url}";
      else if (action == "acn") url == "${full url}";
      return url;
    }
    

    然后在你的功能文件中

     * def urlDecider = 'classpath to your js function'
     * myUrl = urlDecider(action)
     * url myUrl
     * Given path .... 
    

    【讨论】:

    • 不要再使用你的配置文件了。
    • 谢谢@Jawad。这也是一个不错的解决方案。但是有没有办法我们可以驱动来自 karate.config 的完整 url?上面解释的彼得解决方案的原因也是这样一个事实,即如果端点发生变化,我们需要对我们声明它们的所有文件进行更改。如果它可以单独由 karate.config 文件驱动,这就避免了我们必须维护 url。
    【解决方案4】:

    为了社区学习,我在 Jawad 解决方案的类似行中发现了另一种方法是使用 Java 函数。他们做的事情与 Jawad 的解决方案完全相同,只是它是一个 java 类。如果一个项目有 java 类文件,那么为了保持一致性,也可以使用这个解决方案。

    这是类文件的外观:

    public class DCMUrlDecider {
    
        static String dcmURL="";
        public static String getDCMUrl(String action) {
            if (action.matches("sos")) 
                { 
                dcmURL = "https://sos.qa.tceu.net";
                }
              else if (action.matches("acn")) 
                  {
                  dcmURL = "https://acn.qa.tceu.net";
                  }
              else if (action.matches("svt")) 
                  {
                  dcmURL = "https://svt.qa.tceu.net";
                  }
    
            return dcmURL;
    
        }
    }
    

    这里是功能文件中的相关代码sn-p:

     * def dcmURLDecider = Java.type('com.TCEU.KarateTests.DCMUrlDecider')  
     * def myUrl = dcmURLDecider.getDCMUrl(act)
    
     Given url myUrl
     ....
     .....
    

    这再次意味着我们仍在对 java 类文件中的 URL 进行硬编码。如果可能,需要通过 karate.config 文件学习一种方法。

    【讨论】:

      猜你喜欢
      • 2015-03-24
      • 1970-01-01
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多