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]