You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@echarts.apache.org by sh...@apache.org on 2021/04/29 11:40:45 UTC

[echarts] branch enhance-visual-regression-test updated: test(visual): store results of each two versions

This is an automated email from the ASF dual-hosted git repository.

shenyi pushed a commit to branch enhance-visual-regression-test
in repository https://gitbox.apache.org/repos/asf/echarts.git


The following commit(s) were added to refs/heads/enhance-visual-regression-test by this push:
     new 9b97e37  test(visual): store results of each two versions
9b97e37 is described below

commit 9b97e37654953c8316f8f433e0d2436d761c2790
Author: pissang <bm...@gmail.com>
AuthorDate: Thu Apr 29 19:39:42 2021 +0800

    test(visual): store results of each two versions
---
 test/runTest/cli.js           | 15 +++++++-------
 test/runTest/client/client.js | 33 +++++++++++++------------------
 test/runTest/server.js        | 46 ++++++++++++++++++++++++++++++-------------
 test/runTest/store.js         | 36 ++++++++++++++++++++++++---------
 4 files changed, 80 insertions(+), 50 deletions(-)

diff --git a/test/runTest/cli.js b/test/runTest/cli.js
index f972643..f6f5ed4 100644
--- a/test/runTest/cli.js
+++ b/test/runTest/cli.js
@@ -38,7 +38,8 @@ program
     .option('--expected <expected>', 'Expected version')
     .option('--actual <actual>', 'Actual version')
     .option('--renderer <renderer>', 'svg/canvas renderer')
-    .option('--no-save', 'Don\'t save result');
+    .option('--no-save', 'Don\'t save result')
+    .option('--dir <dir>', 'Out dir');
 
 program.parse(process.argv);
 
@@ -46,13 +47,14 @@ program.speed = +program.speed || 1;
 program.actual = program.actual || 'local';
 program.expected = program.expected || '4.2.1';
 program.renderer = (program.renderer || 'canvas').toLowerCase();
