使用空手道内置函数和API

时间:2019-06-17 07:27:27

标签: karate

好的,所以我将解释我的情况以及如何使用空手道来实现它。但是我正在寻找一种更好的方法来使我的测试更具可读性,并且还希望使用空手道的api而不是过多的javascript。

方案:我正在测试的api端点有一个过滤器参数,此过滤器参数采用键-值对的json对象。所以我做了以下

  1. 已创建如下的filter-template.js:
function() {
    var filter_params = {
        jobId:null,
        customerIds:[],
        filterValues1:[],
        filterValues2:[], 
    };
    return filter_params;
}
  1. 我在空手道场景中阅读了此模板,由于这是一个模板,因此在运行时我会在此模板中设置值并运行测试。对于键值对,我将使用不同的值,因此每个测试都会设置自己的过滤条件。 这是通过编写将模板作为参数以及过滤条件值(请参见下面的arg函数参数),将传递的条件设置为特定键的值,然后返回json对象的自定义js函数来完成的。下面的代码:
Scenario: Set filter scenario
    * def filter_template = call read('filter-template.js')
    * def filter_vals_list = [1001,1002]
    * def filter_condition = { cnd1: 'foo', cnd2: '#(filter_vals_list)' }
    * def setFilter =
    """
      function(arg) {
        var i;
        var filter = arg.template;
        filter.jobId = arg.condition.cnd1;
        for(i=0;i<arg.condition.cnd2.length;i++)
        {
          filter.filterValues1.add(arg.condition.cnd2.get(i));
        }
        return filter;
      }
    """
    * def getFilter = call setFilter { template: '#(filter_template)', 
      condition: '#(filter_condition)' }

然后我将getFilter作为参数传递给我的api请求。

我希望了解的是:

  1. 设置过滤器时如何摆脱上面的JS循环?
  2. 使用空手道的内置功能,例如karate.map()karate.forEach()来简化测试。
  3. 在可能的情况下,任何更好的方法。

非常感谢您的帮助和指导。

1 个答案:

答案 0 :(得分:0)

据我了解,我在下面简化了您的方案:

* def filter_vals_list = [ 1001, 1002 ]
* def job_id = 'foo'
* def filter_template =
"""
{
  jobId: '#(job_id)',
  customerIds: [],
  filterValues1: '#(filter_vals_list)',
  filterValues2: [], 
}
"""

让我知道我是否错过了任何事情。请引用嵌入的表达式:https://github.com/intuit/karate#embedded-expressions

现在,通过将最后一步更改为以下内容,您可以轻松地为模板使用可重复使用的JSON,是的-嵌入式表达式即使在可重复使用的JSON文件中也可以使用!

* def filter_template = read('filter-template.json')

尝试使用data-driven Scenario Outline后,您可能会得到更好的主意。因此,希望可以弄清楚您是如何使JS不必要地复杂化!您甚至不需要karate.map()等。