Karate v0.9.4 Release Notes

Release Date: 2019-07-05 // almost 5 years ago
  • 💥 Breaking Change

    There is only one and only for those who use the standalone JAR file. When tests are run - the cucumber-json and junit-xml report output files will now be in target/surefire-reports not directly in the target directory. This prevents the inclusion of other JSON files into the report generation routine which would break the HTML report.

    Notable Improvements

    🛠 There are some bug fixes, and the main improvement is that the eval keyword is un-necessary (optional) for most cases - which makes Karate very close to pure JavaScript as a scripting language.

    Also - the Maven archetype (quickstart) now uses JUnit 5 instead of JUnit 4 - which simplifies the code a lot for newcomers.

    There is a bug in the quickstart, please read this as well: fix for 0.9.4 Maven archetype.

    👀 See complete list of fixes here.

    eval keyword optional for most cases

    Which includes any method call or operations on variables in scope and where you "don't care" about the returned value. Examples are:

    # using any API on the "karate" helper\* karate.env# where "foo" is of type function(){}\* foo()# where "bar" is a variable in scope\* bar.baz()# if statements for conditional logic\* if (responseStatus == 200) karate.call('delete-user.feature')
    

    🤡 This greatly simplifies Karate mocks as evident in this diff below !
    image

    Note that now we recommend that you directly use JavaScript instead of the set keyword when needing to "update" an existing JSON variable. If you need to remove a JSON key where the key name is dynamically derived, use karate.remove() as shown above.

    Note that these rules apply to the Left Hand Side of the match keyword - so you can do things like this now - note the combination of match and karate.filterKeys():

    \* def schema = { a: '#string', b: '#number', c: '#boolean' }\* def response = { a: 'x', c: true }# very useful for validating a response against a schema "super-set"\* match response == karate.filterKeys(schema, response)\* match karate.filterKeys(response, 'b', 'c') == { c: true }\* match karate.filterKeys(response, ['a', 'b']) == { a: 'x' }
    

    In initial versions of Karate, you had to split the last 2 match steps above into 2 steps.

    🆕 New karate.filterKeys() API #810

    📚 And an example appears above. This is very useful for cases where you want to use a "super set" schema that is defined once and you want to re-use. Also in situations where you quickly want to "select" only a few keys out of a given JSON. See the documentation on JSON transforms for more.

    🆕 New karate.start() API

    ✅ To start a Karate mock directly from a feature file without needing to write Java code. Refer to the docs here.

    🆕 New karate.os API

    📚 To get meta-data about the runtime operating system, that can be used to drive conditional logic - for example to run a slightly different set-up routine for Mac OS X versus Windows. See documentation here. Here is a representative example:

    # looks for "common-windows.feature" or "common-macosx.feature"\* call read('common-' + karate.os.type + '.feature')
    

    call read fileNameString

    A short-cut to inject all key-values of a given JSON file into the variables context is now possible, more details in this comment.

    💻 Karate UI has a "pre step" hook option

    Best explained in this video.