Things are designed so that you can plug-in what you need, without needing to compile Java code. Note that Karate has built-in support for CSV files and here is an example: dynamic-csv.feature. Here is the above example re-written to do so: The result of karate.setup() will be a JSON of all the variables created within the Scenario tagged with @setup. { And yes, you can use variable expressions from karate-config.js. The set of built-in functions that start with wait handle all the cases you would need to typically worry about. Pay attention to the fact that the includes() function you see in the above example - is pure JavaScript. squares.push(foo(n)); Here is the same example using this approach, where a couple of images need to be saved as part of the test-script: A video of the above execution can be viewed here. Another (simple) example of a custom Target you can use as a reference is this one: karate-devicefarm-demo - which demonstrates how Karate can be used to drive tests on AWS DeviceFarm. In the feature below, the * print 'in setup' step will run only once. Note the use of the JavaScript String.includes() function to do a text contains match for convenience. IMPORTANT: There are some restrictions when using callonce or karate.callSingle() especially within karate-config.js. If you have trouble with