Implement code coverage without grunt-qunit-istanbul

This commit is contained in:
nein09 2018-01-01 16:17:13 -08:00
parent 80e8065e2f
commit aaec7c9526
5 changed files with 153 additions and 42 deletions

2
.gitignore vendored
View File

@ -3,7 +3,7 @@ node_modules
build/
sftp-config.json
coverage/
temp/
instrumented/
.idea
/nbproject/private/
.directory

View File

@ -1,6 +1,7 @@
/* global module */
module.exports = function(grunt) {
var dateFormat = require('dateformat');
// ----------
grunt.loadNpmTasks("grunt-contrib-compress");
@ -13,6 +14,7 @@ module.exports = function(grunt) {
grunt.loadNpmTasks("grunt-eslint");
grunt.loadNpmTasks("grunt-git-describe");
grunt.loadNpmTasks('grunt-text-replace');
grunt.loadNpmTasks('grunt-istanbul');
// ----------
var packageJson = grunt.file.readJSON("package.json"),
@ -21,6 +23,7 @@ module.exports = function(grunt) {
packageDirName = "openseadragon-bin-" + packageJson.version,
packageDir = "build/" + packageDirName + "/",
releaseRoot = "../site-build/built-openseadragon/",
coverageDir = 'coverage/' + dateFormat(new Date(), 'yyyymmdd-HHMMss'),
sources = [
"src/openseadragon.js",
"src/fullscreen.js",
@ -83,7 +86,7 @@ module.exports = function(grunt) {
clean: {
build: ["build"],
package: [packageDir],
coverage: ["coverage"],
coverage: ["instrumented"],
release: {
src: [releaseRoot],
options: {
@ -154,7 +157,8 @@ module.exports = function(grunt) {
qunit: {
normal: {
options: {
urls: [ "http://localhost:8000/test/test.html" ]
urls: [ "http://localhost:8000/test/test.html" ],
timeout: 500000
}
},
coverage: {
@ -162,11 +166,13 @@ module.exports = function(grunt) {
urls: [ "http://localhost:8000/test/coverage.html" ],
coverage: {
src: ['src/*.js'],
htmlReport: 'coverage/html/',
instrumentedFiles: 'temp/',
htmlReport: coverageDir + '/html/',
instrumentedFiles: 'instrumented/src/',
baseUrl: '.',
disposeCollector: true
}
},
inject: 'test/helpers/phantom-bridge.js',
timeout: 500000
}
},
all: {
@ -199,7 +205,38 @@ module.exports = function(grunt) {
},
build: {}
},
gitInfo: "unknown"
gitInfo: "unknown",
instrument: {
files: sources,
options: {
lazy: false,
basePath: 'instrumented/'
}
},
reloadTasks: {
rootPath: "instrumented/src/"
},
storeCoverage: {
options: {
dir: coverageDir,
'include-all-sources': true
}
},
makeReport: {
src: "coverage/**/*.json",
options: {
type: [ "lcov", "html" ],
dir: coverageDir,
print: "detail"
}
}
});
grunt.event.on("qunit.coverage", function(coverage) {
var reportPath = coverageDir + "/coverage.json";
// Create the coverage file
grunt.file.write(reportPath, JSON.stringify(coverage));
});
// ----------
@ -287,7 +324,7 @@ module.exports = function(grunt) {
// ----------
// Coverage task.
// Outputs unit test code coverage report.
grunt.registerTask("coverage", ["clean:coverage", "connect", "qunit:coverage"]);
grunt.registerTask("coverage", ["clean:coverage", "instrument", "connect", "qunit:coverage", "makeReport"]);
// ----------
// Package task.

View File

@ -38,6 +38,7 @@
"grunt-contrib-watch": "^1.0.0",
"grunt-eslint": "^19.0.0",
"grunt-git-describe": "^2.3.2",
"grunt-istanbul": "^0.8.0",
"grunt-text-replace": "^0.4.0",
"qunitjs": "2.4.1"
},

View File

@ -21,40 +21,40 @@
<script src="/test/lib/jquery.simulate.js"></script>
<!-- OpenSeadragon sources -->
<script src="/src/openseadragon.js"></script>
<script src="/src/fullscreen.js"></script>
<script src="/src/eventsource.js"></script>
<script src="/src/mousetracker.js"></script>
<script src="/src/control.js"></script>
<script src="/src/controldock.js"></script>
<script src="/src/placement.js"></script>
<script src="/src/viewer.js"></script>
<script src="/src/navigator.js"></script>
<script src="/src/strings.js"></script>
<script src="/src/point.js"></script>
<script src="/src/tilesource.js"></script>
<script src="/src/dzitilesource.js"></script>
<script src="/src/iiiftilesource.js"></script>
<script src="/src/osmtilesource.js"></script>
<script src="/src/tmstilesource.js"></script>
<script src="/src/zoomifytilesource.js"></script>
<script src="/src/legacytilesource.js"></script>
<script src="/src/imagetilesource.js"></script>
<script src="/src/tilesourcecollection.js"></script>
<script src="/src/button.js"></script>
<script src="/src/buttongroup.js"></script>
<script src="/src/rectangle.js"></script>
<script src="/src/referencestrip.js"></script>
<script src="/src/displayrectangle.js"></script>
<script src="/src/spring.js"></script>
<script src="/src/imageloader.js"></script>
<script src="/src/tile.js"></script>
<script src="/src/overlay.js"></script>
<script src="/src/drawer.js"></script>
<script src="/src/viewport.js"></script>
<script src="/src/tiledimage.js"></script>
<script src="/src/tilecache.js"></script>
<script src="/src/world.js"></script>
<script src="/instrumented/src/openseadragon.js"></script>
<script src="/instrumented/src/fullscreen.js"></script>
<script src="/instrumented/src/eventsource.js"></script>
<script src="/instrumented/src/mousetracker.js"></script>
<script src="/instrumented/src/control.js"></script>
<script src="/instrumented/src/controldock.js"></script>
<script src="/instrumented/src/placement.js"></script>
<script src="/instrumented/src/viewer.js"></script>
<script src="/instrumented/src/navigator.js"></script>
<script src="/instrumented/src/strings.js"></script>
<script src="/instrumented/src/point.js"></script>
<script src="/instrumented/src/tilesource.js"></script>
<script src="/instrumented/src/dzitilesource.js"></script>
<script src="/instrumented/src/iiiftilesource.js"></script>
<script src="/instrumented/src/osmtilesource.js"></script>
<script src="/instrumented/src/tmstilesource.js"></script>
<script src="/instrumented/src/zoomifytilesource.js"></script>
<script src="/instrumented/src/legacytilesource.js"></script>
<script src="/instrumented/src/imagetilesource.js"></script>
<script src="/instrumented/src/tilesourcecollection.js"></script>
<script src="/instrumented/src/button.js"></script>
<script src="/instrumented/src/buttongroup.js"></script>
<script src="/instrumented/src/rectangle.js"></script>
<script src="/instrumented/src/referencestrip.js"></script>
<script src="/instrumented/src/displayrectangle.js"></script>
<script src="/instrumented/src/spring.js"></script>
<script src="/instrumented/src/imageloader.js"></script>
<script src="/instrumented/src/tile.js"></script>
<script src="/instrumented/src/overlay.js"></script>
<script src="/instrumented/src/drawer.js"></script>
<script src="/instrumented/src/viewport.js"></script>
<script src="/instrumented/src/tiledimage.js"></script>
<script src="/instrumented/src/tilecache.js"></script>
<script src="/instrumented/src/world.js"></script>
<!-- Helpers -->
<script src="/test/helpers/legacy.mouse.shim.js"></script>

View File

@ -0,0 +1,73 @@
/*
* grunt-contrib-qunit
* http://gruntjs.com/
*
* Copyright (c) 2016 "Cowboy" Ben Alman, contributors
* Licensed under the MIT license.
*/
/*global QUnit:true, alert:true*/
(function (factory) {
if (typeof define === 'function' && define.amd) {
require(['qunit'], factory);
} else {
factory(QUnit);
}
}(function(QUnit) {
'use strict';
// Don't re-order tests.
QUnit.config.reorder = false;
// Send messages to the parent PhantomJS process via alert! Good times!!
function sendMessage() {
var args = [].slice.call(arguments);
alert(JSON.stringify(args));
}
// These methods connect QUnit to PhantomJS.
QUnit.log(function(obj) {
// What is this I dont even
if (obj.message === '[object Object], undefined:undefined') { return; }
// Parse some stuff before sending it.
var actual, expected;
if (!obj.result) {
// Dumping large objects can be very slow, and the dump isn't used for
// passing tests, so only dump if the test failed.
actual = QUnit.dump.parse(obj.actual);
expected = QUnit.dump.parse(obj.expected);
}
// Send it.
sendMessage('qunit.log', obj.result, actual, expected, obj.message, obj.source, obj.todo);
});
QUnit.testStart(function(obj) {
sendMessage('qunit.testStart', obj.name);
});
QUnit.testDone(function(obj) {
sendMessage('qunit.testDone', obj.name, obj.failed, obj.passed, obj.total, obj.runtime, obj.skipped, obj.todo);
});
QUnit.moduleStart(function(obj) {
sendMessage('qunit.moduleStart', obj.name);
});
QUnit.moduleDone(function(obj) {
sendMessage('qunit.moduleDone', obj.name, obj.failed, obj.passed, obj.total);
});
QUnit.begin(function() {
sendMessage('qunit.begin');
});
QUnit.done(function(obj) {
// send coverage data if available
if ( window.__coverage__ ) {
sendMessage( "qunit.coverage", window.__coverage__ );
}
sendMessage('qunit.done', obj.failed, obj.passed, obj.total, obj.runtime);
});
}));