IMPALA-13985: Fix webUI JS tests naming scheme

The names of webUI's JS tests seem arbitrary and vary widely from the
the general naming scheme of other test framework generated JUnitXMLs.

This patch provides consistency to the naming scheme.

All the webUI JS tests follow the following naming scheme now.

    webui.js_tests.<module>.<function>.<description>

jest-junit package has been configured to use the following config -
{
  "classNameTemplate": "{classname}",
  "titleTemplate": "{title}",
  "ancestorSeparator": "."
}

Example:
  Within JUnitXML,
    <testsuites ... >
      ...
      <testsuite
        name = "webui.js_tests.fragment_diagram.getSvgTests"
        ... >
        ...
        <testcase
          classname="webui.js_tests.fragment_diagram.getSvgTests"
          name="basic_case.SvgRect"
          ... >
        </testcase>
        ...
      </testsuite>
      ...
    </testsuites>

Change-Id: I5715d47cef5c1c3c06b4f2de7fe467aee3de8868
Reviewed-on: http://gerrit.cloudera.org:8080/23071
Tested-by: Impala Public Jenkins <impala-public-jenkins@cloudera.com>
Reviewed-by: Riza Suminto <riza.suminto@cloudera.com>
This commit is contained in:
Surya Hebbar
2025-06-23 19:41:18 +05:30
committed by Riza Suminto
parent b201b81598
commit 08ae29f47b
6 changed files with 34 additions and 32 deletions

View File

@@ -15,6 +15,9 @@
"reporters": [ "default", "jest-junit" ]
},
"jest-junit": {
"outputName": "js-tests.xml"
"outputName": "js-tests.xml",
"classNameTemplate": "{classname}",
"titleTemplate": "{title}",
"ancestorSeparator": "."
}
}

View File

