diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/CancellationTestExecutor.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/CancellationTestExecutor.java
index a34a29c..36a06c0 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/CancellationTestExecutor.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/CancellationTestExecutor.java
@@ -58,8 +58,9 @@
                 ? upsertParam(params, "client_context_id", ParameterTypeEnum.STRING, clientContextId) : params;
         Callable<InputStream> query = () -> {
             try {
-                return CancellationTestExecutor.super.executeQueryService(str, fmt, uri, newParams, jsonEncoded,
-                        responseCharset, responseCodeValidator, true);
+                return CancellationTestExecutor.super.executeQueryService(str, fmt, uri,
+                        constructQueryParameters(str, fmt, newParams), jsonEncoded, responseCharset,
+                        responseCodeValidator, true);
             } catch (Exception e) {
                 e.printStackTrace();
                 throw e;
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java
index eb71bb6..af82754 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java
@@ -85,6 +85,7 @@
 import org.apache.asterix.testframework.xml.TestCase.CompilationUnit.Parameter;
 import org.apache.asterix.testframework.xml.TestGroup;
 import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.FilenameUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.io.output.ByteArrayOutputStream;
 import org.apache.commons.lang3.StringUtils;
@@ -612,18 +613,19 @@
 
     public InputStream executeQueryService(String str, OutputFormat fmt, URI uri, List<Parameter> params,
             boolean jsonEncoded, Charset responseCharset) throws Exception {
-        return executeQueryService(str, fmt, uri, params, jsonEncoded, responseCharset, null, false);
+        return executeQueryService(str, fmt, uri, constructQueryParameters(str, fmt, params), jsonEncoded,
+                responseCharset, null, false);
     }
 
     public InputStream executeQueryService(String str, OutputFormat fmt, URI uri, List<Parameter> params,
             boolean jsonEncoded, Predicate<Integer> responseCodeValidator) throws Exception {
-        return executeQueryService(str, fmt, uri, params, jsonEncoded, UTF_8, responseCodeValidator, false);
+        return executeQueryService(str, fmt, uri, constructQueryParameters(str, fmt, params), jsonEncoded, UTF_8,
+                responseCodeValidator, false);
     }
 
-    public InputStream executeQueryService(String str, OutputFormat fmt, URI uri, List<Parameter> params,
-            boolean jsonEncoded, Charset responseCharset, Predicate<Integer> responseCodeValidator, boolean cancellable)
-            throws Exception {
+    public List<Parameter> constructQueryParameters(String str, OutputFormat fmt, List<Parameter> params) {
         List<Parameter> newParams = upsertParam(params, "format", ParameterTypeEnum.STRING, fmt.mimeType());
+
         newParams = upsertParam(newParams, QueryServiceServlet.Parameter.PLAN_FORMAT.str(), ParameterTypeEnum.STRING,
                 DEFAULT_PLAN_FORMAT);
         final Optional<String> maxReadsOptional = extractMaxResultReads(str);
@@ -631,12 +633,20 @@
             newParams = upsertParam(newParams, QueryServiceServlet.Parameter.MAX_RESULT_READS.str(),
                     ParameterTypeEnum.STRING, maxReadsOptional.get());
         }
+        return newParams;
+    }
+
+    public InputStream executeQueryService(String str, OutputFormat fmt, URI uri, List<Parameter> params,
+            boolean jsonEncoded, Charset responseCharset, Predicate<Integer> responseCodeValidator, boolean cancellable)
+            throws Exception {
+
         final List<Parameter> additionalParams = extractParameters(str);
         for (Parameter param : additionalParams) {
-            newParams = upsertParam(newParams, param.getName(), param.getType(), param.getValue());
+            params = upsertParam(params, param.getName(), param.getType(), param.getValue());
         }
-        HttpUriRequest method = jsonEncoded ? constructPostMethodJson(str, uri, "statement", newParams)
-                : constructPostMethodUrl(str, uri, "statement", newParams);
+
+        HttpUriRequest method = jsonEncoded ? constructPostMethodJson(str, uri, "statement", params)
+                : constructPostMethodUrl(str, uri, "statement", params);
         // Set accepted output response type
         method.setHeader("Origin", uri.getScheme() + uri.getAuthority());
         method.setHeader("Accept", OutputFormat.CLEAN_JSON.mimeType());
@@ -644,6 +654,7 @@
         if (!responseCharset.equals(UTF_8)) {
             LOGGER.info("using Accept-Charset: {}", responseCharset.name());
         }
+
         HttpResponse response = executeHttpRequest(method);
         if (responseCodeValidator != null) {
             checkResponse(response, responseCodeValidator);
@@ -651,6 +662,13 @@
         return response.getEntity().getContent();
     }
 
+    public InputStream executeQueryService(String str, TestFileContext ctx, OutputFormat fmt, URI uri,
+            List<Parameter> params, boolean jsonEncoded, Charset responseCharset,
+            Predicate<Integer> responseCodeValidator, boolean cancellable) throws Exception {
+        return executeQueryService(str, fmt, uri, constructQueryParameters(str, fmt, params), jsonEncoded,
+                responseCharset, responseCodeValidator, cancellable);
+    }
+
     public synchronized void setAvailableCharsets(Charset... charsets) {
         allCharsets.clear();
         allCharsets.addAll(Arrays.asList(charsets));
@@ -759,6 +777,10 @@
         return builder.build();
     }
 
+    protected void setCharset(RequestBuilder builder, int stmtLength) {
+        builder.setCharset(stmtLength > MAX_NON_UTF_8_STATEMENT_SIZE ? UTF_8 : nextCharset());
+    }
+
     protected HttpUriRequest constructPostMethodUrl(String statement, URI uri, String stmtParam,
             List<Parameter> otherParams) {
         Objects.requireNonNull(stmtParam, "statement parameter required");
@@ -766,7 +788,7 @@
         for (Parameter param : upsertParam(otherParams, stmtParam, ParameterTypeEnum.STRING, statement)) {
             builder.addParameter(param.getName(), param.getValue());
         }
-        builder.setCharset(statement.length() > MAX_NON_UTF_8_STATEMENT_SIZE ? UTF_8 : nextCharset());
+        setCharset(builder, statement.length());
         return builder.build();
     }
 
@@ -967,8 +989,9 @@
                 File actualResultFile = expectedResultFile == null ? null
                         : testCaseCtx.getActualResultFile(cUnit, expectedResultFile, new File(actualPath));
                 ExtractedResult extractedResult = executeQuery(OutputFormat.forCompilationUnit(cUnit), statement,
-                        variableCtx, ctx.getType(), testFile, expectedResultFile, actualResultFile, queryCount,
+                        variableCtx, ctx, expectedResultFile, actualResultFile, queryCount,
                         expectedResultFileCtxs.size(), cUnit.getParameter(), ComparisonEnum.TEXT);
+
                 if (testCaseCtx.getTestCase().isCheckWarnings()) {
                     boolean expectedSourceLoc = testCaseCtx.isSourceLocationExpected(cUnit);
                     validateWarnings(extractedResult.getWarnings(), cUnit.getExpectedWarn(), actualWarnCount,
@@ -983,8 +1006,8 @@
                 }
                 actualResultFile = new File(actualPath, testCaseCtx.getTestCase().getFilePath() + File.separatorChar
                         + cUnit.getName() + '.' + ctx.getSeqNum() + ".adm");
-                executeQuery(OutputFormat.forCompilationUnit(cUnit), statement, variableCtx, ctx.getType(), testFile,
-                        null, actualResultFile, queryCount, expectedResultFileCtxs.size(), cUnit.getParameter(),
+                executeQuery(OutputFormat.forCompilationUnit(cUnit), statement, variableCtx, ctx, null,
+                        actualResultFile, queryCount, expectedResultFileCtxs.size(), cUnit.getParameter(),
                         ComparisonEnum.TEXT);
                 variableCtx.put(key, actualResultFile);
                 break;
@@ -1225,9 +1248,9 @@
         }
         File actualResultFile = new File(actualPath, testCaseCtx.getTestCase().getFilePath() + File.separatorChar
                 + cUnit.getName() + '.' + ctx.getSeqNum() + ".adm");
-        executeQuery(OutputFormat.forCompilationUnit(cUnit), statement, variableCtx, "validate", testFile,
-                expectedResultFile, actualResultFile, queryCount, expectedResultFileCtxs.size(), cUnit.getParameter(),
-                ComparisonEnum.TEXT);
+        executeQuery(OutputFormat.forCompilationUnit(cUnit), statement, variableCtx,
+                new TestFileContext(testFile, "validate"), expectedResultFile, actualResultFile, queryCount,
+                expectedResultFileCtxs.size(), cUnit.getParameter(), ComparisonEnum.TEXT);
     }
 
     protected void executeHttpRequest(OutputFormat fmt, String statement, Map<String, Object> variableCtx,
@@ -1278,23 +1301,30 @@
         queryCount.increment();
     }
 
+    protected Charset getResponseCharset(File expectedResultFile) {
+        return expectedResultFile == null ? UTF_8 : nextCharset();
+    }
+
     public ExtractedResult executeQuery(OutputFormat fmt, String statement, Map<String, Object> variableCtx,
-            String reqType, File testFile, File expectedResultFile, File actualResultFile, MutableInt queryCount,
-            int numResultFiles, List<Parameter> params, ComparisonEnum compare) throws Exception {
+            TestFileContext ctx, File expectedResultFile, File actualResultFile, MutableInt queryCount,
+            int numResultFiles, List<Parameter> params, ComparisonEnum compare, URI uri) throws Exception {
+
         String delivery = DELIVERY_IMMEDIATE;
+        String reqType = ctx.getType();
+        File testFile = ctx.getFile();
         if (reqType.equalsIgnoreCase("async")) {
             delivery = DELIVERY_ASYNC;
         } else if (reqType.equalsIgnoreCase("deferred")) {
             delivery = DELIVERY_DEFERRED;
         }
-        URI uri = testFile.getName().endsWith("aql") ? getEndpoint(Servlets.QUERY_AQL)
-                : getEndpoint(Servlets.QUERY_SERVICE);
+
         boolean isJsonEncoded = isJsonEncoded(extractHttpRequestType(statement));
-        Charset responseCharset = expectedResultFile == null ? UTF_8 : nextCharset();
+
+        Charset responseCharset = getResponseCharset(expectedResultFile);
         InputStream resultStream;
         ExtractedResult extractedResult = null;
         if (DELIVERY_IMMEDIATE.equals(delivery)) {
-            resultStream = executeQueryService(statement, fmt, uri, params, isJsonEncoded, responseCharset, null,
+            resultStream = executeQueryService(statement, ctx, fmt, uri, params, isJsonEncoded, responseCharset, null,
                     isCancellable(reqType));
             switch (reqType) {
                 case METRICS_QUERY_TYPE:
@@ -1345,6 +1375,16 @@
         return extractedResult;
     }
 
+    public ExtractedResult executeQuery(OutputFormat fmt, String statement, Map<String, Object> variableCtx,
+            TestFileContext ctx, File expectedResultFile, File actualResultFile, MutableInt queryCount,
+            int numResultFiles, List<Parameter> params, ComparisonEnum compare) throws Exception {
+        URI uri = getEndpoint(ctx.getFile().getName().endsWith("aql") ? Servlets.QUERY_AQL : Servlets.QUERY_SERVICE,
+                FilenameUtils.getExtension(ctx.getFile().getName()));
+        return executeQuery(fmt, statement, variableCtx, ctx, expectedResultFile, actualResultFile, queryCount,
+                numResultFiles, params, compare, uri);
+
+    }
+
     private void polldynamic(TestCaseContext testCaseCtx, TestFileContext ctx, Map<String, Object> variableCtx,
             String statement, boolean isDmlRecoveryTest, ProcessBuilder pb, CompilationUnit cUnit,
             MutableInt queryCount, List<TestFileContext> expectedResultFileCtxs, File testFile, String actualPath,
@@ -1870,6 +1910,10 @@
         return createEndpointURI(Servlets.getAbsolutePath(getPath(servlet)), null);
     }
 
+    public URI getEndpoint(String servlet, String extension) throws URISyntaxException {
+        return createEndpointURI(Servlets.getAbsolutePath(getPath(servlet)), null);
+    }
+
     public static String stripJavaComments(String text) {
         return JAVA_BLOCK_COMMENT_PATTERN.matcher(text).replaceAll("");
     }
@@ -2110,7 +2154,7 @@
             throws Exception {
         final URI uri = getQueryServiceUri(testFile);
         final InputStream inputStream = executeQueryService(statement, OutputFormat.forCompilationUnit(cUnit), uri,
-                cUnit.getParameter(), true, responseCharset, null, false);
+                cUnit.getParameter(), true, responseCharset);
         return ResultExtractor.extract(inputStream, responseCharset).getResult();
     }
 
diff --git a/asterixdb/asterix-test-framework/src/main/java/org/apache/asterix/testframework/context/TestFileContext.java b/asterixdb/asterix-test-framework/src/main/java/org/apache/asterix/testframework/context/TestFileContext.java
index 3ae6dcd..46aa9fd 100644
--- a/asterixdb/asterix-test-framework/src/main/java/org/apache/asterix/testframework/context/TestFileContext.java
+++ b/asterixdb/asterix-test-framework/src/main/java/org/apache/asterix/testframework/context/TestFileContext.java
@@ -31,6 +31,11 @@
         this.file = file;
     }
 
+    public TestFileContext(File file, String type) {
+        this.file = file;
+        this.type = type;
+    }
+
     public File getFile() {
         return file;
     }
