Repository: authorjapps/zerocode
Pull request #242 (2019-05-19 19:55:24)

ISS-207 # Parameterized step - simple values and CSV values


Patch:
diff --git a/README.md b/README.md
index ddba017e..5163db63 100644
--- a/README.md
+++ b/README.md
@@ -9,11 +9,11 @@
 
 Zerocode makes it easy to create and maintain automated tests with absolute minimum overhead for [REST](https://github.com/authorjapps/zerocode/wiki/User-journey:-Create,-Update-and-GET-Employee-Details),[SOAP](https://github.com/authorjapps/zerocode/blob/master/README.md#soap-method-invocation-example-with-xml-input), [Kafka](https://github.com/authorjapps/zerocode/wiki/Kafka-Testing-Introduction), [DB services](https://github.com/authorjapps/zerocode/wiki/Sample-DB-SQL-Executor) and more. Jump to the [quick-start section](https://github.com/authorjapps/zerocode/blob/master/README.md#getting-started-) or [HelloWorld](https://github.com/authorjapps/zerocode/blob/master/README.md#hello-world-) section to explore more. 
 
-Zerocode is used by many companies such as Vocalink, HSBC, HomeOffice(Gov) and [others](https://github.com/authorjapps/zerocode/blob/master/README.md#smart-projects-using-zerocode) to achieve zero-defect production drop of their micro-services.
+Zerocode is used by many companies such as Vocalink, HSBC, HomeOffice(Gov) and [others](https://github.com/authorjapps/zerocode/blob/master/README.md#smart-projects-using-zerocode) to achieve accurate production drop of their micro-services.
 
 It is a light-weight, simple and extensible open-source framework for writing test intentions in simple JSON format that facilitates both declarative configuration and automation. The [framework manages](https://github.com/authorjapps/zerocode/wiki/What-is-Zerocode-Testing) the step-chaining, request payload handling and response assertions at the same time, same place using [JSON Path](https://github.com/json-path/JsonPath/blob/master/README.md#path-examples). 
 
-For example, if our REST API returns the following from URL "`https://localhost:8080/api/customers/123`" with status `200`,
+For example, if our REST API returns the following from URL `https://localhost:8080/api/v1/customers/123` with `http` status `200(OK)`,
 ```javaScript
 {
     "id": 123,
@@ -34,9 +34,11 @@ then, we can easily validate the above API using `Zerocode` like below.
 
 ```javaScript
 {
-    "url": "api/customers/123",
+    "url": "api/v1/customers/123",
     "operation": "GET",
-    "request": {},
+    "request": {
+        "auth_token":"a_valid_token"
+    },
     "verifications": {
         "status": 200,
         "body": {
@@ -52,7 +54,6 @@ then, we can easily validate the above API using `Zerocode` like below.
     }
 }
 ```
-
 Or
 
 ```javaScript
@@ -74,7 +75,7 @@ Or
     ...
     "verifications": {
         "body": {
-            "type": "$CONTAINS.STRING:Premium High"  // Matches only part of the value
+            "type": "$CONTAINS.STRING:High Value"  // Matches only part of the value
         }
     }
 }
@@ -208,7 +209,9 @@ It eliminates the repetitive code such as Java step definitions, test assertions
 
 It has got best of best ideas and practices from the community to keep it super simple and the adoption is rapidly growing among the developer/tester community. It alleviates pain and brings the simplicity in validating the APIs.
 
-It also helps in mocking/stubbing interfacing APIs during the testing cycle in a declarative-fashion as a [test-step](https://github.com/authorjapps/zerocode/blob/master/README.md#using-wiremock-for-mocking-dependent-end-points) as well as [standalone](https://github.com/authorjapps/api-mock-maker) mock-server deployed locally or into cloud. Its approach to IDE based performance testing to generate load/stress on the target application is quite simple, flexible and efficient - enabling us to simply reuse the test(s) from our regression pack.
+It also helps in mocking/stubbing interfacing APIs during the testing cycle in a declarative-fashion. 
+
+Its approach to IDE based performance testing to generate load/stress on the target application is quite simple, flexible and efficient - Enables us to simply reuse the test(s) from our regression pack.
 
 Here the host and port are maintained in a properties file to enable easy environment-switching.
 ```
@@ -505,6 +508,7 @@ See more usages and examples below.
 - [Step with more assertions](#3)
 - [Running with step loop](#4)
 - [Running with scenario loop](#5)
+- [Parameterized Testing](#51)
 - [Generated reports and charts](#6)
 - [More assertion with handy place holders](#7)
 - [General Place holders](#8)
@@ -807,6 +811,11 @@ Runs the entire scenario two times i.e. executing both the steps once for each t
 }
 ```
 
+#### 51:
+#### Paramterized scenario
+To run the scenario steps for each parameter from a list of values or CSV rows.
+See Wiki for details.
+
 
 #### 6:
 #### Generated reports and charts
diff --git a/core/pom.xml b/core/pom.xml
index afb48eef..4f96f7d9 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -63,6 +63,10 @@
     </repositories>
 
     <dependencies>
+        <dependency>
+            <groupId>com.univocity</groupId>
+            <artifactId>univocity-parsers</artifactId>
+        </dependency>
         <dependency>
             <groupId>com.google.code.gson</groupId>
             <artifactId>gson</artifactId>
diff --git a/core/src/main/java/org/jsmart/zerocode/converter/SoapMocker.java b/core/src/main/java/org/jsmart/zerocode/converter/SoapMocker.java
index 3edea3fa..e83ff581 100644
--- a/core/src/main/java/org/jsmart/zerocode/converter/SoapMocker.java
+++ b/core/src/main/java/org/jsmart/zerocode/converter/SoapMocker.java
@@ -1,10 +1,8 @@
 package org.jsmart.zerocode.converter;
 
-import org.jsmart.zerocode.core.utils.SmartUtils;
-
-import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
+import org.jsmart.zerocode.core.utils.SmartUtils;
 
 public class SoapMocker {
 
@@ -17,8 +15,7 @@ public class SoapMocker {
 
             return singleKeyValueMap;
 
-        } catch (IOException e) {
-            e.printStackTrace();
+        } catch (RuntimeException  e) {
             throw new RuntimeException("something wrong happened here" + e);
         }
     }
diff --git a/core/src/main/java/org/jsmart/zerocode/core/di/main/ApplicationMainModule.java b/core/src/main/java/org/jsmart/zerocode/core/di/main/ApplicationMainModule.java
index 3038172a..9fb929aa 100644
--- a/core/src/main/java/org/jsmart/zerocode/core/di/main/ApplicationMainModule.java
+++ b/core/src/main/java/org/jsmart/zerocode/core/di/main/ApplicationMainModule.java
@@ -3,6 +3,7 @@ package org.jsmart.zerocode.core.di.main;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.name.Names;
+import org.jsmart.zerocode.core.di.module.CsvParserModule;
 import org.jsmart.zerocode.core.di.module.GsonModule;
 import org.jsmart.zerocode.core.di.module.HttpClientModule;
 import org.jsmart.zerocode.core.di.module.ObjectMapperModule;
@@ -15,6 +16,8 @@ import org.jsmart.zerocode.core.engine.preprocessor.ZeroCodeExternalFileProcesso
 import org.jsmart.zerocode.core.engine.preprocessor.ZeroCodeExternalFileProcessorImpl;
 import org.jsmart.zerocode.core.engine.preprocessor.ZeroCodeJsonTestProcesor;
 import org.jsmart.zerocode.core.engine.preprocessor.ZeroCodeJsonTestProcesorImpl;
+import org.jsmart.zerocode.core.engine.preprocessor.ZeroCodeParameterizedProcessor;
+import org.jsmart.zerocode.core.engine.preprocessor.ZeroCodeParameterizedProcessorImpl;
 import org.jsmart.zerocode.core.report.ZeroCodeReportGenerator;
 import org.jsmart.zerocode.core.report.ZeroCodeReportGeneratorImpl;
 import org.jsmart.zerocode.core.runner.ZeroCodeMultiStepsScenarioRunner;
@@ -43,6 +46,7 @@ public class ApplicationMainModule extends AbstractModule {
         install(new HttpClientModule());
         install(new GsonModule());
         install(new PropertiesInjectorModule(serverEnv));
+        install(new CsvParserModule());
         //install(new KafkaModule());
 
         /*
@@ -54,6 +58,7 @@ public class ApplicationMainModule extends AbstractModule {
         bind(ZeroCodeJsonTestProcesor.class).to(ZeroCodeJsonTestProcesorImpl.class);
         bind(ZeroCodeReportGenerator.class).to(ZeroCodeReportGeneratorImpl.class);
         bind(ZeroCodeExternalFileProcessor.class).to(ZeroCodeExternalFileProcessorImpl.class);
+        bind(ZeroCodeParameterizedProcessor.class).to(ZeroCodeParameterizedProcessorImpl.class);
 
         // ------------------------------------------------
         // Bind properties for localhost, CI, DIT, SIT etc
diff --git a/core/src/main/java/org/jsmart/zerocode/core/di/module/CsvParserModule.java b/core/src/main/java/org/jsmart/zerocode/core/di/module/CsvParserModule.java
new file mode 100644
index 00000000..beb7bf68
--- /dev/null
+++ b/core/src/main/java/org/jsmart/zerocode/core/di/module/CsvParserModule.java
@@ -0,0 +1,16 @@
+package org.jsmart.zerocode.core.di.module;
+
+import com.google.inject.Binder;
+import com.google.inject.Module;
+import com.univocity.parsers.csv.CsvParser;
+import javax.inject.Singleton;
+import org.jsmart.zerocode.core.di.provider.CsvParserProvider;
+
+public class CsvParserModule implements Module {
+
+    @Override
+    public void configure(Binder binder) {
+        binder.bind(CsvParser.class).toProvider(CsvParserProvider.class).in(Singleton.class);
+    }
+}
+
diff --git a/core/src/main/java/org/jsmart/zerocode/core/di/provider/CsvParserProvider.java b/core/src/main/java/org/jsmart/zerocode/core/di/provider/CsvParserProvider.java
new file mode 100644
index 00000000..e5d7db99
--- /dev/null
+++ b/core/src/main/java/org/jsmart/zerocode/core/di/provider/CsvParserProvider.java
@@ -0,0 +1,27 @@
+package org.jsmart.zerocode.core.di.provider;
+
+import com.univocity.parsers.csv.CsvParser;
+import com.univocity.parsers.csv.CsvParserSettings;
+import javax.inject.Provider;
+
+public class CsvParserProvider implements Provider<CsvParser> {
+    public static final String LINE_SEPARATOR = "\n";
+
+    @Override
+    public CsvParser get() {
+        CsvParserSettings settings = createCsvSettings();
+        return new CsvParser(settings);
+    }
+
+    private CsvParserSettings createCsvSettings() {
+        CsvParserSettings settings = new CsvParserSettings();
+        settings.getFormat().setDelimiter(",");
+        settings.getFormat().setQuote('\'');
+        settings.getFormat().setQuoteEscape('\'');
+        settings.setEmptyValue("");
+        settings.getFormat().setLineSeparator("\n");
+        settings.setAutoConfigurationEnabled(false);
+        return settings;
+    }
+
+}
diff --git a/core/src/main/java/org/jsmart/zerocode/core/domain/Parameterized.java b/core/src/main/java/org/jsmart/zerocode/core/domain/Parameterized.java
new file mode 100644
index 00000000..14b119b4
--- /dev/null
+++ b/core/src/main/java/org/jsmart/zerocode/core/domain/Parameterized.java
@@ -0,0 +1,32 @@
+package org.jsmart.zerocode.core.domain;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import java.util.List;
+
+public class Parameterized {
+    private final List<Object> valueSource;
+    private final List<String> csvSource;
+
+    public Parameterized(
+            @JsonProperty("valueSource") List<Object> valueSource,
+            @JsonProperty("csvSource") List<String> csvSource) {
+        this.valueSource = valueSource;
+        this.csvSource = csvSource;
+    }
+
+    public List<Object> getValueSource() {
+        return valueSource;
+    }
+
+    public List<String> getCsvSource() {
+        return csvSource;
+    }
+
+    @Override
+    public String toString() {
+        return "Parameterized{" +
+                "valueSource=" + valueSource +
+                ", csvSource=" + csvSource +
+                '}';
+    }
+}
diff --git a/core/src/main/java/org/jsmart/zerocode/core/domain/ScenarioSpec.java b/core/src/main/java/org/jsmart/zerocode/core/domain/ScenarioSpec.java
index 2f60a105..9c06ffa1 100644
--- a/core/src/main/java/org/jsmart/zerocode/core/domain/ScenarioSpec.java
+++ b/core/src/main/java/org/jsmart/zerocode/core/domain/ScenarioSpec.java
@@ -14,17 +14,20 @@ public class ScenarioSpec {
     private final Boolean ignoreStepFailures;
     private final String scenarioName;
     private final List<Step> steps;
+    private final Parameterized parameterized;
 
     @JsonCreator
     public ScenarioSpec(
             @JsonProperty("stepLoop") Integer loop,
             @JsonProperty("ignoreStepFailures") Boolean ignoreStepFailures,
             @JsonProperty("scenarioName") String scenarioName,
-            @JsonProperty("steps") List<Step> steps) {
+            @JsonProperty("steps") List<Step> steps,
+            @JsonProperty("parameterized") Parameterized parameterized) {
         this.loop = loop;
         this.ignoreStepFailures = ignoreStepFailures;
         this.scenarioName = scenarioName;
         this.steps = steps;
+        this.parameterized = parameterized;
     }
 
     public Integer getLoop() {
@@ -43,6 +46,10 @@ public class ScenarioSpec {
         return steps == null? (new ArrayList<>()) : steps;
     }
 
+    public Parameterized getParameterized() {
+        return parameterized;
+    }
+
     @Override
     public String toString() {
         return "ScenarioSpec{" +
@@ -50,6 +57,7 @@ public class ScenarioSpec {
                 ", ignoreStepFailures=" + ignoreStepFailures +
                 ", scenarioName='" + scenarioName + '\'' +
                 ", steps=" + steps +
+                ", parameterized=" + parameterized +
                 '}';
     }
 }
diff --git a/core/src/main/java/org/jsmart/zerocode/core/domain/Step.java b/core/src/main/java/org/jsmart/zerocode/core/domain/Step.java
index 843ba7e9..bb04daea 100644
--- a/core/src/main/java/org/jsmart/zerocode/core/domain/Step.java
+++ b/core/src/main/java/org/jsmart/zerocode/core/domain/Step.java
@@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.databind.JsonNode;
+import java.util.List;
 
 @JsonInclude(JsonInclude.Include.NON_NULL)
 /**
@@ -18,8 +19,11 @@ public class Step {
     private final String url;
     private JsonNode request;
     private JsonNode assertions;
+    private JsonNode verifications;
     private String id;
     private JsonNode stepFile;
+    private List<Object> parameterized;
+    private List<String> parameterizedCsv;
 
     public Integer getLoop() {
         return loop;
@@ -45,6 +49,10 @@ public class Step {
         return assertions;
     }
 
+    public JsonNode getVerifications() {
+        return verifications;
+    }
+
     public String getId() {
         return id;
     }
@@ -61,6 +69,22 @@ public class Step {
         this.stepFile = stepFile;
     }
 
+    public List<Object> getParameterized() {
+        return parameterized;
+    }
+
+    public void setParameterized(List<Object> parameterized) {
+        this.parameterized = parameterized;
+    }
+
+    public List<String> getParameterizedCsv() {
+        return parameterizedCsv;
+    }
+
+    public void setParameterizedCsv(List<String> parameterizedCsv) {
+        this.parameterizedCsv = parameterizedCsv;
+    }
+
     @JsonCreator
     public Step(
             @JsonProperty("stepLoop") Integer loop,
@@ -68,14 +92,15 @@ public class Step {
             @JsonProperty("operation") String operation,
             @JsonProperty("url") String url,
             @JsonProperty("request") JsonNode request,
-            @JsonProperty("assertions") JsonNode assertions
-    ) {
+            @JsonProperty("assertions") JsonNode assertions,
+            @JsonProperty("verifications") JsonNode verifications) {
         this.loop = loop;
         this.name = name;
         this.operation = operation;
         this.request = request;
         this.url = url;
-        this.assertions = assertions;
+        this.assertions = assertions.isNull() ? verifications : assertions;
+        this.verifications = verifications;
     }
 
     @Override
@@ -87,8 +112,10 @@ public class Step {
                 ", url='" + url + '\'' +
                 ", request=" + request +
                 ", assertions=" + assertions +
+                ", verifications=" + verifications +
                 ", id='" + id + '\'' +
                 ", stepFile=" + stepFile +
+                ", parameterized=" + parameterized +
                 '}';
     }
 }
diff --git a/core/src/main/java/org/jsmart/zerocode/core/domain/ZerocodeConstants.java b/core/src/main/java/org/jsmart/zerocode/core/domain/ZerocodeConstants.java
index 1e85f1ba..111c81ac 100644
--- a/core/src/main/java/org/jsmart/zerocode/core/domain/ZerocodeConstants.java
+++ b/core/src/main/java/org/jsmart/zerocode/core/domain/ZerocodeConstants.java
@@ -1,12 +1,15 @@
 package org.jsmart.zerocode.core.domain;
 
+import static org.jsmart.zerocode.core.utils.SmartUtils.readJsonAsString;
+
 public interface ZerocodeConstants {
-    public static final String PROPERTY_KEY_HOST = "restful.application.endpoint.host";
-    public static final String PROPERTY_KEY_PORT = "restful.application.endpoint.context";
+    String PROPERTY_KEY_HOST = "restful.application.endpoint.host";
+    String PROPERTY_KEY_PORT = "restful.application.endpoint.context";
 
-    public static final String KAFKA = "kafka";
-    public static final String KAFKA_TOPIC = "kafka-topic:";
-    public static final String OK = "Ok";
-    public static final String FAILED = "Failed";
+    String KAFKA = "kafka";
+    String KAFKA_TOPIC = "kafka-topic:";
+    String OK = "Ok";
+    String FAILED = "Failed";
 
+    String DSL_FORMAT = readJsonAsString("dsl_formats/dsl_parameterized_values.json");
 }
diff --git a/core/src/main/java/org/jsmart/zerocode/core/engine/assertion/FieldHasEqualNumberValueAsserter.java b/core/src/main/java/org/jsmart/zerocode/core/engine/assertion/FieldHasEqualNumberValueAsserter.java
index 3443128b..513f9138 100644
--- a/core/src/main/java/org/jsmart/zerocode/core/engine/assertion/FieldHasEqualNumberValueAsserter.java
+++ b/core/src/main/java/org/jsmart/zerocode/core/engine/assertion/FieldHasEqualNumberValueAsserter.java
@@ -35,7 +35,7 @@ public class FieldHasEqualNumberValueAsserter implements JsonAsserter {
 
         return areEqual ?
                 AssertionReport.createFieldMatchesReport() :
-                AssertionReport.createFieldDoesNotMatchReport(path, expected, result);
+                AssertionReport.createFieldDoesNotMatchReport(path, expected+"(Number)", result+"(String)");
     }
 }
 
diff --git a/core/src/main/java/org/jsmart/zerocode/core/engine/preprocessor/ZeroCodeExternalFileProcessor.java b/core/src/main/java/org/jsmart/zerocode/core/engine/preprocessor/ZeroCodeExternalFileProcessor.java
index 303cfca1..59be0dd6 100644
--- a/core/src/main/java/org/jsmart/zerocode/core/engine/preprocessor/ZeroCodeExternalFileProcessor.java
+++ b/core/src/main/java/org/jsmart/zerocode/core/engine/preprocessor/ZeroCodeExternalFileProcessor.java
@@ -6,4 +6,5 @@ public interface ZeroCodeExternalFileProcessor {
 
     Step resolveExtJsonFile(Step thisStep);
 
+    Step createFromStepFile(Step thisStep, String stepId);
 }
diff --git a/core/src/main/java/org/jsmart/zerocode/core/engine/preprocessor/ZeroCodeExternalFileProcessorImpl.java b/core/src/main/java/org/jsmart/zerocode/core/engine/preprocessor/ZeroCodeExternalFileProcessorImpl.java
index 9a225b25..ab6b084c 100644
--- a/core/src/main/java/org/jsmart/zerocode/core/engine/preprocessor/ZeroCodeExternalFileProcessorImpl.java
+++ b/core/src/main/java/org/jsmart/zerocode/core/engine/preprocessor/ZeroCodeExternalFileProcessorImpl.java
@@ -6,11 +6,11 @@ import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
-import org.jsmart.zerocode.core.domain.Step;
-import org.slf4j.Logger;
-
+import com.univocity.parsers.csv.CsvParser;
 import java.util.List;
 import java.util.Map;
+import org.jsmart.zerocode.core.domain.Step;
+import org.slf4j.Logger;
 
 import static org.jsmart.zerocode.core.engine.preprocessor.ZeroCodeTokens.JSON_PAYLOAD_FILE;
 import static org.jsmart.zerocode.core.utils.SmartUtils.readJsonAsString;
@@ -85,6 +85,20 @@ public class ZeroCodeExternalFileProcessorImpl implements ZeroCodeExternalFilePr
 
     }
 
+    @Override
+    public Step createFromStepFile(Step thisStep, String stepId) {
+        if (thisStep.getStepFile() != null) {
+            try {
+                thisStep = objectMapper.treeToValue(thisStep.getStepFile(), Step.class);
+            } catch (JsonProcessingException e) {
+                LOGGER.error("\n### Error while parsing for stepId - {}, stepFile - {}",
+                        stepId, thisStep.getStepFile());
+                throw new RuntimeException(e);
+            }
+        }
+        return thisStep;
+    }
+
     /**
      * Digs deep into the nested map and looks for external file reference,if found, replaces the place holder with
      * the file content. This is handy when the engineers wants to drive the common contents from a central place.
diff --git a/core/src/main/java/org/jsmart/zerocode/core/engine/preprocessor/ZeroCodeParameterizedProcessor.java b/core/src/main/java/org/jsmart/zerocode/core/engine/preprocessor/ZeroCodeParameterizedProcessor.java
new file mode 100644
index 00000000..8bae2b6b
--- /dev/null
+++ b/core/src/main/java/org/jsmart/zerocode/core/engine/preprocessor/ZeroCodeParameterizedProcessor.java
@@ -0,0 +1,8 @@
+package org.jsmart.zerocode.core.engine.preprocessor;
+
+import org.jsmart.zerocode.core.domain.ScenarioSpec;
+
+public interface ZeroCodeParameterizedProcessor {
+
+    ScenarioSpec processParameterized(ScenarioSpec scenario, int iteration);
+}
diff --git a/core/src/main/java/org/jsmart/zerocode/core/engine/preprocessor/ZeroCodeParameterizedProcessorImpl.java b/core/src/main/java/org/jsmart/zerocode/core/engine/preprocessor/ZeroCodeParameterizedProcessorImpl.java
new file mode 100644
index 00000000..5f4ca307
--- /dev/null
+++ b/core/src/main/java/org/jsmart/zerocode/core/engine/preprocessor/ZeroCodeParameterizedProcessorImpl.java
@@ -0,0 +1,143 @@
+package org.jsmart.zerocode.core.engine.preprocessor;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.univocity.parsers.csv.CsvParser;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicLong;
+import org.apache.commons.lang.text.StrSubstitutor;
+import org.jsmart.zerocode.core.domain.ScenarioSpec;
+import org.slf4j.Logger;
+
+import static org.jsmart.zerocode.core.di.provider.CsvParserProvider.LINE_SEPARATOR;
+import static org.jsmart.zerocode.core.domain.ZerocodeConstants.DSL_FORMAT;
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * <h3>Parameterized Tests Steps</h3>
+ * <p>
+ * Processes the Step for each line in the parameterized/parameterizedCsv section.
+ * <p>
+ * <p>
+ * Parameters can be
+ * "parameterized": [
+ *      200,
+ *      "Hello",
+ *      true
+ * ]
+ * <p>
+ * -or-
+ * <p>
+ * "parameterizedCsv": [
+ *      "1,    2,   200",
+ *      "11,  22, 400",
+ *      "21,  31, 500"
+ * ]
+ * <p>
+ * In each the above cases, the step will execute 3 times.
+ * <p>
+ * For "parameterized" case, ${0} will resolve to 200, "Hello", true respectively for each run.
+ * <p>
+ * For "parameterizedCsv" case, ${0}, ${1}, ${2} will resolve to "1", "2", "200" for the first run.
+ * Then it will resolve to "11",  "22", "400" for the 2nd run ans so on.
+ */
+@Singleton
+public class ZeroCodeParameterizedProcessorImpl implements ZeroCodeParameterizedProcessor {
+    private static final Logger LOGGER = getLogger(ZeroCodeParameterizedProcessorImpl.class);
+
+    public static final String VALUE_SOURCE_KEY = "0";
+
+    private final ObjectMapper objectMapper;
+
+    private final CsvParser csvParser;
+
+    @Inject
+    public ZeroCodeParameterizedProcessorImpl(ObjectMapper objectMapper, CsvParser csvParser) {
+        this.objectMapper = objectMapper;
+        this.csvParser = csvParser;
+    }
+
+    @Override
+    public ScenarioSpec processParameterized(ScenarioSpec scenario, int iteration) {
+
+        if(scenario.getParameterized() == null){
+
+            return scenario;
+
+        } else if (scenario.getParameterized().getValueSource() != null) {
+
+            return resolveParamsValues(scenario, iteration);
+
+        } else if (scenario.getParameterized().getCsvSource() != null) {
+
+            return resolveParamsCsv(scenario, iteration);
+
+        }
+
+        throw new RuntimeException("Scenario spec was invalid. Please check the DSL format \ne.g. \n" + DSL_FORMAT);
+    }
+
+    private ScenarioSpec resolveParamsValues(ScenarioSpec scenario, int paramIndex) {
+        LOGGER.info("Resolving parameter value-source for index - {}", paramIndex);
+
+        try {
+            String stepJson = objectMapper.writeValueAsString(scenario);
+            List<Object> parameterized = scenario.getParameterized().getValueSource();
+
+            if (parameterized == null || parameterized.isEmpty()) {
+                return scenario;
+            }
+
+            Map<String, Object> valuesMap = new HashMap<>();
+            valuesMap.put(VALUE_SOURCE_KEY, parameterized.get(paramIndex));
+
+            String resultantStepJson = replaceWithValues(stepJson, valuesMap);
+
+            return objectMapper.readValue(resultantStepJson, ScenarioSpec.class);
+
+        } catch (Exception exx) {
+            throw new RuntimeException("Error while resolving parameterized values for a scenario - " + exx);
+        }
+    }
+
+    private ScenarioSpec resolveParamsCsv(ScenarioSpec scenario, int paramIndex) {
+        LOGGER.info("Resolving parameter CSV-source for row number - {}", paramIndex);
+        try {
+            String stepJson = objectMapper.writeValueAsString(scenario);
+            List<String> parameterizedCsvList = scenario.getParameterized().getCsvSource();
+
+            if (parameterizedCsvList == null || parameterizedCsvList.isEmpty()) {
+                return scenario;
+            }
+
+            Map<String, Object> valuesMap = new HashMap<>();
+            String csvLine = parameterizedCsvList.get(paramIndex);
+
+            resolveCsvLine(valuesMap, csvLine);
+
+            String resultantStepJson = replaceWithValues(stepJson, valuesMap);
+
+            return objectMapper.readValue(resultantStepJson, ScenarioSpec.class);
+
+        } catch (Exception exx) {
+            throw new RuntimeException("Error while resolving parameterizedCsv values - " + exx);
+        }
+    }
+
+    private void resolveCsvLine(Map<String, Object> valuesMap, String csvLine) {
+        String[] parsedLine = csvParser.parseLine(csvLine + LINE_SEPARATOR);
+        AtomicLong index = new AtomicLong(0);
+        Arrays.stream(parsedLine)
+                .forEach(thisValue -> valuesMap.put(index.getAndIncrement() + "", thisValue));
+    }
+
+    private String replaceWithValues(String stepJson, Map<String, Object> valuesMap) {
+        StrSubstitutor sub = new StrSubstitutor(valuesMap);
+        return sub.replace(stepJson);
+    }
+
+}
diff --git a/core/src/main/java/org/jsmart/zerocode/core/runner/ZeroCodeMultiStepsScenarioRunnerImpl.java b/core/src/main/java/org/jsmart/zerocode/core/runner/ZeroCodeMultiStepsScenarioRunnerImpl.java
index f86ba2e6..81fe8147 100644
--- a/core/src/main/java/org/jsmart/zerocode/core/runner/ZeroCodeMultiStepsScenarioRunnerImpl.java
+++ b/core/src/main/java/org/jsmart/zerocode/core/runner/ZeroCodeMultiStepsScenarioRunnerImpl.java
@@ -1,11 +1,15 @@
 package org.jsmart.zerocode.core.runner;
 
-import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 import com.google.inject.name.Named;
+import com.univocity.parsers.csv.CsvParser;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.function.BiConsumer;
 import org.jsmart.zerocode.core.di.provider.ObjectMapperProvider;
+import org.jsmart.zerocode.core.domain.Parameterized;
 import org.jsmart.zerocode.core.domain.ScenarioSpec;
 import org.jsmart.zerocode.core.domain.Step;
 import org.jsmart.zerocode.core.domain.builders.ZeroCodeExecResultBuilder;
@@ -17,20 +21,20 @@ import org.jsmart.zerocode.core.engine.preprocessor.ScenarioExecutionState;
 import org.jsmart.zerocode.core.engine.preprocessor.StepExecutionState;
 import org.jsmart.zerocode.core.engine.preprocessor.ZeroCodeExternalFileProcessor;
 import org.jsmart.zerocode.core.engine.preprocessor.ZeroCodeJsonTestProcesor;
+import org.jsmart.zerocode.core.engine.preprocessor.ZeroCodeParameterizedProcessor;
 import org.jsmart.zerocode.core.logbuilder.LogCorrelationshipPrinter;
 import org.junit.runner.Description;
 import org.junit.runner.notification.RunNotifier;
 import org.slf4j.Logger;
 
-import java.time.LocalDateTime;
-import java.util.List;
-import java.util.function.BiConsumer;
-
-import static org.jsmart.zerocode.core.domain.ZerocodeConstants.*;
+import static org.jsmart.zerocode.core.domain.ZerocodeConstants.KAFKA_TOPIC;
+import static org.jsmart.zerocode.core.domain.ZerocodeConstants.PROPERTY_KEY_HOST;
+import static org.jsmart.zerocode.core.domain.ZerocodeConstants.PROPERTY_KEY_PORT;
 import static org.jsmart.zerocode.core.domain.builders.ZeroCodeExecResultBuilder.newInstance;
 import static org.jsmart.zerocode.core.engine.mocker.RestEndPointMocker.wireMockServer;
-import static org.jsmart.zerocode.core.utils.ServiceTypeUtils.serviceType;
 import static org.jsmart.zerocode.core.utils.RunnerUtils.getFullyQualifiedUrl;
+import static org.jsmart.zerocode.core.utils.RunnerUtils.loopCount;
+import static org.jsmart.zerocode.core.utils.ServiceTypeUtils.serviceType;
 import static org.jsmart.zerocode.core.utils.SmartUtils.prettyPrintJson;
 import static org.slf4j.LoggerFactory.getLogger;
 
@@ -47,9 +51,15 @@ public class ZeroCodeMultiStepsScenarioRunnerImpl implements ZeroCodeMultiStepsS
     @Inject
     private ZeroCodeExternalFileProcessor extFileProcessor;
 
+    @Inject
+    private ZeroCodeParameterizedProcessor parameterizedProcessor;
+
     @Inject
     private JsonServiceExecutor serviceExecutor;
 
+    @Inject
+    private CsvParser csvParser;
+
     @Inject(optional = true)
     @Named("web.application.endpoint.host")
     private String host;
@@ -74,7 +84,7 @@ public class ZeroCodeMultiStepsScenarioRunnerImpl implements ZeroCodeMultiStepsS
 
     private ZeroCodeExecResultIoWriteBuilder reportBuilder;
 
-    private ZeroCodeExecResultBuilder reportResultBuilder;
+    private ZeroCodeExecResultBuilder execResultBuilder;
 
     private Boolean stepOutcomeGreen;
 
@@ -87,34 +97,47 @@ public class ZeroCodeMultiStepsScenarioRunnerImpl implements ZeroCodeMultiStepsS
 
         ScenarioExecutionState scenarioExecutionState = new ScenarioExecutionState();
 
-        final int scenarioLoopTimes = scenario.getLoop() == null ? 1 : scenario.getLoop();
+        // ---------------------------------------------------------------------
+        // Override scenario loop count with parameterized value size if present
+        // ---------------------------------------------------------------------
+        int scenarioLoopTimes = scenario.getLoop() == null ? 1 : scenario.getLoop();
+        int parameterSize = getParameterSize(scenario.getParameterized());
+        scenarioLoopTimes = parameterSize != 0 ? parameterSize: scenarioLoopTimes;
 
-        for (int k = 0; k < scenarioLoopTimes; k++) {
+        for (int scnCount = 0; scnCount < scenarioLoopTimes; scnCount++) {
 
-            LOGGER.info("\n### Executing Scenario -->> Count No: " + k);
+            LOGGER.info("\n-------------------------------------------------------------------------" +
+                    "\n     Executing Scenario Count No. or parameter No. or Row No. | {} | {}", scnCount,
+                    "\n-------------------------------------------------------------------------");
 
-            /*
-             * Build Report scenario for each k
-             */
-            reportResultBuilder = newInstance()
-                    .loop(k)
-                    .scenarioName(scenario.getScenarioName());
+            ScenarioSpec parameterizedScenario = parameterizedProcessor.processParameterized(scenario, scnCount);
 
-            for (Step thisStep : scenario.getSteps()) {
+            // ---------------------------------
+            // Build Report scenario for each k
+            // ---------------------------------
+            execResultBuilder = newInstance()
+                    .loop(scnCount)
+                    .scenarioName(parameterizedScenario.getScenarioName());
 
-                final int stepLoopTimes = thisStep.getLoop() == null ? 1 : thisStep.getLoop();
-                for (int i = 0; i < stepLoopTimes; i++) {
-                    LOGGER.info("\n### Executing Step -->> Count No: " + i);
+            for (Step thisStep : parameterizedScenario.getSteps()) {
+
+                int stepLoopTimes;
+                stepLoopTimes = loopCount(thisStep);
+
+                for (int stepCount = 0; stepCount < stepLoopTimes; stepCount++) {
+                    LOGGER.info("\n### Executing Step -->> Count No: " + stepCount);
                     logCorrelationshipPrinter = LogCorrelationshipPrinter.newInstance(LOGGER);
-                    logCorrelationshipPrinter.stepLoop(i);
+                    logCorrelationshipPrinter.stepLoop(stepCount);
 
                     thisStep = extFileProcessor.resolveExtJsonFile(thisStep);
 
                     String stepId = thisStep.getId();
+                    thisStep = extFileProcessor.createFromStepFile(thisStep, stepId);
 
-                    thisStep = createFromStepFile(thisStep, stepId);
+                    //Step parameterizedStep = parameterizedProcessor.processParameterized(thisStep, i);
+                    Step parameterizedStep = thisStep;
 
-                    final String requestJsonAsString = thisStep.getRequest().toString();
+                    final String requestJsonAsString = parameterizedStep.getRequest().toString();
 
                     StepExecutionState stepExecutionState = new StepExecutionState();
 
@@ -122,7 +145,7 @@ public class ZeroCodeMultiStepsScenarioRunnerImpl implements ZeroCodeMultiStepsS
                      * Create the step name as it is for the 1st stepLoopTimes i.e. i=0.
                      * Rest of the loops suffix as i ie stepName1, stepName2, stepName3 etc
                      */
-                    final String thisStepName = thisStep.getName() + (i == 0 ? "" : i);
+                    final String thisStepName = parameterizedStep.getName() + (stepCount == 0 ? "" : stepCount);
 
                     stepExecutionState.addStep(thisStepName);
 
@@ -137,8 +160,8 @@ public class ZeroCodeMultiStepsScenarioRunnerImpl implements ZeroCodeMultiStepsS
                     final String logPrefixRelationshipId = logCorrelationshipPrinter.createRelationshipId();
 
                     try {
-                        String serviceName = thisStep.getUrl();
-                        String operationName = thisStep.getOperation();
+                        String serviceName = parameterizedStep.getUrl();
+                        String operationName = parameterizedStep.getOperation();
 
                         // --------------------------------
                         // Resolve the URL patterns if any
@@ -153,7 +176,7 @@ public class ZeroCodeMultiStepsScenarioRunnerImpl implements ZeroCodeMultiStepsS
                             case REST_CALL:
                                 serviceName = getFullyQualifiedUrl(serviceName, host, port, applicationContext);
                                 logCorrelationshipPrinter.aRequestBuilder()
-                                        .stepLoop(i)
+                                        .stepLoop(stepCount)
                                         .relationshipId(logPrefixRelationshipId)
                                         .requestTimeStamp(requestTimeStamp)
                                         .step(thisStepName)
@@ -167,7 +190,7 @@ public class ZeroCodeMultiStepsScenarioRunnerImpl implements ZeroCodeMultiStepsS
 
                             case JAVA_CALL:
                                 logCorrelationshipPrinter.aRequestBuilder()
-                                        .stepLoop(i)
+                                        .stepLoop(stepCount)
                                         .relationshipId(logPrefixRelationshipId)
                                         .requestTimeStamp(requestTimeStamp)
                                         .step(thisStepName)
@@ -185,7 +208,7 @@ public class ZeroCodeMultiStepsScenarioRunnerImpl implements ZeroCodeMultiStepsS
                                 }
                                 printBrokerProperties();
                                 logCorrelationshipPrinter.aRequestBuilder()
-                                        .stepLoop(i)
+                                        .stepLoop(stepCount)
                                         .relationshipId(logPrefixRelationshipId)
                                         .requestTimeStamp(requestTimeStamp)
                                         .step(thisStepName)
@@ -200,7 +223,7 @@ public class ZeroCodeMultiStepsScenarioRunnerImpl implements ZeroCodeMultiStepsS
 
                             case NONE:
                                 logCorrelationshipPrinter.aRequestBuilder()
-                                        .stepLoop(i)
+                                        .stepLoop(stepCount)
                                         .relationshipId(logPrefixRelationshipId)
                                         .requestTimeStamp(requestTimeStamp)
                                         .step(thisStepName)
@@ -231,7 +254,7 @@ public class ZeroCodeMultiStepsScenarioRunnerImpl implements ZeroCodeMultiStepsS
                         // Handle assertion section -START
                         // ---------------------------------
                         String resolvedAssertionJson = zeroCodeJsonTestProcesor.resolveStringJson(
-                                thisStep.getAssertions().toString(),
+                                parameterizedStep.getAssertions().toString(),
                                 scenarioExecutionState.getResolvedScenarioState()
                         );
 
@@ -243,11 +266,11 @@ public class ZeroCodeMultiStepsScenarioRunnerImpl implements ZeroCodeMultiStepsS
 
                         if (!failureResults.isEmpty()) {
                             StringBuilder builder = new StringBuilder();
-                            
+
                             // Print expected Payload along with assertion errors
                             builder.append("Assumed Payload: \n" + prettyPrintJson(resolvedAssertionJson) + "\n");
                             builder.append("Assertion Errors: \n");
-                            
+
                             failureResults.forEach(f -> {
                                 builder.append(f.toString() + "\n");
                             });
@@ -259,12 +282,12 @@ public class ZeroCodeMultiStepsScenarioRunnerImpl implements ZeroCodeMultiStepsS
                         // --------------------------------------------------------------------------------
                         // Non dependent requests into a single JSON file (Issue-167 - Feature Implemented)
                         // --------------------------------------------------------------------------------
-                        boolean ignoreStepFailures = scenario.getIgnoreStepFailures() == null ? false : scenario.getIgnoreStepFailures();
+                        boolean ignoreStepFailures = parameterizedScenario.getIgnoreStepFailures() == null ? false : parameterizedScenario.getIgnoreStepFailures();
                         if (ignoreStepFailures == true && !failureResults.isEmpty()) {
                             stepOutcomeGreen = notificationHandler.handleAssertion(
                                     notifier,
                                     description,
-                                    scenario.getScenarioName(),
+                                    parameterizedScenario.getScenarioName(),
                                     thisStepName,
                                     failureResults,
                                     notificationHandler::handleAssertionFailed);
@@ -291,7 +314,7 @@ public class ZeroCodeMultiStepsScenarioRunnerImpl implements ZeroCodeMultiStepsS
                             stepOutcomeGreen = notificationHandler.handleAssertion(
                                     notifier,
                                     description,
-                                    scenario.getScenarioName(),
+                                    parameterizedScenario.getScenarioName(),
                                     thisStepName,
                                     failureResults,
                                     notificationHandler::handleAssertionFailed);
@@ -307,7 +330,7 @@ public class ZeroCodeMultiStepsScenarioRunnerImpl implements ZeroCodeMultiStepsS
                         stepOutcomeGreen = notificationHandler.handleAssertion(
                                 notifier,
                                 description,
-                                scenario.getScenarioName(),
+                                parameterizedScenario.getScenarioName(),
                                 thisStepName,
                                 failureResults,
                                 notificationHandler::handleAssertionPassed);
@@ -336,7 +359,7 @@ public class ZeroCodeMultiStepsScenarioRunnerImpl implements ZeroCodeMultiStepsS
                         stepOutcomeGreen = notificationHandler.handleAssertion(
                                 notifier,
                                 description,
-                                scenario.getScenarioName(),
+                                parameterizedScenario.getScenarioName(),
                                 thisStepName,
                                 (new RuntimeException("ZeroCode Step execution failed. Details:" + ex)),
                                 notificationHandler::handleStepException);
@@ -352,14 +375,14 @@ public class ZeroCodeMultiStepsScenarioRunnerImpl implements ZeroCodeMultiStepsS
                          * Build step report for each step
                          * Add the report step to the result step list.
                          */
-                        reportResultBuilder.step(logCorrelationshipPrinter.buildReportSingleStep());
+                        execResultBuilder.step(logCorrelationshipPrinter.buildReportSingleStep());
 
                         /*
                          * FAILED and Exception reports are generated here
                          */
                         if (!stepOutcomeGreen) {
-                            reportBuilder.result(reportResultBuilder.build());
-                            reportBuilder.printToFile(scenario.getScenarioName() + logCorrelationshipPrinter.getCorrelationId() + ".json");
+                            reportBuilder.result(execResultBuilder.build());
+                            reportBuilder.printToFile(parameterizedScenario.getScenarioName() + logCorrelationshipPrinter.getCorrelationId() + ".json");
                         }
                     }
 
@@ -367,7 +390,7 @@ public class ZeroCodeMultiStepsScenarioRunnerImpl implements ZeroCodeMultiStepsS
 
             } //<--- steps for-each
 
-            reportBuilder.result(reportResultBuilder.build());
+            reportBuilder.result(execResultBuilder.build());
 
         } //<-- Scenario Loop
 
@@ -450,16 +473,17 @@ public class ZeroCodeMultiStepsScenarioRunnerImpl implements ZeroCodeMultiStepsS
 
     }
 
-    private Step createFromStepFile(Step thisStep, String stepId) {
-        if (thisStep.getStepFile() != null) {
-            try {
-                thisStep = objectMapper.treeToValue(thisStep.getStepFile(), Step.class);
-            } catch (JsonProcessingException e) {
-                LOGGER.error("\n### Error while parsing for stepId - {}, stepFile - {}",
-                        stepId, thisStep.getStepFile());
-                throw new RuntimeException(e);
-            }
+    private int getParameterSize(Parameterized parameterized) {
+        if (parameterized == null) {
+            return 0;
         }
-        return thisStep;
+
+        List<Object> valueSource = parameterized.getValueSource();
+        List<String> csvSource = parameterized.getCsvSource();
+
+        return valueSource != null ? valueSource.size() :
+                (csvSource != null? csvSource.size() : 0);
     }
+
+
 }
diff --git a/core/src/main/java/org/jsmart/zerocode/core/utils/RunnerUtils.java b/core/src/main/java/org/jsmart/zerocode/core/utils/RunnerUtils.java
index 2c679ef9..44ddb56e 100644
--- a/core/src/main/java/org/jsmart/zerocode/core/utils/RunnerUtils.java
+++ b/core/src/main/java/org/jsmart/zerocode/core/utils/RunnerUtils.java
@@ -2,6 +2,7 @@ package org.jsmart.zerocode.core.utils;
 
 import org.apache.commons.lang.StringUtils;
 import org.jsmart.zerocode.core.domain.EnvProperty;
+import org.jsmart.zerocode.core.domain.Step;
 import org.jsmart.zerocode.core.domain.TestMapping;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -19,6 +20,7 @@ import static org.jsmart.zerocode.core.utils.TokenUtils.getTestCaseTokens;
  */
 public class RunnerUtils {
     private static final Logger LOGGER = LoggerFactory.getLogger(RunnerUtils.class);
+    public static final int MIN_COUNT = 1;
 
     public static String getEnvSpecificConfigFile(String serverEnv, Class<?> testClass) {
         LOGGER.info("### testClass : " + testClass);
@@ -98,4 +100,18 @@ public class RunnerUtils {
             throw new RuntimeException(errMessage + e);
         }
     }
+
+    public static int loopCount(Step thisStep) {
+        int stepLoopTimes = 0;
+
+        if(thisStep.getLoop() != null){
+            stepLoopTimes = thisStep.getLoop();
+        } else if(thisStep.getParameterized() != null){
+            stepLoopTimes = thisStep.getParameterized().size();
+        } else if(thisStep.getParameterizedCsv() != null){
+            stepLoopTimes = thisStep.getParameterizedCsv().size();
+        }
+
+        return stepLoopTimes > 0 ? stepLoopTimes: MIN_COUNT;
+    }
 }
diff --git a/core/src/main/java/org/jsmart/zerocode/core/utils/SmartUtils.java b/core/src/main/java/org/jsmart/zerocode/core/utils/SmartUtils.java
index 573bcb9d..811525e0 100644
--- a/core/src/main/java/org/jsmart/zerocode/core/utils/SmartUtils.java
+++ b/core/src/main/java/org/jsmart/zerocode/core/utils/SmartUtils.java
@@ -9,17 +9,21 @@ import com.google.classpath.RegExpResourceFilter;
 import com.google.common.io.Resources;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
 import org.apache.commons.lang.text.StrSubstitutor;
 import org.jsmart.zerocode.core.di.provider.ObjectMapperProvider;
 import org.jsmart.zerocode.core.domain.ScenarioSpec;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.util.*;
-import java.util.stream.Collectors;
-
 import static java.nio.charset.Charset.defaultCharset;
 
 @Singleton
@@ -39,8 +43,12 @@ public class SmartUtils {
         return jsonAsString;
     }
 
-    public static String readJsonAsString(String jsonFileName) throws IOException {
-        return Resources.toString(Resources.getResource(jsonFileName), defaultCharset());
+    public static String readJsonAsString(String jsonFileName){
+        try {
+            return Resources.toString(Resources.getResource(jsonFileName), defaultCharset());
+        } catch (IOException e) {
+            throw new RuntimeException("Exception occurred while reading the JSON file - " + jsonFileName);
+        }
     }
 
 
@@ -56,7 +64,7 @@ public class SmartUtils {
         ClassPath jvmClassPath = factory.createFromJVM();
         String[] allSimulationFiles = jvmClassPath.findResources(packageName, new RegExpResourceFilter(".*", ".*\\.json$"));
         if (null == allSimulationFiles || allSimulationFiles.length == 0) {
-            throw new RuntimeException("OverSmartTryingToNothingException: Check the (" + packageName + ") integration test repo folder(empty?). ");
+            throw new RuntimeException("NothingFoundHereException: Check the (" + packageName + ") integration test repo folder(empty?). ");
         }
 
         return Arrays.asList(allSimulationFiles);
diff --git a/core/src/main/java/org/jsmart/zerocode/core/utils/TokenUtils.java b/core/src/main/java/org/jsmart/zerocode/core/utils/TokenUtils.java
index 8c3c0bf4..d76d401b 100644
--- a/core/src/main/java/org/jsmart/zerocode/core/utils/TokenUtils.java
+++ b/core/src/main/java/org/jsmart/zerocode/core/utils/TokenUtils.java
@@ -129,8 +129,7 @@ public class TokenUtils {
     public static String getXmlContent(String xmlFileResource) {
         try {
             return SmartUtils.readJsonAsString(xmlFileResource);
-        } catch (IOException e) {
-            e.printStackTrace();
+        } catch (RuntimeException e) {
             throw new RuntimeException("Oops! Problem occurred while reading the XML file '" + xmlFileResource
                     + "', details:" + e);
         }
diff --git a/core/src/main/resources/dsl_formats/dsl_parameterized_values.json b/core/src/main/resources/dsl_formats/dsl_parameterized_values.json
new file mode 100644
index 00000000..f683b70e
--- /dev/null
+++ b/core/src/main/resources/dsl_formats/dsl_parameterized_values.json
@@ -0,0 +1,22 @@
+{
+    "scenarioName": "Scenario with parameterized values",
+    "ignoreStepFailures": true,
+    "steps": [
+        {
+            "name": "step1",
+            "url": "/anUrl/${0}",
+            "operation": "GET",
+            "request": {
+            },
+            "assertions": {
+                "status": 200
+            }
+        }
+    ],
+    "parameterized": {
+        "valueSource": [
+            "hello",
+            123
+        ]
+    }
+}
diff --git a/pom.xml b/pom.xml
index e5c74167..841a66d3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -83,6 +83,7 @@
         <extentreports.version>4.0.9</extentreports.version>
         <version.kafka-clients>2.1.0</version.kafka-clients>
         <version.gson>2.6.2</version.gson>
+        <version.univocity-parsers>2.8.2</version.univocity-parsers>
         <!-- Maven plugins, build properties  -->
         <maven-compiler-plugin.version>3.2</maven-compiler-plugin.version>
         <java-compiler-source.version>1.8</java-compiler-source.version>
@@ -248,6 +249,11 @@
                 <artifactId>extentreports</artifactId>
                 <version>${extentreports.version}</version> <!-- extent community version -->
             </dependency>
+            <dependency>
+                <groupId>com.univocity</groupId>
+                <artifactId>univocity-parsers</artifactId>
+                <version>${version.univocity-parsers}</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 


Test patch:
diff --git a/core/src/main/java/org/jsmart/zerocode/core/engine/preprocessor/ZeroCodeJsonTestProcesorImpl.java b/core/src/main/java/org/jsmart/zerocode/core/engine/preprocessor/ZeroCodeJsonTestProcesorImpl.java
index 5d7356e5..2e5f78c3 100644
--- a/core/src/main/java/org/jsmart/zerocode/core/engine/preprocessor/ZeroCodeJsonTestProcesorImpl.java
+++ b/core/src/main/java/org/jsmart/zerocode/core/engine/preprocessor/ZeroCodeJsonTestProcesorImpl.java
@@ -209,16 +209,16 @@ public class ZeroCodeJsonTestProcesorImpl implements ZeroCodeJsonTestProcesor {
                     asserter = new FieldHasSubStringIgnoreCaseValueAsserter(path, expected);
                 } else if (value instanceof String && (value.toString()).startsWith(ASSERT_VALUE_EQUAL_TO_NUMBER)) {
                     String expected = ((String) value).substring(ASSERT_VALUE_EQUAL_TO_NUMBER.length());
-                    asserter = new FieldHasEqualNumberValueAsserter(path, new BigDecimal(expected));
+                    asserter = new FieldHasEqualNumberValueAsserter(path, numberValueOf(expected));
                 } else if (value instanceof String && (value.toString()).startsWith(ASSERT_VALUE_NOT_EQUAL_TO_NUMBER)) {
                     String expected = ((String) value).substring(ASSERT_VALUE_NOT_EQUAL_TO_NUMBER.length());
-                    asserter = new FieldHasInEqualNumberValueAsserter(path, new BigDecimal(expected));
+                    asserter = new FieldHasInEqualNumberValueAsserter(path, numberValueOf(expected));
                 } else if (value instanceof String && (value.toString()).startsWith(ASSERT_VALUE_GREATER_THAN)) {
                     String expected = ((String) value).substring(ASSERT_VALUE_GREATER_THAN.length());
-                    asserter = new FieldHasGreaterThanValueAsserter(path, new BigDecimal(expected));
+                    asserter = new FieldHasGreaterThanValueAsserter(path, numberValueOf(expected));
                 } else if (value instanceof String && (value.toString()).startsWith(ASSERT_VALUE_LESSER_THAN)) {
                     String expected = ((String) value).substring(ASSERT_VALUE_LESSER_THAN.length());
-                    asserter = new FieldHasLesserThanValueAsserter(path, new BigDecimal(expected));
+                    asserter = new FieldHasLesserThanValueAsserter(path, numberValueOf(expected));
                 } else if (value instanceof String && (value.toString()).startsWith(ASSERT_LOCAL_DATETIME_AFTER)) {
                     String expected = ((String) value).substring(ASSERT_LOCAL_DATETIME_AFTER.length());
                     asserter = new FieldHasDateAfterValueAsserter(path, parseLocalDateTime(expected));
@@ -242,6 +242,16 @@ public class ZeroCodeJsonTestProcesorImpl implements ZeroCodeJsonTestProcesor {
         return asserters;
     }
 
+    private BigDecimal numberValueOf(String expected) {
+        try {
+            return new BigDecimal(expected);
+        } catch (Exception e) {
+            String msg = "\nValue '" + expected + "' can not be converted to number:" + e;
+            LOGGER.error(msg);
+            throw new RuntimeException(msg);
+        }
+    }
+
     private Map<String, Object> createAssertionKV(JsonNode jsonNode, String pathDslPrefix) {
         HashMap<String, Object> resultMap = new HashMap<String, Object>();
 
@@ -358,8 +368,8 @@ public class ZeroCodeJsonTestProcesorImpl implements ZeroCodeJsonTestProcesor {
     private boolean isPropertyKey(String runTimeToken) {
         return propertyKeys.contains(runTimeToken);
     }
-    
-    private LocalDateTime parseLocalDateTime (String value){ 	
+
+    private LocalDateTime parseLocalDateTime (String value){
     	return LocalDateTime.parse(value, DateTimeFormatter.ISO_DATE_TIME);
     }
 
diff --git a/core/src/test/java/org/jsmart/zerocode/core/domain/ParameterizedTest.java b/core/src/test/java/org/jsmart/zerocode/core/domain/ParameterizedTest.java
new file mode 100644
index 00000000..4e994e5e
--- /dev/null
+++ b/core/src/test/java/org/jsmart/zerocode/core/domain/ParameterizedTest.java
@@ -0,0 +1,61 @@
+package org.jsmart.zerocode.core.domain;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.inject.Inject;
+import com.univocity.parsers.csv.CsvParser;
+import org.jsmart.zerocode.core.di.main.ApplicationMainModule;
+import org.jsmart.zerocode.core.utils.SmartUtils;
+import org.jukito.JukitoRunner;
+import org.jukito.TestModule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.hamcrest.CoreMatchers.hasItem;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.core.Is.is;
+
+@RunWith(JukitoRunner.class)
+public class ParameterizedTest {
+
+    public static class JukitoModule extends TestModule {
+        @Override
+        protected void configureTest() {
+            ApplicationMainModule applicationMainModule = new ApplicationMainModule("config_hosts_test.properties");
+            install(applicationMainModule);
+        }
+    }
+
+    @Inject
+    SmartUtils smartUtils;
+
+    @Inject
+    private ObjectMapper mapper;
+
+    @Inject
+    private CsvParser csvParser;
+
+    @Test
+    public void testSerDe_valueSource() throws Exception {
+        String jsonDocumentAsString =
+                smartUtils.getJsonDocumentAsString("01_unit_test_jsons/08_parameterized.json");
+        Parameterized parameterized = mapper.readValue(jsonDocumentAsString, Parameterized.class);
+
+        assertThat(parameterized.getValueSource(), hasItem("hello"));
+        assertThat(parameterized.getValueSource(), hasItem(123));
+        assertThat(parameterized.getValueSource(), hasItem(true));
+
+        String actualJson = mapper.writeValueAsString(parameterized);
+        assertThat(actualJson, is("{\"valueSource\":[\"hello\",123,true],\"csvSource\":[\"1,        2,        200\",\"11,      22,        400\"]}"));
+    }
+
+    @Test
+    public void testSerDe_csvSource() throws Exception {
+        String jsonDocumentAsString =
+                smartUtils.getJsonDocumentAsString("01_unit_test_jsons/08_parameterized.json");
+        Parameterized parameterized = mapper.readValue(jsonDocumentAsString, Parameterized.class);
+
+        assertThat(parameterized.getCsvSource(), hasItem("1,        2,        200"));
+        assertThat(parameterized.getCsvSource(), hasItem("11,      22,        400"));
+    }
+
+}
\ No newline at end of file
diff --git a/core/src/test/java/org/jsmart/zerocode/core/domain/ScenarioSpecTest.java b/core/src/test/java/org/jsmart/zerocode/core/domain/ScenarioSpecTest.java
index fdaa14e3..5c8613d9 100644
--- a/core/src/test/java/org/jsmart/zerocode/core/domain/ScenarioSpecTest.java
+++ b/core/src/test/java/org/jsmart/zerocode/core/domain/ScenarioSpecTest.java
@@ -15,6 +15,7 @@ import org.skyscreamer.jsonassert.JSONAssert;
 import javax.inject.Inject;
 
 import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.CoreMatchers.hasItem;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.notNullValue;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -49,60 +50,43 @@ public class ScenarioSpecTest {
     //@Description("JukitoDescription")
     @Test
     public void willDeserializeA_VanilaFlow() throws Exception {
-        String jsonDocumentAsString = smartUtils.getJsonDocumentAsString("01_test_smart_test_cases/02_test_json_flow_single_step.json");
-        ScenarioSpec flowDeserialized = mapper.readValue(jsonDocumentAsString, ScenarioSpec.class);
+        String jsonDocumentAsString = smartUtils.getJsonDocumentAsString("01_unit_test_jsons/02_test_json_flow_single_step.json");
+        ScenarioSpec scenarioDeserialized = mapper.readValue(jsonDocumentAsString, ScenarioSpec.class);
 
-        assertThat(flowDeserialized, notNullValue());
-        assertThat(flowDeserialized.getSteps().size(), is(1));
-        assertThat(flowDeserialized.getLoop(), is(5));
-        assertThat(flowDeserialized.getScenarioName(), containsString("Given_When_Then-Flow"));
+        assertThat(scenarioDeserialized, notNullValue());
+        assertThat(scenarioDeserialized.getSteps().size(), is(1));
+        assertThat(scenarioDeserialized.getLoop(), is(5));
+        assertThat(scenarioDeserialized.getScenarioName(), containsString("Given_When_Then-Flow"));
     }
 
     @Test
     public void willDeserializeA_MultiSteps() throws Exception {
-        String jsonDocumentAsString = smartUtils.getJsonDocumentAsString("01_test_smart_test_cases/03_test_json_flow_multi_step.json");
-        ScenarioSpec flowDeserialized = mapper.readValue(jsonDocumentAsString, ScenarioSpec.class);
+        String jsonDocumentAsString = smartUtils.getJsonDocumentAsString("01_unit_test_jsons/03_test_json_flow_multi_step.json");
+        ScenarioSpec scenarioDeserialized = mapper.readValue(jsonDocumentAsString, ScenarioSpec.class);
 
-        assertThat(flowDeserialized, notNullValue());
-        assertThat(flowDeserialized.getSteps().size(), is(2));
-        assertThat(flowDeserialized.getScenarioName(), containsString("Given_When_Then-Flow"));
-        assertThat(flowDeserialized.getSteps().get(1).getUrl(), containsString("/url2/path"));
+        assertThat(scenarioDeserialized, notNullValue());
+        assertThat(scenarioDeserialized.getSteps().size(), is(2));
+        assertThat(scenarioDeserialized.getScenarioName(), containsString("Given_When_Then-Flow"));
+        assertThat(scenarioDeserialized.getSteps().get(1).getUrl(), containsString("/url2/path"));
     }
 
     @Test
     public void shouldSerializeSingleFlow() throws Exception {
-        String jsonDocumentAsString = smartUtils.getJsonDocumentAsString("01_test_smart_test_cases/03_test_json_flow_multi_step.json");
+        String jsonDocumentAsString = smartUtils.getJsonDocumentAsString("01_unit_test_jsons/03_test_json_flow_multi_step.json");
         ScenarioSpec scenarioSpec = mapper.readValue(jsonDocumentAsString, ScenarioSpec.class);
 
-        JsonNode flowSpecNode = mapper.valueToTree(scenarioSpec);
+        JsonNode scenarioSpecNode = mapper.valueToTree(scenarioSpec);
 
         /**
          * Note:
          * jayway json assertEquals has issues if json doc has got comments. So find out how to ignore or allow comments
          */
-        JSONAssert.assertEquals(flowSpecNode.toString(), jsonDocumentAsString, true);
+        JSONAssert.assertEquals(scenarioSpecNode.toString(), jsonDocumentAsString, true);
 
-        assertThat(flowSpecNode.get("scenarioName").asText(), containsString("Given_When_Then"));
-        assertThat(flowSpecNode.get("loop").asInt(), is(5));
+        assertThat(scenarioSpecNode.get("scenarioName").asText(), containsString("Given_When_Then"));
+        assertThat(scenarioSpecNode.get("loop").asInt(), is(5));
     }
 
-    @Test
-    @Ignore
-    public void willComplainForDuplicateNames_Step() throws Exception {
-        fail();
-    }
-
-    @Test
-    @Ignore
-    public void willComplainForDuplicateNames_Flow() throws Exception {
-        fail();
-    }
-
-    @Test
-    @Ignore
-    public void willReadAllJsonFiles_AND_Complain_for_Duplicate_names() throws Exception {
-        fail();
-    }
 
     @Test
     public void testJSOnAssert() throws Exception {
@@ -138,7 +122,7 @@ public class ScenarioSpecTest {
     @Test
     public void test_ignoreStepFailuresField() throws Exception {
         String jsonDocumentAsString = smartUtils
-                .getJsonDocumentAsString("01_test_smart_test_cases/04_ignoreStepFailures_in_multistep.json");
+                .getJsonDocumentAsString("01_unit_test_jsons/04_ignoreStepFailures_in_multistep.json");
         ScenarioSpec scenarioSpec = mapper.readValue(jsonDocumentAsString, ScenarioSpec.class);
 
         assertThat(scenarioSpec, notNullValue());
@@ -146,4 +130,13 @@ public class ScenarioSpecTest {
         assertThat(scenarioSpec.getIgnoreStepFailures(), is(true));
     }
 
+    @Test
+    public void testSerDe_parameterized() throws Exception {
+        String jsonDocumentAsString = smartUtils
+                .getJsonDocumentAsString("01_unit_test_jsons/09_scenario_parameterized.json");
+        ScenarioSpec scenarioSpec = mapper.readValue(jsonDocumentAsString, ScenarioSpec.class);
+
+        assertThat(scenarioSpec.getParameterized().getValueSource(), hasItem("hello"));
+        assertThat(scenarioSpec.getParameterized().getCsvSource(), hasItem("1,        2,        200"));
+    }
 }
\ No newline at end of file
diff --git a/core/src/test/java/org/jsmart/zerocode/core/domain/StepTest.java b/core/src/test/java/org/jsmart/zerocode/core/domain/StepTest.java
index ffc00fd1..c64a6291 100644
--- a/core/src/test/java/org/jsmart/zerocode/core/domain/StepTest.java
+++ b/core/src/test/java/org/jsmart/zerocode/core/domain/StepTest.java
@@ -4,6 +4,8 @@ import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.inject.Inject;
 import com.jayway.jsonpath.JsonPath;
+import com.univocity.parsers.csv.CsvParser;
+import java.util.List;
 import org.jsmart.zerocode.core.di.main.ApplicationMainModule;
 import org.jsmart.zerocode.core.utils.SmartUtils;
 import org.jukito.JukitoRunner;
@@ -19,10 +21,12 @@ import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.notNullValue;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.jsmart.zerocode.core.di.provider.CsvParserProvider.LINE_SEPARATOR;
 
 @RunWith(JukitoRunner.class)
 // Or use - @UseModules(ApplicationMainModule.class)
 public class StepTest {
+
     public static class JukitoModule extends TestModule {
         @Override
         protected void configureTest() {
@@ -39,9 +43,12 @@ public class StepTest {
     @Inject
     private ObjectMapper mapper;
 
+    @Inject
+    private CsvParser csvParser;
+
     @Test
     public void shouldDeserializeSingleStep() throws Exception {
-        String jsonDocumentAsString = smartUtils.getJsonDocumentAsString("01_test_smart_test_cases/01_test_json_single_step.json");
+        String jsonDocumentAsString = smartUtils.getJsonDocumentAsString("01_unit_test_jsons/01_test_json_single_step.json");
         Step stepDeserialized = mapper.readValue(jsonDocumentAsString, Step.class);
         assertThat(stepDeserialized, notNullValue());
         final String requestJsonAsString = stepDeserialized.getRequest().toString();
@@ -66,9 +73,50 @@ public class StepTest {
         assertThat(stepDeserialized.getAssertions().get("status").asText(), is("201"));
     }
 
+    @Test
+    public void testVerifications_section() throws Exception {
+        String jsonDocumentAsString =
+                smartUtils.getJsonDocumentAsString("01_unit_test_jsons/00_test_json_single_step_verifications.json");
+        Step stepDeserialized = mapper.readValue(jsonDocumentAsString, Step.class);
+
+        assertThat(stepDeserialized.getVerifications().get("status").asText(), is("201"));
+        assertThat(stepDeserialized.getAssertions().get("status").asText(), is("201"));
+    }
+
+    @Test
+    public void testParameterized_values() throws Exception {
+        String jsonDocumentAsString =
+                smartUtils.getJsonDocumentAsString("01_unit_test_jsons/06_test_single_step_parameterized_value.json");
+        Step stepDeserialized = mapper.readValue(jsonDocumentAsString, Step.class);
+
+        assertThat(stepDeserialized.getParameterized().get(0), is("Hello"));
+        assertThat(stepDeserialized.getParameterized().get(1), is(123));
+        assertThat(stepDeserialized.getParameterized().get(2), is(true));
+    }
+
+    @Test
+    public void testParameterized_csv() throws Exception {
+
+        String jsonDocumentAsString =
+                smartUtils.getJsonDocumentAsString("01_unit_test_jsons/07_test_single_step_parameterized_csv.json");
+        Step stepDeserialized = mapper.readValue(jsonDocumentAsString, Step.class);
+
+        List<String> parameterizedCsv = stepDeserialized.getParameterizedCsv();
+        String[] parsedLine0 = csvParser.parseLine(parameterizedCsv.get(0) + LINE_SEPARATOR);
+        String[] parsedLine1 = csvParser.parseLine(parameterizedCsv.get(1) + LINE_SEPARATOR);
+
+        assertThat(parsedLine0[0], is("1"));
+        assertThat(parsedLine0[1], is("2"));
+        assertThat(parsedLine0[2], is("3"));
+
+        assertThat(parsedLine1[0], is("11"));
+        assertThat(parsedLine1[1], is("22"));
+        assertThat(parsedLine1[2], is("33"));
+    }
+
     @Test
     public void testDeserExternalStepFile() throws Exception {
-        String jsonDocumentAsString = smartUtils.getJsonDocumentAsString("01_test_smart_test_cases/05_test_external_step_reuse.json");
+        String jsonDocumentAsString = smartUtils.getJsonDocumentAsString("01_unit_test_jsons/05_test_external_step_reuse.json");
         Step stepDeserialized = mapper.readValue(jsonDocumentAsString, Step.class);
         assertThat(stepDeserialized, notNullValue());
         assertThat(stepDeserialized.getId(), is("step1"));
@@ -77,7 +125,7 @@ public class StepTest {
 
     @Test
     public void shouldSerializeSingleStep() throws Exception {
-        String jsonDocumentAsString = smartUtils.getJsonDocumentAsString("01_test_smart_test_cases/01_test_json_single_step.json");
+        String jsonDocumentAsString = smartUtils.getJsonDocumentAsString("01_unit_test_jsons/01_test_json_single_step.json");
         Step stepDeserialized = mapper.readValue(jsonDocumentAsString, Step.class);
 
         JsonNode singleStepNode = mapper.valueToTree(stepDeserialized);
diff --git a/core/src/test/java/org/jsmart/zerocode/core/engine/mocker/RestEndPointMockerTest.java b/core/src/test/java/org/jsmart/zerocode/core/engine/mocker/RestEndPointMockerTest.java
index 63d82ed2..140875a4 100644
--- a/core/src/test/java/org/jsmart/zerocode/core/engine/mocker/RestEndPointMockerTest.java
+++ b/core/src/test/java/org/jsmart/zerocode/core/engine/mocker/RestEndPointMockerTest.java
@@ -82,13 +82,13 @@ public class RestEndPointMockerTest {
     @Test
     public void willDeserializeA_VanilaFlow() throws Exception {
         String jsonDocumentAsString = smartUtils.getJsonDocumentAsString("wiremock_integration/wiremock_end_point_json_body.json");
-        ScenarioSpec flowDeserialized = objectMapper.readValue(jsonDocumentAsString, ScenarioSpec.class);
+        ScenarioSpec scenarioDeserialized = objectMapper.readValue(jsonDocumentAsString, ScenarioSpec.class);
 
-        assertThat(flowDeserialized, notNullValue());
-        assertThat(flowDeserialized.getSteps().size(), is(1));
-        assertThat(flowDeserialized.getScenarioName(), containsString("create_mocks"));
+        assertThat(scenarioDeserialized, notNullValue());
+        assertThat(scenarioDeserialized.getSteps().size(), is(1));
+        assertThat(scenarioDeserialized.getScenarioName(), containsString("create_mocks"));
 
-        MockSteps mockSteps = smartUtils.getMapper().readValue(flowDeserialized.getSteps().get(0).getRequest().toString(), MockSteps.class);
+        MockSteps mockSteps = smartUtils.getMapper().readValue(scenarioDeserialized.getSteps().get(0).getRequest().toString(), MockSteps.class);
 
         assertThat(mockSteps.getMocks().get(0).getName(), containsString("Mock the Get Person"));
         assertThat(mockSteps.getMocks().get(1).getName(), containsString("Mock the POST Person"));
@@ -115,8 +115,8 @@ public class RestEndPointMockerTest {
         // WireMock.configureFor(9073);
 
         String jsonDocumentAsString = smartUtils.getJsonDocumentAsString("wiremock_integration/wiremock_end_point_json_body.json");
-        ScenarioSpec flowDeserialized = objectMapper.readValue(jsonDocumentAsString, ScenarioSpec.class);
-        MockSteps mockSteps = smartUtils.getMapper().readValue(flowDeserialized.getSteps().get(0).getRequest().toString(), MockSteps.class);
+        ScenarioSpec scenarioDeserialized = objectMapper.readValue(jsonDocumentAsString, ScenarioSpec.class);
+        MockSteps mockSteps = smartUtils.getMapper().readValue(scenarioDeserialized.getSteps().get(0).getRequest().toString(), MockSteps.class);
 
         final MockStep mockStep = mockSteps.getMocks().get(0);
         String jsonBodyRequest = mockStep.getResponse().get("body").toString();
@@ -146,8 +146,8 @@ public class RestEndPointMockerTest {
         WireMock.configureFor(9073);
 
         String jsonDocumentAsString = smartUtils.getJsonDocumentAsString("wiremock_integration/wiremock_end_point_json_body.json");
-        ScenarioSpec flowDeserialized = objectMapper.readValue(jsonDocumentAsString, ScenarioSpec.class);
-        MockSteps mockSteps = smartUtils.getMapper().readValue(flowDeserialized.getSteps().get(0).getRequest().toString(), MockSteps.class);
+        ScenarioSpec scenarioDeserialized = objectMapper.readValue(jsonDocumentAsString, ScenarioSpec.class);
+        MockSteps mockSteps = smartUtils.getMapper().readValue(scenarioDeserialized.getSteps().get(0).getRequest().toString(), MockSteps.class);
 
         final MockStep mockPost = mockSteps.getMocks().get(1);
         String jsonBodyResponse = mockPost.getResponse().get("body").toString();
@@ -181,8 +181,8 @@ public class RestEndPointMockerTest {
         int WIRE_MOCK_TEST_PORT = 9077;
 
         String jsonDocumentAsString = smartUtils.getJsonDocumentAsString("wiremock_integration/wiremock_end_point_json_body.json");
-        ScenarioSpec flowDeserialized = objectMapper.readValue(jsonDocumentAsString, ScenarioSpec.class);
-        MockSteps mockSteps = smartUtils.getMapper().readValue(flowDeserialized.getSteps().get(0).getRequest().toString(), MockSteps.class);
+        ScenarioSpec scenarioDeserialized = objectMapper.readValue(jsonDocumentAsString, ScenarioSpec.class);
+        MockSteps mockSteps = smartUtils.getMapper().readValue(scenarioDeserialized.getSteps().get(0).getRequest().toString(), MockSteps.class);
 
         final MockStep mockPost = mockSteps.getMocks().get(1);
         final String reqBody = mockPost.getRequest().get("body").toString(); //"{ \"id\" : \"p002\" }";
@@ -212,8 +212,8 @@ public class RestEndPointMockerTest {
         int WIRE_MOCK_TEST_PORT = 9077;
 
         String jsonDocumentAsString = smartUtils.getJsonDocumentAsString("wiremock_integration/wiremock_end_point_json_body.json");
-        ScenarioSpec flowDeserialized = objectMapper.readValue(jsonDocumentAsString, ScenarioSpec.class);
-        MockSteps mockSteps = smartUtils.getMapper().readValue(flowDeserialized.getSteps().get(0).getRequest().toString(), MockSteps.class);
+        ScenarioSpec scenarioDeserialized = objectMapper.readValue(jsonDocumentAsString, ScenarioSpec.class);
+        MockSteps mockSteps = smartUtils.getMapper().readValue(scenarioDeserialized.getSteps().get(0).getRequest().toString(), MockSteps.class);
 
         final MockStep mockGetRequest = mockSteps.getMocks().get(0);
         String respBody = mockGetRequest.getResponse().get("body").toString();
@@ -247,8 +247,8 @@ public class RestEndPointMockerTest {
         int WIRE_MOCK_TEST_PORT = 9077;
 
         String jsonDocumentAsString = smartUtils.getJsonDocumentAsString("wiremock_integration/wiremock_end_point_soap_xml_body.json");
-        ScenarioSpec flowDeserialized = objectMapper.readValue(jsonDocumentAsString, ScenarioSpec.class);
-        MockSteps mockSteps = smartUtils.getMapper().readValue(flowDeserialized.getSteps().get(0).getRequest().toString(), MockSteps.class);
+        ScenarioSpec scenarioDeserialized = objectMapper.readValue(jsonDocumentAsString, ScenarioSpec.class);
+        MockSteps mockSteps = smartUtils.getMapper().readValue(scenarioDeserialized.getSteps().get(0).getRequest().toString(), MockSteps.class);
 
         final MockStep mockPost = mockSteps.getMocks().get(0);
         //final String reqBody = mockPost.getRequest().get("body").toString();
@@ -276,8 +276,8 @@ public class RestEndPointMockerTest {
         WireMock.configureFor(9073);
 
         String jsonDocumentAsString = smartUtils.getJsonDocumentAsString("wiremock_integration/wiremock_end_point_json_body.json");
-        ScenarioSpec flowDeserialized = objectMapper.readValue(jsonDocumentAsString, ScenarioSpec.class);
-        MockSteps mockSteps = smartUtils.getMapper().readValue(flowDeserialized.getSteps().get(0).getRequest().toString(), MockSteps.class);
+        ScenarioSpec scenarioDeserialized = objectMapper.readValue(jsonDocumentAsString, ScenarioSpec.class);
+        MockSteps mockSteps = smartUtils.getMapper().readValue(scenarioDeserialized.getSteps().get(0).getRequest().toString(), MockSteps.class);
 
         final MockStep mockGetStep = mockSteps.getMocks().get(0);
         final Map<String, Object> headersMap = mockGetStep.getHeadersMap();
diff --git a/core/src/test/java/org/jsmart/zerocode/core/engine/preprocessor/ZeroCodeParameterizedProcessorImplTest.java b/core/src/test/java/org/jsmart/zerocode/core/engine/preprocessor/ZeroCodeParameterizedProcessorImplTest.java
new file mode 100644
index 00000000..587f1038
--- /dev/null
+++ b/core/src/test/java/org/jsmart/zerocode/core/engine/preprocessor/ZeroCodeParameterizedProcessorImplTest.java
@@ -0,0 +1,90 @@
+package org.jsmart.zerocode.core.engine.preprocessor;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.univocity.parsers.csv.CsvParser;
+import javax.inject.Inject;
+import org.jsmart.zerocode.core.di.main.ApplicationMainModule;
+import org.jsmart.zerocode.core.domain.ScenarioSpec;
+import org.jsmart.zerocode.core.utils.SmartUtils;
+import org.jukito.JukitoRunner;
+import org.jukito.TestModule;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+@RunWith(JukitoRunner.class)
+public class ZeroCodeParameterizedProcessorImplTest {
+
+    @Rule
+    public ExpectedException expectedException = ExpectedException.none();
+
+    public static class JukitoModule extends TestModule {
+        @Override
+        protected void configureTest() {
+            ApplicationMainModule applicationMainModule = new ApplicationMainModule("config_hosts_test.properties");
+            install(applicationMainModule);
+        }
+    }
+
+    @Inject
+    SmartUtils smartUtils;
+
+    @Inject
+    private ObjectMapper mapper;
+
+    @Inject
+    private CsvParser csvParser;
+
+
+    private ZeroCodeParameterizedProcessorImpl parameterizedProcessor;
+
+    @Before
+    public void setUp() {
+        parameterizedProcessor = new ZeroCodeParameterizedProcessorImpl(mapper, csvParser);
+    }
+
+    @Test
+    public void testProcessParameterized_wrongDsl() throws Exception {
+        String jsonDocumentAsString = smartUtils
+                .getJsonDocumentAsString("01_unit_test_jsons/12_scenario_parameterized_wrong_dsl.json");
+        ScenarioSpec scenarioSpec = mapper.readValue(jsonDocumentAsString, ScenarioSpec.class);
+
+        expectedException.expectMessage("Scenario spec was invalid. Please check the DSL format");
+        ScenarioSpec scenarioSpecResolved = parameterizedProcessor.processParameterized(scenarioSpec, 0);
+    }
+
+    @Test
+    public void testProcessParameterized_values() throws Exception {
+        String jsonDocumentAsString = smartUtils
+                .getJsonDocumentAsString("01_unit_test_jsons/10_scenario_parameterized_values.json");
+        ScenarioSpec scenarioSpec = mapper.readValue(jsonDocumentAsString, ScenarioSpec.class);
+
+        ScenarioSpec scenarioSpecResolved = parameterizedProcessor.processParameterized(scenarioSpec, 0);
+        assertThat(scenarioSpecResolved.getSteps().get(0).getUrl(), is("/anUrl/hello"));
+
+        scenarioSpecResolved = parameterizedProcessor.processParameterized(scenarioSpec, 1);
+        assertThat(scenarioSpecResolved.getSteps().get(0).getUrl(), is("/anUrl/123"));
+
+    }
+
+    @Test
+    public void testProcessParameterized_csv() throws Exception {
+        String jsonDocumentAsString = smartUtils
+                .getJsonDocumentAsString("01_unit_test_jsons/11_scenario_parameterized_csv.json");
+        ScenarioSpec scenarioSpec = mapper.readValue(jsonDocumentAsString, ScenarioSpec.class);
+
+        ScenarioSpec scenarioSpecResolved = parameterizedProcessor.processParameterized(scenarioSpec, 0);
+        assertThat(scenarioSpecResolved.getSteps().get(0).getUrl(), is("/anUrl/1/2"));
+        assertThat(scenarioSpecResolved.getSteps().get(0).getAssertions().get("status").asInt(), is(200));
+
+        scenarioSpecResolved = parameterizedProcessor.processParameterized(scenarioSpec, 1);
+        assertThat(scenarioSpecResolved.getSteps().get(0).getUrl(), is("/anUrl/11/22"));
+        assertThat(scenarioSpecResolved.getSteps().get(0).getAssertions().get("status").asInt(), is(400));
+
+    }
+}
\ No newline at end of file
diff --git a/core/src/test/java/org/jsmart/zerocode/core/utils/SmartUtilsTest.java b/core/src/test/java/org/jsmart/zerocode/core/utils/SmartUtilsTest.java
index dd14c06f..a8600109 100644
--- a/core/src/test/java/org/jsmart/zerocode/core/utils/SmartUtilsTest.java
+++ b/core/src/test/java/org/jsmart/zerocode/core/utils/SmartUtilsTest.java
@@ -51,16 +51,16 @@ public class SmartUtilsTest {
 
     @Test
     public void testJsonToJavaFor_jsonFileName() throws Exception {
-        Step stepJava = smartUtils.jsonFileToJava("01_test_smart_test_cases/01_test_json_single_step.json", Step.class);
+        Step stepJava = smartUtils.jsonFileToJava("01_unit_test_jsons/01_test_json_single_step.json", Step.class);
         assertThat(stepJava.getLoop(), is(3));
 
-        ScenarioSpec flowJava = smartUtils.jsonFileToJava("01_test_smart_test_cases/02_test_json_flow_single_step.json", ScenarioSpec.class);
-        assertThat(flowJava.getLoop(), is(5));
+        ScenarioSpec scenarioJava = smartUtils.jsonFileToJava("01_unit_test_jsons/02_test_json_flow_single_step.json", ScenarioSpec.class);
+        assertThat(scenarioJava.getLoop(), is(5));
     }
 
     @Test
     public void willGetJsonFileIntoA_JavaString() throws Exception {
-        String jsonDocumentAsString = smartUtils.getJsonDocumentAsString("01_test_smart_test_cases/01_test_json_single_step.json");
+        String jsonDocumentAsString = smartUtils.getJsonDocumentAsString("01_unit_test_jsons/01_test_json_single_step.json");
         assertThat(jsonDocumentAsString, containsString("assertions"));
         assertThat(jsonDocumentAsString, containsString("request"));
         assertThat(jsonDocumentAsString, containsString("{"));
@@ -69,9 +69,9 @@ public class SmartUtilsTest {
 
     @Test
     public void willReadAllfileNamesFrom_TestResource() throws Exception {
-        List<String> allTestCaseFiles = SmartUtils.getAllEndPointFiles("01_test_smart_test_cases");
-        assertThat(allTestCaseFiles.size(), is(6));
-        assertThat(allTestCaseFiles.get(0).toString(), is("01_test_smart_test_cases/01_test_json_single_step.json"));
+        List<String> allTestCaseFiles = SmartUtils.getAllEndPointFiles("01_unit_test_jsons");
+        assertThat(allTestCaseFiles.size(), is(14));
+        assertThat(allTestCaseFiles.get(0), is("01_unit_test_jsons/00_test_json_single_step_verifications.json"));
     }
 
     @Test
diff --git a/core/src/test/java/org/jsmart/zerocode/parameterized/ParameterisedCsvDemoTest.java b/core/src/test/java/org/jsmart/zerocode/parameterized/ParameterisedCsvDemoTest.java
new file mode 100644
index 00000000..ddad879e
--- /dev/null
+++ b/core/src/test/java/org/jsmart/zerocode/parameterized/ParameterisedCsvDemoTest.java
@@ -0,0 +1,17 @@
+package org.jsmart.zerocode.parameterized;
+
+import org.jsmart.zerocode.core.domain.JsonTestCase;
+import org.jsmart.zerocode.core.domain.TargetEnv;
+import org.jsmart.zerocode.core.runner.ZeroCodeUnitRunner;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@TargetEnv("app_config.properties")
+@RunWith(ZeroCodeUnitRunner.class)
+public class ParameterisedCsvDemoTest {
+
+    @Test
+    @JsonTestCase("parameterized/parameterized_sample_csv_test.json")
+    public void testParameterizedCsv() throws Exception {
+    }
+}
diff --git a/core/src/test/java/org/jsmart/zerocode/parameterized/ParameterisedDemoTest.java b/core/src/test/java/org/jsmart/zerocode/parameterized/ParameterisedDemoTest.java
new file mode 100644
index 00000000..be8b9318
--- /dev/null
+++ b/core/src/test/java/org/jsmart/zerocode/parameterized/ParameterisedDemoTest.java
@@ -0,0 +1,17 @@
+package org.jsmart.zerocode.parameterized;
+
+import org.jsmart.zerocode.core.domain.JsonTestCase;
+import org.jsmart.zerocode.core.domain.TargetEnv;
+import org.jsmart.zerocode.core.runner.ZeroCodeUnitRunner;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@TargetEnv("app_config.properties")
+@RunWith(ZeroCodeUnitRunner.class)
+public class ParameterisedDemoTest {
+
+    @Test
+    @JsonTestCase("parameterized/parameterized_sample_test.json")
+    public void testParameterized() throws Exception {
+    }
+}
diff --git a/core/src/test/resources/01_unit_test_jsons/00_test_json_single_step_verifications.json b/core/src/test/resources/01_unit_test_jsons/00_test_json_single_step_verifications.json
new file mode 100755
index 00000000..41f5f467
--- /dev/null
+++ b/core/src/test/resources/01_unit_test_jsons/00_test_json_single_step_verifications.json
@@ -0,0 +1,27 @@
+{
+  "loop": 3,
+  "name": "StepNameWithoutSpaceEgCREATE",
+  "url": "/persons",
+  "operation": "POST",
+  "request": {
+    "headers": {
+      "Content-Type": "application/json;charset=UTF-8",
+      "Cookie": "cookie_123"
+    },
+    "queryParams": {
+      "param1": "value1",
+      "invId": 10101
+    },
+    "body": {
+      "Customer": {
+        "firstName": "FIRST_NAME"
+      }
+    }
+  },
+  "verifications": {
+    "status": 201,
+    "body": {
+      "id" : 1001
+    }
+  }
+}
diff --git a/core/src/test/resources/01_test_smart_test_cases/01_test_json_single_step.json b/core/src/test/resources/01_unit_test_jsons/01_test_json_single_step.json
similarity index 94%
rename from core/src/test/resources/01_test_smart_test_cases/01_test_json_single_step.json
rename to core/src/test/resources/01_unit_test_jsons/01_test_json_single_step.json
index 90da441b..5f2351d6 100755
--- a/core/src/test/resources/01_test_smart_test_cases/01_test_json_single_step.json
+++ b/core/src/test/resources/01_unit_test_jsons/01_test_json_single_step.json
@@ -23,5 +23,6 @@
     "body": {
       "id" : 1001
     }
-  }
+  },
+  "verifications": null
 }
diff --git a/core/src/test/resources/01_test_smart_test_cases/02_test_json_flow_single_step.json b/core/src/test/resources/01_unit_test_jsons/02_test_json_flow_single_step.json
similarity index 100%
rename from core/src/test/resources/01_test_smart_test_cases/02_test_json_flow_single_step.json
rename to core/src/test/resources/01_unit_test_jsons/02_test_json_flow_single_step.json
diff --git a/core/src/test/resources/01_test_smart_test_cases/03_test_json_flow_multi_step.json b/core/src/test/resources/01_unit_test_jsons/03_test_json_flow_multi_step.json
similarity index 94%
rename from core/src/test/resources/01_test_smart_test_cases/03_test_json_flow_multi_step.json
rename to core/src/test/resources/01_unit_test_jsons/03_test_json_flow_multi_step.json
index 7b42494a..f9428869 100755
--- a/core/src/test/resources/01_test_smart_test_cases/03_test_json_flow_multi_step.json
+++ b/core/src/test/resources/01_unit_test_jsons/03_test_json_flow_multi_step.json
@@ -27,7 +27,8 @@
         "body": {
           "id": 1001
         }
-      }
+      },
+      "verifications":null
     },
     {
       "loop": 3,
@@ -54,7 +55,8 @@
         "body": {
           "id": 1001
         }
-      }
+      },
+      "verifications":null
     }
 
   ]
diff --git a/core/src/test/resources/01_test_smart_test_cases/04_ignoreStepFailures_in_multistep.json b/core/src/test/resources/01_unit_test_jsons/04_ignoreStepFailures_in_multistep.json
similarity index 100%
rename from core/src/test/resources/01_test_smart_test_cases/04_ignoreStepFailures_in_multistep.json
rename to core/src/test/resources/01_unit_test_jsons/04_ignoreStepFailures_in_multistep.json
diff --git a/core/src/test/resources/01_test_smart_test_cases/05_test_external_step_reuse.json b/core/src/test/resources/01_unit_test_jsons/05_test_external_step_reuse.json
similarity index 100%
rename from core/src/test/resources/01_test_smart_test_cases/05_test_external_step_reuse.json
rename to core/src/test/resources/01_unit_test_jsons/05_test_external_step_reuse.json
diff --git a/core/src/test/resources/01_unit_test_jsons/06_test_single_step_parameterized_value.json b/core/src/test/resources/01_unit_test_jsons/06_test_single_step_parameterized_value.json
new file mode 100755
index 00000000..cef9459c
--- /dev/null
+++ b/core/src/test/resources/01_unit_test_jsons/06_test_single_step_parameterized_value.json
@@ -0,0 +1,17 @@
+{
+    "name": "parameterized_csv_step",
+    "url": "/persons",
+    "operation": "POST",
+    "request": {
+    },
+    "assertions": {
+        "body": {
+            "id": 1001
+        }
+    },
+    "parameterized": [
+        "Hello",
+        123,
+        true
+    ]
+}
diff --git a/core/src/test/resources/01_unit_test_jsons/07_test_single_step_parameterized_csv.json b/core/src/test/resources/01_unit_test_jsons/07_test_single_step_parameterized_csv.json
new file mode 100755
index 00000000..2fd2af9c
--- /dev/null
+++ b/core/src/test/resources/01_unit_test_jsons/07_test_single_step_parameterized_csv.json
@@ -0,0 +1,16 @@
+{
+    "name": "StepNameWithoutSpaceEgCREATE",
+    "url": "/persons",
+    "operation": "POST",
+    "request": {
+    },
+    "assertions": {
+        "body": {
+            "id": 1001
+        }
+    },
+    "parameterizedCsv": [
+        "1,    2,   3",
+        "11,  22, 33"
+    ]
+}
diff --git a/core/src/test/resources/01_unit_test_jsons/08_parameterized.json b/core/src/test/resources/01_unit_test_jsons/08_parameterized.json
new file mode 100755
index 00000000..87d80dcd
--- /dev/null
+++ b/core/src/test/resources/01_unit_test_jsons/08_parameterized.json
@@ -0,0 +1,12 @@
+{
+    "valueSource": [
+        "hello",
+        123,
+        true
+    ],
+    "csvSource": [
+        //id,     AddressId, status
+        "1,        2,        200",
+        "11,      22,        400"
+    ]
+}
diff --git a/core/src/test/resources/01_unit_test_jsons/09_scenario_parameterized.json b/core/src/test/resources/01_unit_test_jsons/09_scenario_parameterized.json
new file mode 100644
index 00000000..4132fa71
--- /dev/null
+++ b/core/src/test/resources/01_unit_test_jsons/09_scenario_parameterized.json
@@ -0,0 +1,38 @@
+{
+    "scenarioName": "For deserialize only",
+    "ignoreStepFailures": true,
+    "steps": [
+        {
+            "name": "step1",
+            "url": "/anUrl",
+            "operation": "GET",
+            "request": {
+            },
+            "assertions": {
+                "status": 900
+            }
+        },
+        {
+            "name": "step2",
+            "url": "/otherUrl",
+            "operation": "GET",
+            "request": {
+            },
+            "assertions": {
+                "status": 200
+            }
+        }
+    ],
+    "parameterized": {
+        "valueSource": [
+            "hello",
+            123,
+            true
+        ],
+        "csvSource": [
+            //id,     AddressId, status
+            "1,        2,        200",
+            "11,      22,        400"
+        ]
+    }
+}
diff --git a/core/src/test/resources/01_unit_test_jsons/10_scenario_parameterized_values.json b/core/src/test/resources/01_unit_test_jsons/10_scenario_parameterized_values.json
new file mode 100644
index 00000000..b02badaa
--- /dev/null
+++ b/core/src/test/resources/01_unit_test_jsons/10_scenario_parameterized_values.json
@@ -0,0 +1,22 @@
+{
+    "scenarioName": "Scenario with parameterized values",
+    "ignoreStepFailures": true,
+    "steps": [
+        {
+            "name": "step1",
+            "url": "/anUrl/${0}",
+            "operation": "GET",
+            "request": {
+            },
+            "assertions": {
+                "status": 900
+            }
+        }
+    ],
+    "parameterized": {
+        "valueSource": [
+            "hello",
+            123
+        ]
+    }
+}
diff --git a/core/src/test/resources/01_unit_test_jsons/11_scenario_parameterized_csv.json b/core/src/test/resources/01_unit_test_jsons/11_scenario_parameterized_csv.json
new file mode 100644
index 00000000..f306e68e
--- /dev/null
+++ b/core/src/test/resources/01_unit_test_jsons/11_scenario_parameterized_csv.json
@@ -0,0 +1,23 @@
+{
+    "scenarioName": "For deserialize only",
+    "ignoreStepFailures": true,
+    "steps": [
+        {
+            "name": "step1",
+            "url": "/anUrl/${0}/${1}",
+            "operation": "GET",
+            "request": {
+            },
+            "assertions": {
+                "status": "${2}"
+            }
+        }
+    ],
+    "parameterized": {
+        "csvSource": [
+            //id,     AddressId, status
+            "1,        2,        200",
+            "11,      22,        400"
+        ]
+    }
+}
diff --git a/core/src/test/resources/01_unit_test_jsons/12_scenario_parameterized_wrong_dsl.json b/core/src/test/resources/01_unit_test_jsons/12_scenario_parameterized_wrong_dsl.json
new file mode 100644
index 00000000..749ceea2
--- /dev/null
+++ b/core/src/test/resources/01_unit_test_jsons/12_scenario_parameterized_wrong_dsl.json
@@ -0,0 +1,19 @@
+{
+    "scenarioName": "For deserialize only",
+    "ignoreStepFailures": true,
+    "steps": [
+        {
+            "name": "step1",
+            "url": "/anUrl/${0}",
+            "operation": "GET",
+            "request": {
+            },
+            "assertions": {
+                "status": 900
+            }
+        }
+    ],
+    "parameterized": {
+
+    }
+}
diff --git a/core/src/test/resources/01_test_smart_test_cases/99_test_sample_ref.json b/core/src/test/resources/01_unit_test_jsons/99_test_sample_ref.json
similarity index 100%
rename from core/src/test/resources/01_test_smart_test_cases/99_test_sample_ref.json
rename to core/src/test/resources/01_unit_test_jsons/99_test_sample_ref.json
diff --git a/core/src/test/resources/load/github_get_api_sample_test.json b/core/src/test/resources/load/github_get_api_sample_test.json
index d0d622a4..56f86681 100644
--- a/core/src/test/resources/load/github_get_api_sample_test.json
+++ b/core/src/test/resources/load/github_get_api_sample_test.json
@@ -7,7 +7,7 @@
             "operation": "GET",
             "request": {
             },
-            "assertions": {
+            "verifications": {
                 "status": 200,
                 "body": {
                     "login" : "octocat",
diff --git a/core/src/test/resources/parameterized/parameterized_sample_csv_string_test.json b/core/src/test/resources/parameterized/parameterized_sample_csv_string_test.json
new file mode 100644
index 00000000..b92fea2d
--- /dev/null
+++ b/core/src/test/resources/parameterized/parameterized_sample_csv_string_test.json
@@ -0,0 +1,24 @@
+{
+    "scenarioName": "Parameterized test scenario demo",
+    "steps": [
+        {
+            "name": "get_user",
+            "url": "",
+            "operation": "",
+            "request": {
+                "body": {
+                    "login": "octocat"
+                }
+            },
+            "assertions": {
+                "body": {
+                    "login": "octocat"
+                }
+            },
+            "parameterizedCsv": [
+                "Hello,    World,   Hello World",
+                "11,  22, 33"
+            ]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/core/src/test/resources/parameterized/parameterized_sample_csv_test.json b/core/src/test/resources/parameterized/parameterized_sample_csv_test.json
new file mode 100644
index 00000000..4fd4a2f1
--- /dev/null
+++ b/core/src/test/resources/parameterized/parameterized_sample_csv_test.json
@@ -0,0 +1,29 @@
+{
+    "scenarioName": "Parameterized test scenario demo",
+    "steps": [
+        {
+            "name": "get_user",
+            "url": "",
+            "operation": "",
+            "request": {
+                "status": "${2}",
+                "body": {
+                    "login": "octocat-${0}-${1}"
+                }
+            },
+            "assertions": {
+                "status": "${$.get_user.response.status}",
+                "body": {
+                    "login": "octocat-${0}-${1}"
+                }
+            }
+        }
+    ],
+    "parameterized": {
+        "csvSource":[
+            //id,     AddressId, status
+            "1,        2,        200",
+            "11,      22,        400"
+        ]
+    }
+}
\ No newline at end of file
diff --git a/core/src/test/resources/parameterized/parameterized_sample_test.json b/core/src/test/resources/parameterized/parameterized_sample_test.json
new file mode 100644
index 00000000..3e1552a6
--- /dev/null
+++ b/core/src/test/resources/parameterized/parameterized_sample_test.json
@@ -0,0 +1,30 @@
+{
+    "scenarioName": "Parameterized test scenario demo",
+    "steps": [
+        {
+            "name": "get_user",
+            "url": "",
+            "operation": "",
+            "request": {
+                "status": "${0}",
+                "body": {
+                    "login": "octocat-${0}"
+                }
+            },
+            "assertions": {
+                "status": "${$.get_user.request.status}",
+                "body": {
+                    "login": "octocat-${0}"
+                }
+            }
+        }
+    ],
+    "parameterized": {
+        "valueSource":[
+            //value
+            200,
+            "Hello",
+            true
+        ]
+    }
+}
diff --git a/http-testing/src/test/java/org/jsmart/zerocode/testhelp/tests/helloworldparameterizedcsv/HelloWorldParameterizedCsvTest.java b/http-testing/src/test/java/org/jsmart/zerocode/testhelp/tests/helloworldparameterizedcsv/HelloWorldParameterizedCsvTest.java
new file mode 100644
index 00000000..e169a8a2
--- /dev/null
+++ b/http-testing/src/test/java/org/jsmart/zerocode/testhelp/tests/helloworldparameterizedcsv/HelloWorldParameterizedCsvTest.java
@@ -0,0 +1,18 @@
+package org.jsmart.zerocode.testhelp.tests.helloworldparameterizedcsv;
+
+import org.jsmart.zerocode.core.domain.Scenario;
+import org.jsmart.zerocode.core.domain.TargetEnv;
+import org.jsmart.zerocode.core.runner.ZeroCodeUnitRunner;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@TargetEnv("github_host.properties")
+@RunWith(ZeroCodeUnitRunner.class)
+public class HelloWorldParameterizedCsvTest {
+
+    @Test
+    @Scenario("parameterized_csv/hello_world_test_parameterized_csv.json")
+    public void testGetByUserNames_csv() throws Exception {
+    }
+
+}
diff --git a/http-testing/src/test/java/org/jsmart/zerocode/testhelp/tests/helloworldparameterizedvalue/HelloWorldParameterizedValueTest.java b/http-testing/src/test/java/org/jsmart/zerocode/testhelp/tests/helloworldparameterizedvalue/HelloWorldParameterizedValueTest.java
new file mode 100644
index 00000000..963a632b
--- /dev/null
+++ b/http-testing/src/test/java/org/jsmart/zerocode/testhelp/tests/helloworldparameterizedvalue/HelloWorldParameterizedValueTest.java
@@ -0,0 +1,18 @@
+package org.jsmart.zerocode.testhelp.tests.helloworldparameterizedvalue;
+
+import org.jsmart.zerocode.core.domain.Scenario;
+import org.jsmart.zerocode.core.domain.TargetEnv;
+import org.jsmart.zerocode.core.runner.ZeroCodeUnitRunner;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@TargetEnv("github_host.properties")
+@RunWith(ZeroCodeUnitRunner.class)
+public class HelloWorldParameterizedValueTest {
+
+    @Test
+    @Scenario("parameterized_value/hello_world_test_parameterized_value.json")
+    public void testGetByUserNames() throws Exception {
+    }
+
+}
diff --git a/http-testing/src/test/resources/parameterized_csv/hello_world_test_parameterized_csv.json b/http-testing/src/test/resources/parameterized_csv/hello_world_test_parameterized_csv.json
new file mode 100644
index 00000000..0c495985
--- /dev/null
+++ b/http-testing/src/test/resources/parameterized_csv/hello_world_test_parameterized_csv.json
@@ -0,0 +1,28 @@
+{
+    "scenarioName": "Fetch and assert GitHub userIds by their userNames",
+    "steps": [
+        {
+            "name": "get_user_details",
+            "url": "/users/${0}",
+            "operation": "GET",
+            "request": {
+            },
+            "assertions": {
+                "status": 200,
+                "body": {
+                    "login" : "${0}",
+                    "type" : "User",
+                    "name" : "${1}",
+                    "location" : "${2}",
+                    "id" : "$EQ.${3}"
+                }
+            }
+        }
+    ],
+    "parameterized": {
+        "csvSource":[
+            "octocat, The Octocat, San Francisco, 583231",
+            "siddhagalaxy, Sidd, UK, 33847730"
+        ]
+    }
+}
diff --git a/http-testing/src/test/resources/parameterized_value/hello_world_test_parameterized_value.json b/http-testing/src/test/resources/parameterized_value/hello_world_test_parameterized_value.json
new file mode 100644
index 00000000..226c93df
--- /dev/null
+++ b/http-testing/src/test/resources/parameterized_value/hello_world_test_parameterized_value.json
@@ -0,0 +1,24 @@
+{
+    "scenarioName": "Fetch and assert GitHub userNames",
+    "steps": [
+        {
+            "name": "get_user_details",
+            "url": "/users/${0}",
+            "operation": "GET",
+            "request": {
+            },
+            "assertions": {
+                "status": 200,
+                "body": {
+                    "login" : "${0}"
+                }
+            }
+        }
+    ],
+    "parameterized": {
+        "valueSource":[
+            "octocat",
+            "siddhagalaxy"
+        ]
+    }
+}
diff --git a/junit5-testing/pom.xml b/junit5-testing/pom.xml
index 94340fdc..181e15ea 100644
--- a/junit5-testing/pom.xml
+++ b/junit5-testing/pom.xml
@@ -7,7 +7,6 @@
         <version>1.3.10-SNAPSHOT</version>
     </parent>
 
-    <groupId>org.jsmart</groupId>
     <artifactId>zerocode-tdd-jupiter</artifactId>
 
     <packaging>jar</packaging>
@@ -102,10 +101,6 @@
                     <groupId>org.junit.platform</groupId>
                     <artifactId>junit-platform-runner</artifactId>
                 </exclusion>
-                <exclusion>
-                    <groupId>commons-lang</groupId>
-                    <artifactId>commons-lang</artifactId>
-                </exclusion>
                 <exclusion>
                     <groupId>com.aventstack</groupId>
                     <artifactId>extentreports</artifactId>
diff --git a/junit5-testing/src/main/java/org/jsmart/zerocode/jupiter/demo/Calculator.java b/junit5-testing/src/main/java/org/jsmart/zerocode/jupiter/demo/Calculator.java
new file mode 100644
index 00000000..5c877901
--- /dev/null
+++ b/junit5-testing/src/main/java/org/jsmart/zerocode/jupiter/demo/Calculator.java
@@ -0,0 +1,9 @@
+package org.jsmart.zerocode.jupiter.demo;
+
+public class Calculator {
+
+	public int add(int a, int b) {
+		return a + b;
+	}
+
+}
diff --git a/junit5-testing/src/test/java/org/jsmart/zerocode/jupiter/demo/CalculatorTest.java b/junit5-testing/src/test/java/org/jsmart/zerocode/jupiter/demo/CalculatorTest.java
new file mode 100644
index 00000000..0f862383
--- /dev/null
+++ b/junit5-testing/src/test/java/org/jsmart/zerocode/jupiter/demo/CalculatorTest.java
@@ -0,0 +1,63 @@
+package org.jsmart.zerocode.jupiter.demo;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.apache.commons.lang.text.StrSubstitutor;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.CsvSource;
+import org.junit.jupiter.params.provider.ValueSource;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+class CalculatorTest {
+
+    Calculator calculator = new Calculator();
+
+    @Test
+    @DisplayName("1 + 1 = 2")
+    void addsTwoNumbers() {
+        assertEquals(2, calculator.add(1, 1), "1 + 1 should equal 2");
+    }
+
+    @ParameterizedTest(name = "{0} + {1} = {2}")
+    @CsvSource({
+            "1,    2,   3",
+            "11,  22, 33"
+    })
+    void add(int first, int second, int expectedResult) {
+        Calculator calculator = new Calculator();
+        assertEquals(expectedResult, calculator.add(first, second),
+                () -> first + " + " + second + " should equal " + expectedResult);
+    }
+
+    @ParameterizedTest(name = "{0} + {1} = {2}")
+    @CsvSource({
+            "1,    2,   3",
+            "11,  22, 33",
+            "Hello World,  How, Hello World How"
+    })
+    void conCat(Object first, Object second, Object expectedResult) {
+        Calculator calculator = new Calculator();
+        System.out.println(first + "+" + second + "=" + expectedResult);
+    }
+
+    @ParameterizedTest(name = "run #{index} with [{arguments}]")
+    @ValueSource(strings = {"Hello", "JUnit"})
+    void withValueSource(String word) {
+        assertNotNull(word);
+    }
+
+    @Test
+    void testParamResolver() {
+        String WelcomeMessage="Hello ${firstName} ${lastName}!";
+        Map<String, String> valuesMap = new HashMap<>();
+        valuesMap.put("firstName", "Peter");
+        valuesMap.put("lastName", "Osi");
+        StrSubstitutor sub = new StrSubstitutor(valuesMap);
+        String message = sub.replace(WelcomeMessage);
+        assertEquals("Hello Peter Osi!", message);
+    }
+}