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

shenyi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-echarts.git


The following commit(s) were added to refs/heads/master by this push:
     new 03610cd  test(visual): add a CLI script to generate visual test report 
markdown. (#11553)
03610cd is described below

commit 03610cd7a5b4795e8e54d9d6a21e269f930dd401
Author: Yi Shen <[email protected]>
AuthorDate: Mon Nov 4 12:24:04 2019 +0800

    test(visual): add a CLI script to generate visual test report markdown. 
(#11553)
    
    * test: add report generation script for visual regression testing
    
    * test(visual): optimize generated report
---
 package.json              |   1 +
 test/runTest/genReport.js | 163 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 164 insertions(+)

diff --git a/package.json b/package.json
index de42e55..8cfdd14 100644
--- a/package.json
+++ b/package.json
@@ -19,6 +19,7 @@
     "help": "node build/build.js --help",
     "prepublish": "node build/build.js --prepublish",
     "test:visual": "node test/runTest/server.js",
+    "test:visual:report": "node test/runTest/genReport.js",
     "test": "node build/build.js",
     "mktest": "node test/build/mktest.js",
     "mktest:help": "node test/build/mktest.js -h",
diff --git a/test/runTest/genReport.js b/test/runTest/genReport.js
new file mode 100644
index 0000000..762d206
--- /dev/null
+++ b/test/runTest/genReport.js
@@ -0,0 +1,163 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+
+const fs = require('fs');
+const path = require('path');
+const util = require('util');
+
+// const jimp = require('jimp');
+// const marked = require('marked');
+
+const tests = JSON.parse(fs.readFileSync(
+    path.join(__dirname, 'tmp/__cache__.json'), 'utf-8'
+));
+
+const readFileAsync = util.promisify(fs.readFile);
+
+
+function resolveImagePath(imageUrl) {
+    if (!imageUrl) {
+        return '';
+    }
+
+    // The original image path is relative to the client.
+    return imageUrl.replace(/\.\.\/tmp/g, './tmp');
+}
+
+async function inlineImage(imageUrl) {
+    if (!imageUrl) {
+        return '';
+    }
+    try {
+        let fullPath = path.join(__dirname, resolveImagePath(imageUrl));
+        // let img = await jimp.read(fullPath);
+        // img.quality(70);
+        // return img.getBase64Async('image/jpeg');
+        let imgBuffer = await readFileAsync(fullPath);
+        return 'data:image/png;base64,' + imgBuffer.toString('base64');
+    }
+    catch (e) {
+        console.error(e);
+        return '';
+    }
+
+}
+
+async function genDetail(test) {
+    let shotDetail = '';
+    let prevShotDesc = '';
+    let failed = 0;
+    for (let shot of test.results) {
+        if (shot.diffRatio < 0.001) {
+            continue;
+        }
+        failed++;
+
+        // Batch same description shot
+        if (shot.desc !== prevShotDesc) {
+            shotDetail += `\n#### ${shot.desc}`;
+            prevShotDesc = shot.desc;
+        }
+
+        let [expectedUrl, actualUrl, diffUrl] = await Promise.all([
+            resolveImagePath(shot.expected),
+            resolveImagePath(shot.actual),
+            resolveImagePath(shot.diff)
+        ]);
+        shotDetail += `
+<div style="margin-top:10px">
+<figure style="width: 30%;display:inline-block;margin:0 10px;">
+  <img src="${expectedUrl}" style="width:100%" />
+  <figcaption>Expected ${test.expectedVersion}</figcaption>
+</figure>
+<figure style="width: 30%;display:inline-block;margin:0 10px;">
+  <img src="${actualUrl}" style="width:100%" />
+  <figcaption>Actual ${test.actualVersion}</figcaption>
+</figure>
+<figure style="width: 30%;display:inline-block;margin:0 10px;">
+  <img src="${diffUrl}" style="width:100%" />
+  <figcaption>Diff(${shot.diffRatio && shot.diffRatio.toFixed(3)})</figcaption>
+</figure>
+</div>
+`;
+    }
+    return {
+        content: shotDetail,
+        failed,
+        total: test.results.length
+    };
+}
+
+async function run() {
+    let sections = [];
+
+    let failedTest = 0;
+    for (let test of tests) {
+        let detail = await genDetail(test);
+
+        if (detail.failed > 0) {
+            failedTest++;
+            let title = `${failedTest}. ${test.name} (Failed ${detail.failed} 
/ ${detail.total})`;
+            console.log(title);
+    //         let sectionText = `
+    // ## ${title}
+
+    // <details>
+    //   <summary>Click to expand!</summary>
+    // ${detail.content}
+    // </details>
+    //         `;
+
+            let sectionText = `
+<div style="margin-top: 100px;height: 20px;border-top: 1px solid #aaa"></div>
+<a id="${test.name}"></a>
+
+## ${title}
+
+${detail.content}
+    `;
+
+            sections.push({
+                content: sectionText,
+                title,
+                id: test.name
+            });
+        }
+    }
+
+    let mdText = '# Visual Regression Test Report\n\n';
+    mdText += `
+<p>Total: ${tests.length}</p>
+<p>Failed: ${failedTest}</p>
+
+`;
+    mdText += sections.map(section => {
+        return `+ [${section.title}](#${section.id}) `;
+    }).join('\n');
+    mdText += sections.map(section => section.content).join('\n\n');
+
+    fs.writeFileSync(__dirname + '/tmp-report.md', mdText, 'utf-8');
+
+    // marked(mdText, { smartLists: true }, (err, res) => {
+    //     fs.writeFileSync(__dirname + '/tmp-report.html', res, 'utf-8');
+    // });
+}
+
+run();


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to