Skip to content

Commit 3bbcfe3

Browse files
committed
Test result outputs
1 parent cdc7a74 commit 3bbcfe3

9 files changed

Lines changed: 207 additions & 130 deletions

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,5 @@ node_modules/
1212
.envrc
1313
server.js
1414
*.sublime-workspace
15-
chromedriver.log
15+
chromedriver.log
16+
.baseline
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"tests":{"cases/background/encoded.html":98,"cases/background/linear-gradient.html":82.27},"date":"2012-12-28T16:48:04.248Z","version":"23.0.1271.97"}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"tests":{"cases/background/encoded.html":100,"cases/background/linear-gradient.html":82.27},"date":"2012-12-28T17:20:56.098Z","version":"23.0.1271.97"}

tests/results/chrome.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"tests":{"cases/background/encoded.html":100,"cases/background/linear-gradient.html":82.27},"date":"2012-12-28T16:48:04.248Z","version":"23.0.1271.97"}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"tests":{"cases/background/encoded.html":100,"cases/background/linear-gradient.html":92.64},"date":"2012-12-28T16:48:10.772Z","version":"12.0"}

tests/results/firefox.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"tests":{"cases/background/encoded.html":100,"cases/background/linear-gradient.html":85.64},"date":"2012-12-28T16:48:10.772Z","version":"12.0"}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"tests":{"cases/background/encoded.html":100,"cases/background/linear-gradient.html":100},"date":"2012-12-28T16:48:04.855Z","version":"9"}

tests/results/iexplorer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"tests":{"cases/background/encoded.html":100,"cases/background/linear-gradient.html":100},"date":"2012-12-28T16:48:04.855Z","version":"9"}

tests/selenium.js

