Karate call read feature failing with reference error - karate

I am trying to invoke a feature for each element of json array
* def values = karate.mapWithKey(values, 'value')
* def result = call read('my-feature') values
My feature is defined as
#Ignore
Feature: My feature
Background:
*some task
Scenario:
# TEST: My scenario
Given path urlPath, value
This works fine if i use #Tags and only run this scenario.
But on trying to run all karate tests, this fails with error
com.intuit.karate.exception.KarateException: my-feature.feature:15 - javascript evaluation failed: value, ReferenceError: "value" is not defined in at line number 1
How do i fix this?
I have marked the ignored feature as #Ignore, but that doesnt help

Got the solution ,
I was using #Ignore annotation but it also need to be mapped at APITest class
Defining
#KarateOptions(tags = {"~#Ignore"})
And marking the feature file as #Ignore, solved my issue

Shouldn't it be:
* def result = call read('my-feature') ids
If still stuck, follow this process please: https://github.com/intuit/karate/wiki/How-to-Submit-an-Issue

Related

Intercepting multiple graphql operations in a karate UI scenario always returns the first response from mock feature

My scenario in the top feature file looks like this:
Scenario: Fetch a cat type id and create a cat
* driver.intercept({ patterns: [{ urlPattern: '*api/graphql*'}], mock:
'Mock.feature' })
When I click on the button to add a cat (//first graphql call happens. This gets cat types from the mock as expected)
And input a name
And select the cat type
And click create (//second graphql call happens here. But this returns the cat types again)
Then I see a success message
Here is the mock.feature:
Scenario: karate.match("request contains operationName: 'getCatTypes'")
def response = call read ('response.json')
Scenario: karate.match("request contains operationName: 'AddCat'")
def response = call read ('response1.json')
We use karate standalone jar and on version v1.2.0.RC1 (tried with 1.1.0 as well).
Appreciate any suggestions/directions.
Your use of karate.match() is wrong, note that it does not directly return a boolean. Read this for more: https://stackoverflow.com/a/50350442/143475
Try this change:
Scenario: karate.match("request contains operationName: 'getCatTypes'").pass
I also think there are much better ways to do the above, so read this also: https://stackoverflow.com/a/63708918/143475

Karate: Scenario fails if contains __arg and run in 'stand-alone' mode

I have faced a problem when I try to run a Scenario containing built-in __arg variable as 'stand-alone' (not 'called'), then my test fails with an error (I do not #ignore the called one as in order to use it in both 'called' and 'stand-alone' modes):
evaluation (js) failed: __arg, javax.script.ScriptException: ReferenceError: "__arg" is not defined in <eval> at line number 1
stack trace: jdk.nashorn.api.scripting.NashornScriptEngine.throwAsScriptException(NashornScriptEngine.java:470)
Following two simple features should be enough to reproduce.
called-standalone.feature:
Feature: Called + Stand-alone Scenario
Scenario: Should not fail on __arg when run as stand-alone
* def a = __arg
* print a
caller.feature:
Feature: Caller
Scenario: call without args
When def res = call read('called-standalone.feature')
Then match res.a == null
Scenario: call with args
When def res = call read('called-standalone.feature') {some: 42}
Then match res.a == {some: 42}
Putting these two features into the skeleton project and run mvn test will show an error.
I'm expecting this should work as the docs say that "‘called’ Karate scripts ... can behave like ‘normal’ Karate tests in ‘stand-alone’ mode".
‘called’ Karate scripts don’t need to use any special keywords to ‘return’ data and can behave like ‘normal’ Karate tests in ‘stand-alone’ mode if needed
All Karate variables have to be "defined" at run time. This is a rule which can not be relaxed.
So you should re-design your scripts. The good thing is you can use karate.get() to set a "default value".
* def a = karate.get('__arg', null)
That should answer your question.

Returning Variable from Feature File With Multiple Scenarios - Karate

We already know that scenarios are run paralelly. But we had the case where we need to return variables from feature files (that are gonna be called from another feature file).
We had multiple scenarios in the feature file as below:
#mutation
Feature: Test GraphQL Create Item
Background:
Given url baseUrl
* configure headers = { Authorization: '#(token)' }
#negative
Scenario: Create item unauthorized
* configure headers = { Authorization: ""}
#Features calling function and others
And match response.errors[0].message == errorUnauthorized
Scenario: Create story authorized
#Features calling function and others
And def idItem = response.data.CreateItem.id
We are reusing the feature file above to obtain variable to be used on another feature file. However it seems that the other feature files fail intermittently complaining the variables obtained from the other feature file is null.
My assumption is that the returned variable is not returned properly since there are more than one scenarios on the feature file. We tried deleting the #negative scenario and have only exactly 1 scenario. Suddenly the intermittent failures gone.
Is there any way to avoid this intermittent failures while still retaining the ability to run scenarios paralelly?
Thanks
Can't say without seeing your code. But you can try using the #parallel=false annotation in the "calling" feature file: https://github.com/intuit/karate#parallelfalse
Otherwise this may be a bug in Karate - so please follow this process: https://github.com/intuit/karate/wiki/How-to-Submit-an-Issue

Retrieve response from a "Run Test Step", using SoapUI/ Groovy?

In SoapUI, I have a host Test Case, which executes another external Test Case (with several test steps) using the "Run Test Case" test step. I need to access a response from the external TC from within my host TC, since I need to assert on some values.
I cannot transfer the properties since they are in XML. Could I get some pointers as to how I could leverage Groovy/SoapUI for this.
For Response you can use the below code.
testRunner.testCase.getTestStepByName("test step").testRequest.response.responseContent
In you external TC create another property and at the end of the TC use Transfer Property step to transfer your XML node to it. In your host TC, just read that property as you would any other.
I also had a look around to see if this can be done from Groovy. SoapUI documentation says that you need to refer to the external name of the testsuite / testcase:
def tc = testRunner.testCase.testSuite.project.testSuites["external TestSuite"].testCases["external TestCase"]
def ts = tc.testSteps["test step"]
But I could not find how to get at the Response after that.
In addition to Guest and SiKing answers, I share a solution to a problem that I've met:
If your step is not of type 'request' but 'calltestcase' you cannot use Guest answer.
I have a lot of requests contained each in a testCase and my other testCases call these testCases each time I need to launch a request.
I configured my request testCases in order to return the response as a custom property that I call "testResponse" so I can easily access it from my other testCases.
I met a problem in the following configuration :
I have a "calltestcase" step that gives me a request result.
Further in the test I have a groovy script that needs to call this step and get the response value
If I use this solution :
testRunner.runTestStepByName("test step")
followed by testRunner.testCase.getTestStepByName("test step").testRequest.response.responseContent
I'm stuck as there is no testRequest property for the class.
The solution that works is :
testRunner.runTestStepByName("test step")
def response_value = context.expand( '${test step#testResponse#$[\'value\']}' )
another solution is :
testRunner.runTestStepByName("test step")
tStep = testRunner.testCase.getTestStepByName("test step")
response = tStep.getPropertyValue("testResponse")
Then I extract the relevant value from 'response' (in my case, it is a json that I have to parse).
Of course it works only because I the request response as a custom property of my request test case.
I hope I was clear enough

How can I reference a TestCase property from an AMF request TestStep script in soapUI?

I have a Test Case called "testCaseOne"
It contains three Test Steps:
"AMFrequestOne"
"propertyTransfer"
"AMFrequestTwo"
"AMFrequestOne" creates a database object.
"propertyTransfer" sends the ResponseAsXml to a temporary property in "testCaseOne" called "tempProp".
I need to reference "tempProp" in a script inside of "AMFrequestTwo"
I've tried the following
def temp = testRunner.testCase.getPropertyValue( "tempProp" )
but I get the error "No such property: testRunner for class: Script6" (number increments with tries)
Is this because in an AMF request "Script is invoked with log, context, parameters and amfHeaders variables" and testRunner is not recognized?
I know it seems odd, but is it possible to do this? I'm unable to use a specific xpath property transfer between the two AMF Requests as it's possible for the structure to change and I'm not always looking for the same node.
Used
def temp = context.testCase.getPropertyValue( "tempProp" )
instead of
def temp = testRunner.testCase.getPropertyValue( "tempProp" )
and this works fine.