有没有办法让空手道在执行到日志中时自动打印每个场景的名称?我们有一个相当大的套件,可以在Jenkins pipeline console输出中生成~25MB的日志数据,有时尝试将com.intuit.karate记录错误的行与运行结束时的故障摘要相匹配会有点棘手。最有可能获得场景名称并print()它,但这将意味着向数百个我希望避免的场景添加代码。作为空手道修复的一部分,将记录场景名称(如果不是空的话)以及任何故障跟踪
带有此修复程序的beta版可用0.6.1.2如果您可以尝试并确认,那就太好了
com.jayway.jsonpath.PathNotFoundException:应查找对象
在路径$['teams'][0]['teamMembers']中使用属性['length'],但是
找到“net.minidev.json.JSONArray”。
这不是json对象
根据JsonProvider的说法:
'com.jayway.jsonpath.spi.json.JsonSmartJsonProvider'
打印响应。团队[0]。团队成员。长度和
assert response.t
给出以下步骤列表
Given path 'verify'
And header x-api-key = apiKey
And header tenant-id = tenantId
And request a_json_object_with_invalid_user_id_to_verify
When method put
Then status 404
当端点返回HTTP 200(这是一个我需要修复的错误)但带有无效的json响应时,例如
{
"score" :
}
将引发此异常
如果我的问题没有道理,请原谅
我试图做的是为查询参数注入值
GET1 File
Scenario:
Given path 'search'
And param filter[id] = id (default value or variable from another feature file)
POST1 File
Scenario:
def newid = new id made by a post call
def checkid = read call(GET1) {id : ne
如何匹配具有不传递NULL的空字段(“”)的响应,如果我在匹配每个响应时尝试#notnull,脚本将获得传递。但是我在响应中看到很少有空字段如果您的服务器返回空格,但您希望将其验证为null,则说明您或服务器是错误的
这就是说,你可以很容易地用空手道验证你想要的任何东西:
* def isBlank = function(s){ return s ? ('' + s).trim() === '' : true }
* def foo = { bar: ' ' }
* match foo == {
下面是我使用的场景大纲。在第一行和第二行中,display_name为空,但仍在我的请求负载中发送display_name
Scenario Outline: Negative cases
Given path '/api/check'
And request {name: <name> , description: <description> , display_name: <display_name>}
When method POST
今天我遇到了一个场景,其中有一个POST方法调用,但不需要请求数据,查询参数就足够了。但在空手道框架中,当使用POST方法时,必须提供请求数据。所以我必须显式地将请求提供为“null”。在空手道中,如果没有请求数据,您是否可以跳过以“null”形式提供请求数据。如果没有请求正文,我通常会这样做:
给定路径“/path/to//action”
和请求“”
当方法发布时
然后状态200
(没有找到跳过请求步骤的方法)我尝试了以下方法:
Given url 'url'
And params param
对于我的测试用例,我需要从json文件和另一个特性文件(它反过来包含DB连接并从DB返回数据)中注入数据。如果json文件中提到数据为“null”,那么代码应该调用DB.feature文件并返回数据。如果这些是在json文件中填充的数据,那么代码应该选择该数据并忽略DB.feature调用
为此,这里有一个示例Test.json文件,我从中获取数据
{
"data": [
{"service": null}
]
}
下面是有条件的示例代码
* json data = call
我需要在json中声明一个数组元素,其中数组名中有空格
示例json:
{
"integration": {
"message": {
"code": 0,
"description": "Success"
},
"serviceData": {
"TenantID": "1909627861",
"Company Name": "anupamaCompany",
"Sub Domain":
我的要求是,我想把第一个特征文件的响应作为输入传递给第二个特征文件。第一个特性文件响应是一个json列表,因此期望为json列表的每个值调用第二个特性文件
Feature:
Scenario: identify the reference account
* def initTestData = read('../inputData.feature')
* def accountData = $initTestData.response
我从Post请求中得到一个JSON响应
{
"access_token": ".u9H5YgCCoMJHTW6SgVMxJe2aUEGHpMBbUf1456Gkj28",
"token_type": "bearer",
"expires_in": "4319",
"scope": "READ "
}
我想获取这个访问令牌并将其传递到另一个GET API请求中,如下所示
And header Authorization = token
我做了什么?
首次发布ap
我在控制器中有一个文件上载端点(/document),定义如下:
@RestController
public class FileUploadController {
@Autowired
private PersonCSVReaderService personCSVReaderService;
@PostMapping(value = "/document", consumes= {MediaType.MULTIPART_FORM_DATA_VALUE})
我们在CI流程中使用docker。我想在chrome的docker容器中启动RemoteWebDriver。是否可以使用空手道框架执行此操作?目前没有内置支持,但您可以尝试使用以下说明:
编辑:这在0.9.5中受支持
文档:我拉了你的开发分支并在本地构建。我正在尝试运行UI功能demo-01.feature,但由于某些原因,我的getting runner异常如下所示。我指的是mvn 0.9.5.RC1***运行程序异常堆栈跟踪***java.nio.file.InvalidPathExcept
在过去的6个月里,我一直在使用空手道,它提供的功能给我留下了深刻的印象。
我知道空手道是用来单独测试API的,但我们也在尝试将其用于E2E测试,包括一步一步地调用多个场景。
我们的功能文件如下所示
1.通话功能1:情景1
2.通话功能2:场景2
.....
注意:我们正在为API测试和E2E测试重新使用场景。有时我发现很难记住所有的功能文件。
我们能否像java一样链接场景调用,我怀疑功能文件是否允许我们这样做。我们需要你的宝贵建议。如果您认为我们的方法不正确,请告知我们
首先,我想引用文档:
我使用空手道验证来自两个Webmethods的xml响应。我们有一个旧的webmethod,它直接命中数据源。我们在该数据源之上添加了一个层,使用Webmethod和数据库返回相同的数据。期望是旧的webmethod和新的webmethod将返回相同的数据。我一直关注的是响应以不同的格式显示,一种是JSON,另一种是XML
My feature file setup.
Feature: Campare
Background:
* configure ssl = true
标签: Karate
service-virtualization
服务虚拟化是个新手,但在我研究的时候,我注意到空手道也对它有一些支持。由于我已经在使用它,我很好奇它是否能满足需要。我正试图用一些重试逻辑测试调用另一个API B的API A。请求没有更改,但B可能会发送一个带有错误消息或成功消息的响应正文。其目的是重试x次,直到我们看到失败的成功。所以,问题是我如何在这个测试中模拟B的响应?当然,A提出的请求将保持不变。空手道可以轻松做到这一点。您可以在模拟中设置一个“全局”变量,该变量将记录调用的次数。其余的是“普通”空手道
你应该看看这些文件。如果需要,可
我有一个websocket响应,如下所示
a["{\"type\":\"1ffe4b5d___AC_GET_MY_AVAILABLE_TASKS___N\"}"]
有谁能告诉我如何解析它吗?完全由您决定,如果需要,可以使用字符串操纵或使用自定义Java代码,我只能给您一个提示:
* def response = 'a["{\"type\":\"1ffe4b5d___AC_GET_MY_AVAIL
我有一个数组
[{"Id": "123"},{"Id": "1239"},{"Id": "1233"},{"Id": "1235"}]
我想验证另一个数组
[{"Id": "123"},{"Id": "1239"},{"Id": &quo
如何在空手道配置文件中引用竹子构建计划变量?我所有空手道测试都有一个竹制的计划。我需要能够在karate.config文件中引用bambol变量,以便在Bambol构建中运行空手道测试
我试过这样的方法:
config.branchSource=karate.properties['branch.source']
其中“branch.source”是我在运行时输入的竹构建计划变量(运行自定义),没有运气
我希望在运行时传递一个变量,我用竹子输入这个变量,空手道测试将在该变量中进行适当的拾取和使用
我得到的回答是:
{
"by_group": [
{
"key": "2021-03-17T00:00:00.000+08:00",
"by_state": [
{
"key": "STATE1",
我已经创建了我的第一个功能,它运行得非常棒。然而,我并没有在我的目标文件夹中看到下面的html报告。你能帮我一下吗。https://github.com/intuit/karate/blob/master/karate-demo/src/test/resources/karate-maven-cucumber-reporting.png假设您正在查找cucumber报告
@CucumberOptions(features = {"src/test/java/features"},glue={"s
在背景:中设置路径后,是否有方法覆盖路径
我有很多测试(边界值),它们基本上只随我测试它们的函数而变化。因此,我可以在Background中设置path,这很好。
但有时,我需要链接几个调用,因此也需要path变量
如果我这样做
Given path 'Client/GetClient'
...
Given path 'GetServices'
...
每次调用path都会正确覆盖路径,但如果我这样做
Background:
* path 'Client/GetClient'
...
Gi
我试图使用json模板验证响应结构和响应值。我可以使用正则表达式验证可能具有不同预定义值的键。但无法通过在模板中提供正则表达式来验证日期时间
例如:
待验证的API响应:
t1 = {
"key1": "ABC",
"DateTime" : "2018-01-30T14:00:00+00:00"
}
验证模板:
t2 = {
"key1": "#regex(ABC|PQR|XYZ|AAA)$",,
"DateTime" : "#regex \d{4}-(?:0[1-9]|1[0
我试图验证一个Xml响应,其中一个父元素有多个子元素,这些子元素具有相同的标记,但文本内容不同,如下所示:
Scenario: test
Given def expectation = <parent><child>1</child><child>2</child</parent>
And def reality = <parent><child>2</child>
我的一个任务的输出是['a','b','c']
现在我必须在DB查询中使用这些值
* def queryToGetHotelIdForAvailableCsId = "select id from hotels_hotel where cs_id in ('a','b','c');"
在空手道中如何做到这一点?使用Java助手可能会更好,但您可以这样做:
* def json = ['a', 'b', 'c']
* def fun =
"""
function(array) {
var
我已经完美地运行了基于空手道的模拟API服务器。当场景匹配时,我还希望执行一些自定义Java代码
使用jar执行模拟,如下所示
java -jar karate-0.9.0.jar -m ./src/test/java/Mymock.feature -p 9000
Mymock.feature有如下内容
Scenario: pathMatches('/')
* def Signature = Java.type('Signature')
* def sign = Sign
响应={“startDateTime”:“2018-10-25T00:00:00Z”,
“endDateTime”:“2019-10-25T00:00:00Z”}
我如何验证此操作的日期和时间^^
和匹配响应={startDateTime:?}
我是QA,不是Java专家,但如果有人能给我举个例子或正则表达式的例子,我会同意的^^
谢谢如果您想阅读文档,您可以找到以下示例:
另请参见以下答案:
我使用SQL从数据库中获取数据,我需要将一个变量传递给where子句,但是,我发现字符串连接不起作用,即使是官方示例
* def batchnum = "112344552"
* def getBatchIDSQL = '#("select id from sr_sendreceive where batchnum = " + batchnum)'
* print getBatchIDSQL
* def sendReceiveBatchid = db.readValue('#(getBatchI
实际值不是字符串错误
执行断言时获取错误
字段1=[1850700,30]
字段2=[“1850.0”、“30.0”、“700.0”]
错误-断言失败:路径:$,实际值:[1850,700,30],应为“[“1850.0”,“30.0”,“700.0]”,原因:实际值不是字符串,因为它不是字符串。这将有助于:
* def field1 = [1850, 700, 30]
* def field2 = ["1850.0","30.0","700.0"]
* def field3 = karate.
我有一个场景,在这个场景中,我必须从响应中的超链接获取值,并将其分配给一个变量,我可以将这个变量传递到url中。下面是json响应
{
"activationDate": "2019-08-20T14:39:07.953",
"expirationDate": "2023-01-30T14:39:07.953",
"timestamp": "637078348862871855",
"links": [
{
"href": "https://someurl/a
我有一个场景,其中响应数组的一部分是来自子API的响应。
子API响应如下所示,但没有具体顺序。我需要检查父API中是否存在子API响应(与子API中元素的顺序无关)。我遵循这个思路,但在我的案例中它不起作用
* def response1 =
"""
{
"array1": [
{
"element": {
"id": "A1",
"array11": [
我是一名空手道初学者,我需要一些帮助将空手道与Inflow Db和grafana结合起来。你可以看看这个问题是否对你有帮助:
否则你必须自己解决这个问题,这与空手道无关
我开始使用空手道DSL进行API测试。我以前做过一些基本的测试。
我混合了动态数据驱动测试,所以我已经阅读了文档和用法。我正在使用独立的jar文件。现在,问题是我试图使用一个json文件,如下所示:
[
{
"name": null,
"type": "informational",
"description": "Poseidon was one of the Twelve O
我必须测试后端的速率限制功能。
我需要同时发出请求(例如:5),并检查其中一个是否由于后端的速率限制设置而失败
像是产生5个线程,每个线程执行一个请求,或者发出5个异步请求
我读过空手道加特林,它做了一些类似的事情,但它似乎是为了性能测试
这是可能的吗?空手道在这方面做得太过火了,就用Java或类似的东西吧。空手道在这方面做得太过火了,就用Java或类似的东西吧。有几种方法,但正如@peter thomas提到的,可能做得太过火了。使用空手道junit并行执行,您可以通过scenatio大纲复制
有没有办法用空手道解压gzip响应?。我曾尝试使用空手道apache v0.9.6和空手道jersey v0.9.6,但默认情况下,这两种版本都没有解压缩响应内容。
当我尝试获取并打印响应时,我看到如下所示
INFO com.intuit.karate - [print] the resp l�ǒ�@�Ee�{��wh�5�Bk-�����ͪ͘�T
我不确定我在这里错过了什么
但是,当我尝试使用ApacheHttpClient.GzipDecompressingEntity时,我成功
我们需要将.avro文件作为输入请求发送到API。我真的被困在这一点上了。如果提供任何详细示例,我们将不胜感激。只需使用Java互操作:
您需要编写一个助手(从静态方法开始)来将JSON转换为Avro,反之亦然。我知道团队在gRPC中使用这个。阅读此帖子获取提示:
还有一个“空手道grpc”项目:非常感谢peter,我知道这是出于空手道要求avro转换为json,反之亦然转换参考。有什么帮助吗?@SandeepPadala我在谷歌上找到了一些链接。试试看!
场景:生成jwt并检查状态
给定路径“/sdk/jwt”
header Authorization = call read('jwt.js') { token: 'e68c82a665847c', secret: 'f08f06f1f41f4479854c' }
当方法得到
然后状态200
和def tkn=响应
场景:获取实例的项目元信息
给定路径“/meta/project”
标题授权=JWT tkn#这是第一个场景的响应。
当方法得到
那么状态是200
但tkn值在第二种情况下不会出现。
我已经创建了下面的功能,并在另一个功能文件中调用它
@忽略
功能:可重复使用的功能,用于创建单个订单
场景大纲:创建多个用户并验证其id、姓名和年龄
给定url“*****/sun api//user/*****”
和请求{locale:'',offerId:'',operationType:'',paidTermDuration:'',paidTermDurationUnit:'',paymentCategory:'',storeOrderId:'',userId:''}
当方法发布时
然后状
我对性能测试非常陌生,我在gatling中使用空手道脚本创建了一个示例项目,但无法理解如何进行
有谁能解释一下如何使用空手道通过使用一些公共api(如下所示)使用gatling进行性能测试
场景:获取特定于状态的信息-一个状态
给定url“”
当方法得到
然后状态200
*def resp=response.response.result.name
*打印响应
这样我们就可以在我们的项目中使用它。无法理解github空手道中当前可用的演示项目您只需Git克隆并运行(使用Maven)这个简单的独立
我读过:和
我正在使用空手道-0.8.0
我有一项功能将在目录中重复使用,内容如下:
@ignore
Feature:
Background:
* url baseUrl
* def Sign = Java.type('cruiser.token.Sign')
* configure afterScenario =
"""
function() {
if (karate.info.errorMessage != null) {
下面的问题与此非常相似:我浏览了“建议包含快捷方式”,但找不出答案
我需要比较两个json文件,但使用contains关键字。为什么只包含?因为在某些情况下,我只需要匹配json文件中的一些选定字段。下面是示例和代码
Json文件1:Test.Json
{
"webServiceDetail":{
"feature":{
"featureCd":"ABCD",
"imaginaryInd":"100.0",
"extraIn
当我使用@smoke标记运行时,它对所有没有@smoke标记的功能文件进行循环,并在控制台中打印跳过的功能文件,如下所示-
runner.KarateRunnerTest - <<skip>> feature 362 of 1436:
runner.KarateRunnerTest - <<skip>> feature 363 of 1436:
不,这很好,并且在0.9.0以后的版本中行为发生了变化。空手道将扫描所有文件
再次检查,它将不会执行
def errorMessage='客户端版本无效。客户端版本不能包含以下任何字符:\“&'(),/:;\”
def expectedMessage='客户端版本无效。客户端版本不能包含以下任何字符:\“&'(),/:;\'
然后匹配错误消息包含预期消息
由于我的错误消息和预期消息中有特殊字符,因此断言失败您必须转义一些特殊字符,如单引号和双引号
# Client version is invalid. The client version cannot contain any of the
我试图断言一个键不在JSON响应中。这就是答案
{
"_type": "UserAccount",
"accountName": "Account_Name",
"accountType": "regular",
"whiteList": true,
"sfAccountId": "1",
"preferredLanguage": "english",
"imageSize": "highRes",
"_id": "775a8
我想使用karate.set更改数组中的值,因为我在if条件下使用它
我的代码是:
> * def name = ["ankit"]
> * def value = 2
> * eval if ( value == 2) karate.set('name', 'ANKIT_DESAI')
但是name的值没有改变假设它是一个列表,并基于索引修改值
* def name = ["ankit"]
* def value = 2
* eval if ( value == 2) na
实际输出-{pratyush=abc}
预期输出-{“pratyush”:“abc”}使用pretty像JSON一样打印它
* def xyz = 'abc'
* def abc = {"pratyush" : '#(xyz)'}
* def editJson =
"""
function(s)
{
var x = s.x
karate.log(x)
}
"""
* def p = call editJson ({"x" :abc})
除此之外,它不会使其成为无效的JSON
karate.lo
简单的POST方法在空手道API中不起作用,在POSTMAN中效果很好,
获取错误如下所示
错误com.intuit.karate-java.net.ConnectException:连接被拒绝:连接,URL的http调用在1101毫秒后失败:
它在邮递员和浏览器中运行良好
网址:
您还没有阅读文档,也没有意识到这是一个HTML表单提交。内容类型应该给您一个提示。以下是您的解决方案:
Given url 'https://api.stripe.com/v1/customers'
And head
在进行断言时获取错误
field1是来自DB的值,我想将它们与field2匹配(来自响应xml的值)
字段2是以下操作的结果
* def field2 = get Response SOME_XML_XPATH
它可能包含值列表中的单个值,如
field2=19.2或field2=[“188.3”、“281.11”]
问题是当我尝试比较两个类似列表的字段时
field1=[1850700,30]field2=[“1850.0”、“30.0”、“700.0”]
为了解决这个问题,我使用了下面的代
我无法运行我的测试用例。下面是我的配置和使用的IDE-
Maven:3.6.0
JDK:1.8.0_111
IDE:Intellij
空手道版本:0.9.0
由com.intuit.karate导致-javascript函数调用失败:ReferenceError:“karate”未定义karate至少需要1.8.0_112或更高版本。文件中提到了这一点
我想匹配一个API的多个响应。请查看下面的场景大纲
Background:
* def kittens = read('../sample.json')
Scenario Outline: Create Test1
Given url url
And request <Users>
When method POST
Then status 200
And match response.success.name == <expectedName>
And match re
上一页 1 2 3 4 5 6 7 8 9 ...
下一页 最后一页 共 37 页