Lines changed: 198 additions & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -1,154 +1,223 @@
1-
var webdriver = require("webdriver.js").webdriver,
2-
http = require("http"),
3-
url = require("url"),
4-
path = require("path"),
5-
base64_arraybuffer = require('base64-arraybuffer'),
6-
PNG = require('png-js'),
7-
fs = require("fs");
8-
9-
10-
function createServer(port) {
11-
return http.createServer(function(request, response) {
12-
var uri = url.parse(request.url).pathname,
13-
filename = path.join(process.cwd(), "../" + uri);
14-
15-
fs.exists(filename, function(exists) {
16-
if(!exists) {
17-
response.writeHead(404, {
18-
"Content-Type": "text/plain"
19-
});
20-
response.write("404 Not Found\n");
21-
response.end();
22-
return;
23-
}
24-
25-
if (fs.statSync(filename).isDirectory()) filename += '/index.html';
26-
27-
fs.readFile(filename, "binary", function(err, file) {
28-
if(err) {
29-
response.writeHead(500, {
1+
(function(){
2+
"use strict;"
3+
var webdriver = require("webdriver.js").webdriver,
4+
http = require("http"),
5+
url = require("url"),
6+
path = require("path"),
7+
base64_arraybuffer = require('base64-arraybuffer'),
8+
PNG = require('png-js'),
9+
fs = require("fs");
10+
11+
function createServer(port) {
12+
return http.createServer(function(request, response) {
13+
var uri = url.parse(request.url).pathname,
14+
filename = path.join(process.cwd(), "../" + uri);
15+
16+
fs.exists(filename, function(exists) {
17+
if(!exists) {
18+
response.writeHead(404, {
3019
"Content-Type": "text/plain"
3120
});
32-
response.write(err + "\n");
21+
response.write("404 Not Found\n");
3322
response.end();
3423
return;
3524
}
3625

37-
response.writeHead(200);
38-
response.write(file, "binary");
39-
response.end();
26+
if (fs.statSync(filename).isDirectory()) filename += '/index.html';
27+
28+
fs.readFile(filename, "binary", function(err, file) {
29+
if(err) {
30+
response.writeHead(500, {
31+
"Content-Type": "text/plain"
32+
});
33+
response.write(err + "\n");
34+
response.end();
35+
return;
36+
}
37+
38+
response.writeHead(200);
39+
response.write(file, "binary");
40+
response.end();
41+
});
4042
});
41-
});
4243

43-
}).listen(port);
44-
}
45-
46-
function walkDir(dir, done) {
47-
var results = [];
48-
fs.readdir(dir, function(err, list) {
49-
if (err) return done(err);
50-
var i = 0;
51-
(function next() {
52-
var file = list[i++];
53-
if (!file) return done(null, results);
54-
file = dir + '/' + file;
55-
fs.stat(file, function(err, stat) {
56-
if (stat && stat.isDirectory()) {
57-
walkDir(file, function(err, res) {
58-
results = results.concat(res);
44+
}).listen(port);
45+
}
46+
47+
function walkDir(dir, done) {
48+
var results = [];
49+
fs.readdir(dir, function(err, list) {
50+
if (err) return done(err);
51+
var i = 0;
52+
(function next() {
53+
var file = list[i++];
54+
if (!file) return done(null, results);
55+
file = dir + '/' + file;
56+
fs.stat(file, function(err, stat) {
57+
if (stat && stat.isDirectory()) {
58+
walkDir(file, function(err, res) {
59+
results = results.concat(res);
60+
next();
61+
});
62+
} else {
63+
results.push(file);
5964
next();
60-
});
61-
} else {
62-
results.push(file);
63-
next();
64-
}
65-
});
66-
})();
67-
});
68-
};
69-
70-
function getPixelArray(base64, func) {
71-
var arraybuffer = base64_arraybuffer.decode(base64);
72-
(new PNG(arraybuffer)).decode(func);
73-
}
74-
75-
76-
function testPage(browser, url, done) {
77-
78-
browser.url(url)
79-
.$(".html2canvas", 5000, function(){
80-
this.execute(function(){
81-
var canvas = $('.html2canvas')[0];
82-
return canvas.toDataURL("image/png").substring(22);
83-
},[], function(dataurl) {
84-
getPixelArray(dataurl, function(h2cPixels) {
85-
browser.screenshot(function(base64){
86-
getPixelArray(base64, function(screenPixels) {
87-
var len = h2cPixels.length, index = 0, diff = 0;
88-
for (; index < len; index++) {
89-
if (screenPixels[index] - h2cPixels[index] !== 0) {
90-
diff++;
65+
}
66+
});
67+
})();
68+
});
69+
};
70+
71+
function getPixelArray(base64, func) {
72+
var arraybuffer = base64_arraybuffer.decode(base64);
73+
(new PNG(arraybuffer)).decode(func);
74+
}
75+
76+
77+
function testPage(browser, url, done) {
78+
79+
browser.url(url)
80+
.$(".html2canvas", 5000, function(){
81+
this.execute(function(){
82+
var canvas = $('.html2canvas')[0];
83+
return canvas.toDataURL("image/png").substring(22);
84+
},[], function(dataurl) {
85+
getPixelArray(dataurl, function(h2cPixels) {
86+
browser.screenshot(function(base64){
87+
getPixelArray(base64, function(screenPixels) {
88+
var len = h2cPixels.length, index = 0, diff = 0;
89+
for (; index < len; index++) {
90+
if (screenPixels[index] - h2cPixels[index] !== 0) {
91+
diff++;
92+
}
9193
}
92-
}
93-
done(100 - (Math.round((diff/h2cPixels.length) * 10000) / 100));
94-
});
95-
})
94+
done(100 - (Math.round((diff/h2cPixels.length) * 10000) / 100));
95+
});
96+
})
97+
});
9698
});
9799
});
98-
});
99-
}
100+
}
100101

101-
function runBrowsers(pages){
102+
var writeResultFile = function(filename, json, append) {
103+
fs.writeFile(filename + (append || ""), json);
104+
};
102105

103-
var port = 5555,
104-
stats = {},
105-
browsers = ["chrome", "firefox", "internet explorer"],
106-
browsersDone = 0,
107-
server = createServer(port),
108-
numPages = pages.length;
106+
var openResultFile = function(stats, browser) {
107+
var tests = stats[browser].tests,
108+
filename = "results/" + browser + ".json",
109+
write = writeResultFile.bind(null, filename, JSON.stringify(stats[browser]));
109110

110-
var browserDone = function() {
111-
if (++browsersDone >= browsers.length) {
112-
server.close();
113-
console.log(stats);
114-
}
111+
fs.exists(filename, function(exists) {
112+
if(exists) {
113+
fs.readFile(filename, "binary", parseResultFile.bind(null, tests, browser, write));
114+
} else {
115+
write();
116+
}
117+
});
115118
};
116119

117-
browsers.forEach(function(browserName){
118-
var browser = new webdriver({
119-
browser: browserName
120-
}),
121-
browserType;
122-
123-
browser.status(function(browserInfo){
124-
browserType = [browserName, browser.version, browserInfo.os.name.replace(/\s+/g, "-").toLowerCase()].join("-");
125-
var date = new Date(),
126-
obj = {
127-
tests: {},
128-
date: date.toISOString()
120+
var setColor = function(color, text) {
121+
return color + text.amount + "% " + text.test;
122+
};
123+
124+
var parseResultFile = function(tests, browser, createResultFile, err, file) {
125+
if (err) throw err;
126+
var data = JSON.parse(file),
127+
improved = [],
128+
colors = {
129+
red: "\x1b[1;31m",
130+
green: "\x1b[0;32m"
131+
},
132+
regressed = [];
133+
134+
Object.keys(tests).forEach(function(test){
135+
var testResult = tests[test],
136+
dataResult = data.tests[test],
137+
dataObject = {
138+
amount: testResult - dataResult,
139+
test: test
129140
};
130-
stats[browserType] = obj;
131-
stats[browserName] = obj;
132-
processPage(0);
141+
142+
if (testResult > dataResult) {
143+
improved.push(dataObject);
144+
} else if (testResult < dataResult) {
145+
regressed.push(dataObject);
146+
}
147+
133148
});
134149

135-
function processPage(index) {
136-
var page = pages[index++];
137-
testPage(browser, "http://localhost:" + port + "/tests/" + page + "?selenium", function(result) {
138-
if (numPages > index) {
139-
processPage(index);
140-
} else {
141-
browser.close(browserDone);
142-
}
143-
stats[browserType].tests[page] = result;
150+
if (improved.length > 0 || regressed.length > 0) {
151+
if (regressed.length === 0) {
152+
createResultFile(".baseline");
153+
}
154+
155+
console.log((regressed.length > 0) ? colors.red : colors.green, browser);
156+
157+
improved.map(setColor.bind(null, colors.green)).concat(regressed.map(setColor.bind(null, colors.red))).forEach(function(item) {
158+
console.log(" *", item);
144159
});
145160
}
146161

147-
});
148-
}
162+
};
163+
164+
function handleResults(stats) {
165+
Object.keys(stats).forEach(openResultFile.bind(null, stats));
166+
}
167+
168+
function runBrowsers(pages){
169+
170+
var port = 5555,
171+
stats = {},
172+
browsers = ["chrome", "firefox", "internet explorer"],
173+
browsersDone = 0,
174+
server = createServer(port),
175+
numPages = pages.length;
176+
177+
var browserDone = function() {
178+
if (++browsersDone >= browsers.length) {
179+
server.close();
180+
handleResults(stats);
181+
}
182+
};
183+
184+
browsers.forEach(function(browserName){
185+
var browser = new webdriver({
186+
browser: browserName
187+
}),
188+
browserType;
189+
browserName = browserName.replace("internet explorer", "iexplorer");
190+
browser.status(function(browserInfo){
191+
browserType = [browserName, browser.version, browserInfo.os.name.replace(/\s+/g, "-").toLowerCase()].join("-");
192+
var date = new Date(),
193+
obj = {
194+
tests: {},
195+
date: date.toISOString(),
196+
version: browser.version
197+
};
198+
stats[browserType] = obj;
199+
stats[browserName] = obj;
200+
processPage(0);
201+
});
149202

150-
walkDir("cases", function(err, results) {
151-
if (err) throw err;
152-
runBrowsers(results);
153-
});
203+
function processPage(index) {
204+
var page = pages[index++];
205+
testPage(browser, "http://localhost:" + port + "/tests/" + page + "?selenium", function(result) {
206+
if (numPages > index) {
207+
processPage(index);
208+
} else {
209+
browser.close(browserDone);
210+
}
211+
stats[browserType].tests[page] = result;
212+
});
213+
}
214+
215+
});
216+
}
217+
218+
walkDir("cases", function(err, results) {
219+
if (err) throw err;
220+
runBrowsers(results.slice(0, 2));
221+
});
154222

223+
})();

0 commit comments

Comments
 (0)