+program.dir = program.dir || (__dirname + '/tmp');
 
 if (!program.tests) {
     throw new Error('Tests are required');
 }
 
 function getScreenshotDir() {
-    return 'tmp/__screenshot__';
+    return `${program.dir}/__screenshot__`;
 }
 
 function sortScreenshots(list) {
@@ -98,9 +100,6 @@ async function convertToWebP(filePath, lossless) {
 
 async function takeScreenshot(page, fullPage, fileUrl, desc, isExpected, minor) {
     let screenshotName = testNameFromFile(fileUrl);
-    if (program.renderer === 'svg') {
-        screenshotName += '-_svg_render_';
-    }
     if (desc) {
         screenshotName += '-' + slugify(desc, { replacement: '-', lower: true });
     }
@@ -108,8 +107,8 @@ async function takeScreenshot(page, fullPage, fileUrl, desc, isExpected, minor)
         screenshotName += '-' + minor;
     }
     let screenshotPrefix = isExpected ? 'expected' : 'actual';
-    fse.ensureDirSync(path.join(__dirname, getScreenshotDir()));
-    let screenshotPath = path.join(__dirname, `${getScreenshotDir()}/${screenshotName}-${screenshotPrefix}.png`);
+    fse.ensureDirSync(getScreenshotDir());
+    let screenshotPath = path.join(getScreenshotDir(), `${screenshotName}-${screenshotPrefix}.png`);
     await page.screenshot({
         path: screenshotPath,
         fullPage
@@ -277,7 +276,7 @@ async function runTest(browser, testOpt, runtimeCode, expectedVersion, actualVer
                     actual.rawScreenshotPath
                 );
 
-                const diffPath = `${path.resolve(__dirname, getScreenshotDir())}/${shot.screenshotName}-diff.png`;
+                const diffPath = `${getScreenshotDir()}/${shot.screenshotName}-diff.png`;
                 await writePNG(diffPNG, diffPath);
                 const diffWebpPath = await convertToWebP(diffPath);
 
diff --git a/test/runTest/client/client.js b/test/runTest/client/client.js
index 7419932..016d847 100644
--- a/test/runTest/client/client.js
+++ b/test/runTest/client/client.js
@@ -127,11 +127,16 @@ const app = new Vue({
 
     mounted() {
         this.fetchVersions(false);
-        this.fetchVersions(true);
-
-        setTimeout(() => {
-            this.scrollToCurrent();
-        }, 500);
+        this.fetchVersions(true).then(() => {
+            socket.emit('setTestVersions', {
+                expectedVersion: app.runConfig.expectedVersion,
+                actualVersion: app.runConfig.actualVersion,
+                renderer: app.runConfig.renderer,
+            });
+            setTimeout(() => {
+                this.scrollToCurrent();
+            }, 500);
+        })
     },
 
     computed: {
@@ -318,7 +323,7 @@ const app = new Vue({
             const url = this.runConfig[isActual ? 'isActualNightly' : 'isExpectedNightly']
                 ? 'https://data.jsdelivr.com/v1/package/npm/echarts-nightly'
                 : 'https://data.jsdelivr.com/v1/package/npm/echarts'
-            fetch(url, {
+            return fetch(url, {
                 mode: 'cors'
             }).then(res => res.json()).then(json => {
                 this[prop] = json.versions;
@@ -366,15 +371,15 @@ function runTests(tests) {
 
 socket.on('connect', () => {
     console.log('Connected');
-
-    app.$el.style.display = 'block';
 });
 
 let firstUpdate = true;
 socket.on('update', msg => {
+    app.$el.style.display = 'block';
+
     let hasFinishedTest = !!msg.tests.find(test => test.status === 'finished');
     if (!hasFinishedTest && firstUpdate) {
-        app.$confirm('It seems you haven\'t run any test yet!<br />Do you want to start now?', 'Tip', {
+        app.$confirm('You haven\'t run any test on these two versions yet!<br />Do you want to start now?', 'Tip', {
             confirmButtonText: 'Yes',
             cancelButtonText: 'No',
             dangerouslyUseHTMLString: true,
@@ -409,16 +414,6 @@ socket.on('abort', res => {
     app.running = false;
 });
 
-// function handleUrlChanged() {
-//     const params = parseParams(window.location.search.substr(1));
-//     app.currentTestName = params.test;
-//     try {
-//         Object.assign(app.runConfig, JSON.parse(params.runConfig));
-//     }
-//     catch (e) {}
-// }
-
-
 function updateUrl(notRefresh) {
     const searchUrl = assembleParams({
         test: app.currentTestName,
diff --git a/test/runTest/server.js b/test/runTest/server.js
index 1336172..b478d76 100644
--- a/test/runTest/server.js
+++ b/test/runTest/server.js
@@ -24,12 +24,14 @@ const path = require('path');
 const {fork} = require('child_process');
 const semver = require('semver');
 const {port, origin} = require('./config');
-const {getTestsList, updateTestsList, saveTestsList, mergeTestsResults, updateActionsMeta} = require('./store');
+const {getTestsList, updateTestsList, saveTestsList, mergeTestsResults, updateActionsMeta, getResultBaseDir} = require('./store');
 const {prepareEChartsLib, getActionsFullPath} = require('./util');
 const fse = require('fs-extra');
 const fs = require('fs');
 const open = require('open');
 
+const TEST_HASH_SPLITTER = '__';
+
 function serve() {
     const server = http.createServer((request, response) => {
         return handler(request, response, {
@@ -52,7 +54,7 @@ function serve() {
 
 let runningThreads = [];
 let pendingTests;
-let aborted = false;
+let aborted = true;
 
 function stopRunningTests() {
     if (runningThreads) {
@@ -132,7 +134,10 @@ function startTests(testsNameList, socket, {
             });
 
             if (!aborted) {
-                socket.emit('update', {tests: getTestsList(), running: true});
+                socket.emit('update', {
+                    tests: getTestsList(),
+                    running: true
+                });
             }
         }
         let runningCount = 0;
@@ -146,7 +151,10 @@ function startTests(testsNameList, socket, {
         function onUpdate() {
             // Merge tests.
             if (!aborted && !noSave) {
-                socket.emit('update', {tests: getTestsList(), running: true});
+                socket.emit('update', {
+                    tests: getTestsList(),
+                    running: true
+                });
             }
         }
         threadsCount = Math.min(threadsCount, pendingTests.length);
@@ -163,6 +171,7 @@ function startTests(testsNameList, socket, {
                 '--actual', actualVersion,
                 '--expected', expectedVersion,
                 '--renderer', renderer || '',
+                '--dir', getResultBaseDir(),
                 ...(noHeadless ? ['--no-headless'] : []),
                 ...(noSave ? ['--no-save'] : [])
             ]);
@@ -186,6 +195,14 @@ function checkPuppeteer() {
     }
 }
 
+function getTestHash(params) {
+    return [
+        params.expectedVersion,
+        params.actualVersion,
+        params.renderer
+    ].join(TEST_HASH_SPLITTER);
+}
+
 async function start() {
     if (!checkPuppeteer()) {
         // TODO Check version.
@@ -202,26 +219,27 @@ async function start() {
     let {io} = serve();
 
     io.of('/client').on('connect', async socket => {
-        await updateTestsList();
-
         function abortTests() {
+            if (aborted) {
+                return;
+            }
             stopRunningTests();
             io.of('/client').emit('abort');
             aborted = true;
         }
 
-        function emitUpdatedList() {
+        socket.on('setTestVersions', async (params) => {
+            abortTests();
+
+            await updateTestsList(
+                getTestHash(params),
+                true
+            );
+
             socket.emit('update', {
                 tests: getTestsList(),
                 running: runningThreads.length > 0
             });
-        }
-
-        emitUpdatedList();
-
-        socket.on('fetch', () => {
-            abortTests();
-            emitUpdatedList();
         });
 
         socket.on('run', async data => {
diff --git a/test/runTest/store.js b/test/runTest/store.js
index 0a956b9..62db9a3 100644
--- a/test/runTest/store.js
+++ b/test/runTest/store.js
@@ -27,6 +27,7 @@ const {blacklist, SVGBlacklist} = require('./blacklist');
 
 let _tests = [];
 let _testsMap = {};
+let _testHash = '';
 
 class Test {
     constructor(fileUrl) {
@@ -58,8 +59,14 @@ class Test {
     }
 }
 
-function getCacheFilePath() {
-    return path.join(__dirname, 'tmp/__cache__.json');;
+function getResultBaseDir() {
+    return path.join(__dirname, 'tmp', 'result', _testHash);
+}
+
+module.exports.getResultBaseDir = getResultBaseDir;
+
+function getCacheFilePath(baseDir) {
+    return path.join(getResultBaseDir(), '__result__.json');;
 }
 
 module.exports.getTestsList = function () {
@@ -70,15 +77,21 @@ module.exports.getTestByFileUrl = function (url) {
     return _testsMap[url];
 };
 
-module.exports.updateTestsList = async function (setPendingTestToUnsettled) {
-    let tmpFolder = path.join(__dirname, 'tmp');
-    fse.ensureDirSync(tmpFolder);
+module.exports.updateTestsList = async function (
+    testHash,
+    setPendingTestToUnsettled
+) {
+    _testHash = testHash;
     _tests = [];
     _testsMap = {};
+    _testsExists = {};
+
+    fse.ensureDirSync(getResultBaseDir());
+
     try {
         let cachedStr = fs.readFileSync(getCacheFilePath(), 'utf-8');
-        _tests = JSON.parse(cachedStr);
-        _tests.forEach(test => {
+        const tests = JSON.parse(cachedStr);
+        tests.forEach(test => {
             // In somehow tests are stopped and leave the status pending.
             // Set the status to unsettled again.
             if (setPendingTestToUnsettled) {
@@ -90,7 +103,6 @@ module.exports.updateTestsList = async function (setPendingTestToUnsettled) {
         });
     }
     catch(e) {
-        _tests = [];
     }
     // Find if there is new html file
     const files = await util.promisify(glob)('**.html', { cwd: path.resolve(__dirname, '../') });
@@ -98,6 +110,8 @@ module.exports.updateTestsList = async function (setPendingTestToUnsettled) {
         if (blacklist.includes(fileUrl)) {
             return;
         }
+        _testsExists[fileUrl] = true;
+
         if (_testsMap[fileUrl]) {
             return;
         }
@@ -105,10 +119,14 @@ module.exports.updateTestsList = async function (setPendingTestToUnsettled) {
         const test = new Test(fileUrl);
         test.ignoreSVG = SVGBlacklist.includes(fileUrl);
 
-        _tests.push(test);
         _testsMap[fileUrl] = test;
     });
 
+    // Exclude tests that there is no HTML files.
+    Object.keys(_testsExists).forEach(key => {
+        _tests.push(_testsMap[key]);
+    });
+
     const actionsMetaData = {};
     const metaPath = path.join(__dirname, 'actions/__meta__.json');
     try {

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org