@@ -19,10 +19,10 @@ import {describe, test, expect} from "@jest/globals";
import {readFileSync} from "node:fs";
// JEST does not support workers, so "profileParseWorker.js" cannot be tested directly
describe("Test Compression Library", () => {
describe("webui.js_tests.queries.profileParseWorker", () => {
// Test whether the compression library imported by the worker script
// properly utilizes the pako library's compression methods
test("Basic Test", () => {
test("basic_test", () => {
const exampleJSONProfileText = readFileSync("../../../testdata/impala-profiles/"
+ "impala_profile_log_tpcds_compute_stats_extended.expected.pretty.json",
{encoding : "utf-8"});

View File

@@ -20,10 +20,10 @@ import {exportedForTest, generateTimesamples, clearTimeseriesValues,
mapTimeseriesCounters, aggregateProfileTimeseries} from
"scripts/query_timeline/chart_commons.js";
describe("Test mapTimeseriesCounters", () => {
describe("webui.js_tests.chart_commons.mapTimeseriesCounters", () => {
// Test whether the method correctly searches and maps indexes of counters based
// on counter_name
test("Basic Test (Serial Order)", () => {
test("basic_test.serial_order", () => {
const parent_profile =
{
"profile_name" : "Per Node Profiles",
@@ -65,7 +65,7 @@ describe("Test mapTimeseriesCounters", () => {
}
});
test("Basic Test (Reverse Order)", () => {
test("basic_test.reverse_order", () => {
const parent_profile =
{
"profile_name" : "Per Node Profiles",
@@ -107,7 +107,7 @@ describe("Test mapTimeseriesCounters", () => {
}
});
test("Edge Case (No such 'counter_name' within profile)", () => {
test("edge_case.counter_name_undefined", () => {
const parent_profile =
{
"profile_name" : "Per Node Profiles",
@@ -151,12 +151,12 @@ describe("Test mapTimeseriesCounters", () => {
});
});
describe("Test accumulateTimeseriesValues", () => {
describe("webui.js_tests.chart_commons.accumulateTimeseriesValues", () => {
// Test whether the method correctly accumlates values after parsing values from 'data'
// in 'time_series_counters' and correctly updates 'max_samples' even in corner cases
const {accumulateTimeseriesValues} = exportedForTest;
const DATA_TYPE = "value type";
test("Basic Case (time_series_counter.num > max_samples.collected)", () => {
test("basic_case.samples_greater_than_collected", () => {
const max_samples = {
allocated : 7,
period : 0,
@@ -183,7 +183,7 @@ describe("Test accumulateTimeseriesValues", () => {
});
});
test("Basic Case (time_series_counter.period > max_samples.period", () => {
test("basic_case.sample_period_greater_than_current_period", () => {
const max_samples = {
allocated : 7,
period : 100,
@@ -210,8 +210,7 @@ describe("Test accumulateTimeseriesValues", () => {
});
});
test(`Basic Case (time_series_counter.period <= max_samples.period
&& time_series_counter.num <= max_samples.collected)`, () => {
test("basic_case.period_and_samples_num_within_limits", () => {
const max_samples = {
allocated : 7,
period : 100,
@@ -238,7 +237,7 @@ describe("Test accumulateTimeseriesValues", () => {
});
});
test(`Edge Case (values_array length is smaller than collected samples)`, () => {
test("edge_case.allocated_values_array_smaller_than_collected_samples", () => {
const max_samples = {
allocated : 2,
period : 100,
@@ -266,11 +265,11 @@ describe("Test accumulateTimeseriesValues", () => {
});
});
describe("Test generateTimesamples", () => {
describe("webui.js_tests.chart_commons.generateTimesamples", () => {
// Test whether time sample values generated based on 'max_samples' are correct,
// even in corner cases, with different 'max_samples' scenarios
const DATA_TYPE = "timesample type";
test("Basic Case (max_samples.allocated > max_samples.available)", () => {
test("basic_case.available_samples_within_allocated_size", () => {
const max_samples = {
allocated : 10,
period : 1000,
@@ -286,7 +285,7 @@ describe("Test generateTimesamples", () => {
null, null, null, null]);
});
test("Edge Case (max_samples.allocated < max_samples.available)", () => {
test("edge_case.available_samples_exceed_allocated_size", () => {
const max_samples = {
allocated : 10,
period : 1000,
@@ -302,7 +301,7 @@ describe("Test generateTimesamples", () => {
4.5, 5]);
});
test("Edge Case (max_samples.allocated = max_samples.available)", () => {
test("edge_case.same_num_available_samples_and_allocated", () => {
const max_samples = {
allocated : 10,
period : 1000,
@@ -318,10 +317,10 @@ describe("Test generateTimesamples", () => {
});
});
describe("Test clearTimeseriesValues", () => {
describe("webui.js_tests.chart_commons.clearTimeseriesValues", () => {
// Test whether Timeseries arrays are being properly truncated in the correct range
const DATA_TYPE = "value type";
test("Basic Case (max_samples.available < max_samples.allocated)", () => {
test("basic_case.available_samples_within_allocated_size", () => {
const max_samples = {
allocated : 7,
period : 1000,
@@ -335,7 +334,7 @@ describe("Test clearTimeseriesValues", () => {
expect(values_array).toEqual([DATA_TYPE, 0, null, null, null, 10, 100, 10]);
});
test("Edge Case (max_samples.available >= max_samples.allocated)", () => {
test("edge_case.available_samples_exceed_allocated_size", () => {
const max_samples = {
allocated : 7,
period : 1000,
@@ -351,9 +350,9 @@ describe("Test clearTimeseriesValues", () => {
});
});
describe("Test aggregateProfileTimeseries", () => {
describe("webui.js_tests.chart_commons.aggregateProfileTimeseries", () => {
// Test correctness of values being aggregated from parsing the profile
test("Basic Case", () => {
test("basic_case", () => {
const parent_profile =
{
"profile_name" : "Per Node Profiles",

View File

@@ -18,13 +18,13 @@
import {describe, test, expect} from "@jest/globals";
import {exportedForTest} from "scripts/query_timeline/fragment_diagram.js";
describe("Test getSvg*", () => {
describe("webui.js_tests.fragment_diagram.getSvgTests", () => {
// Test whether getSvg* methods correctly set attributes and return expected elements
const {getSvgRect, getSvgLine, getSvgText, getSvgTitle, getSvgGroup} = exportedForTest;
const stroke_fill_colors = {black : "#000000", dark_grey : "#505050",
light_grey : "#F0F0F0", transperent : "rgba(0, 0, 0, 0)"};
test("Test getSvgRect", () => {
test("basic_case.SvgRect", () => {
expect(getSvgRect(stroke_fill_colors.transperent, 0, 0, 100, 100, "2 2",
stroke_fill_colors.black).outerHTML).toBe(
`<rect x="0" y="0" width="100" height="100"`
@@ -34,14 +34,14 @@ describe("Test getSvg*", () => {
+ ` stroke-dasharray="2 2"></rect>`);
});
test("Test getSvgLine", () => {
test("basic_case.SvgLine", () => {
expect(getSvgLine(stroke_fill_colors.black, 0, 0, 100, 100, true).outerHTML).toBe(
`<line x1="0" y1="0" x2="100" y2="100"`
+ ` stroke="${stroke_fill_colors.black}"`
+ ` stroke-dasharray="2 2"></line>`);
});
test("Test getSvgText", () => {
test("basic_case.SvgText", () => {
expect(getSvgText("Text", stroke_fill_colors.black, 0, 0, 15, true, 300)
.outerHTML).toBe(
`<text x="0" y="0" style="font-size: 10px;" dominant-baseline="middle" `
@@ -49,11 +49,11 @@ describe("Test getSvg*", () => {
+ `lengthAdjust="spacingAndGlyphs">Text</text>`);
});
test("Test getSvgTitle", () => {
test("basic_case.SvgTitle", () => {
expect(getSvgTitle("Title").outerHTML).toBe("<title>Title</title>");
});
test("Test getSvgGroup", () => {
test("basic_case.SvgGroup", () => {
expect(getSvgGroup().outerHTML).toBe("<g></g>");
});
});

View File

@@ -17,11 +17,11 @@
import {exportedForTest} from "scripts/query_timeline/fragment_metrics_diagram.js";
describe("Test initializeFragmentMetrics", () => {
describe("webui.js_tests.fragment_metrics_diagram.initializeFragmentMetrics", () => {
// Test whether aggregate arrays and time sample arrays are correctly allocated
// based on counters and max_samples
const {initializeFragmentMetrics} = exportedForTest;
test("Basic Test", () => {
test("basic_case", () => {
const parent_profile =
{
"profile_name" : "Coordinator Fragment F31",

View File

@@ -18,11 +18,11 @@
import {describe, test, expect} from "@jest/globals";
import {exportedForTest} from "scripts/query_timeline/host_utilization_diagram.js";
describe("Test initializeUtilizationMetrics", () => {
describe("webui.js_tests.host_utilization_diagram.initializeUtilizationMetrics", () => {
// Test whether aggregate arrays and time sample arrays are correctly allocated
// based on counters and max_samples
const {initializeUtilizationMetrics} = exportedForTest;
test("Basic Test", () => {
test("basic_case", () => {
const parent_profile =
{
"profile_name" : "Per Node Profiles",