feat: Allow testing of single spec modules (#11409)

* 🔧 ES6 for the spec

* 👷 Allow testing of single modules

* ❤️ Implement feedback

* 📝 Add a testing doc

* 📝 Link to it

* 📝 Cleanup
This commit is contained in:
Felix Rieseberg 2017-12-28 12:18:33 +01:00 коммит произвёл shelley vohr
Родитель a161f6e368
Коммит 5f4b62b6c8
4 изменённых файлов: 101 добавлений и 52 удалений

6
.github/config.yml поставляемый
Просмотреть файл

@ -3,7 +3,7 @@
# Comment to be posted to on first time issues
newIssueWelcomeComment: |
👋 Thanks for opening your first issue here! If you're reporting a 🐞 bug, please make sure you include steps to reproduce it. We get a lot of issues on this repo, so please be patient and we will get back to you as soon as we can.
To help make it easier for us to investigate your issue, please follow the [contributing guidelines](https://github.com/electron/electron/blob/master/CONTRIBUTING.md#submitting-issues).
# Configuration for new-pr-welcome - https://github.com/behaviorbot/new-pr-welcome
@ -11,7 +11,7 @@ newIssueWelcomeComment: |
# Comment to be posted to on PRs from first time contributors in your repository
newPRWelcomeComment: |
💖 Thanks for opening this pull request! 💖
Here is a list of things that will help get it across the finish line:
- Follow the JavaScript, C++, and Python [coding style](https://github.com/electron/electron/blob/master/docs/development/coding-style.md).
- Run `npm run lint` locally to catch formatting errors earlier.
@ -26,4 +26,4 @@ newPRWelcomeComment: |
firstPRMergeComment: >
Congrats on merging your first pull request! 🎉🎉🎉
# It is recommend to include as many gifs and emojis as possiblec
# It is recommend to include as many gifs and emojis as possible

Просмотреть файл

@ -96,6 +96,7 @@ an issue:
* [Coding Style](development/coding-style.md)
* [Using clang-format on C++ Code](development/clang-format.md)
* [Testing](development/testing.md)
* [Source Code Directory Structure](development/source-code-directory-structure.md)
* [Technical Differences to NW.js (formerly node-webkit)](development/atom-shell-vs-node-webkit.md)
* [Build System Overview](development/build-system-overview.md)

Просмотреть файл

@ -0,0 +1,44 @@
# Testing
We aim to keep the code coverage of Electron high. We ask that all pull
request not only pass all existing tests, but ideally also add new tests
to cover changed code and new scenarios. Ensuring that we capture as
many code paths and use cases of Electron as possible ensures that we
all ship apps with fewer bugs.
This repository comes with linting rules for both JavaScript and C++ –
as well as unit and integration tests. To learn more about Electron's
coding style, please see the [coding-style(coding-style.md) document.
## Linting
To ensure that your JavaScript is in compliance with the Electron coding
style, run `npm run lint-js`, which will run `standard` against both
Electron itself as well as the unit tests. If you are using an editor
with a plugin/addon system, you might want to use one of the many
[StandardJS addons](standard-addons) to be informed of coding style
violations before you ever commit them.
To run `standard` with parameters, run `npm run lint-js --` followed by
arguments you want passed to `standard`.
To ensure that your C++ is in compliance with the Electron coding style,
run `npm run lint-cpp`, which runs a `cpplint` script. We recommend that
you use `clang-format` and prepared [a short tutorial](clang-format.md).
There is not a lot of Python in this repository, but it too is governed
by coding style rules. `npm run lint-py` will check all Python, using
`pylint` to do so.
## Unit Tests
To run all unit tests, run `npm run test`. The unit tests are an Electron
app (surprise!) that can be found in the `spec` folder. Note that it has
its own `package.json` and that its dependencies are therefore not defined
in the top-level `package.json`.
To run only a selected number of tests, run `npm run test -match=NAME`,
replacing the `NAME` with the file name of the test suite you would like
to run. As an example: If you want to run only IPC suites, you would run
`npm run test -match=ipc`.
[standard-addons]: https://standardjs.com/#are-there-text-editor-plugins

Просмотреть файл

@ -11,74 +11,77 @@
<script type="text/javascript" charset="utf-8">
(function() {
// Disable use of deprecated functions.
process.throwDeprecation = true;
process.throwDeprecation = true
var path = require('path');
var electron = require ('electron');
var remote = electron.remote;
var ipcRenderer = electron.ipcRenderer;
const path = require('path')
const electron = require('electron')
const { remote, ipcRenderer } = electron
// Check if we are running in CI.
var isCi = remote.getGlobal('isCi')
const isCi = remote.getGlobal('isCi')
if (!isCi) {
var win = remote.getCurrentWindow();
win.show();
win.focus();
const win = remote.getCurrentWindow()
win.show()
win.focus()
}
// Show DevTools.
document.oncontextmenu = function(e) {
remote.getCurrentWindow().inspectElement(e.clientX, e.clientY);
document.oncontextmenu = (e) => {
remote.getCurrentWindow().inspectElement(e.clientX, e.clientY)
}
// Rediret all output to browser.
if (isCi) {
global.__defineGetter__('console', function() {
global.__defineGetter__('console', function () {
return {
log: function() {
args = Array.prototype.slice.call(arguments);
ipcRenderer.send('console.log', args);
},
error: function() {
args = Array.prototype.slice.call(arguments);
ipcRenderer.send('console.error', args);
},
log: (...args) => ipcRenderer.send('console.log', args),
error: (...args) => ipcRenderer.send('console.error', args)
}
});
})
}
var Coverage = require('electabul').Coverage;
const { Coverage } = require('electabul')
const Mocha = require('mocha')
var Mocha = require('mocha');
var mochaOpts = {};
if (process.env.MOCHA_REPORTER) {
mochaOpts.reporter = process.env.MOCHA_REPORTER;
}
var mocha = new Mocha(mochaOpts);
const mocha = new Mocha(process.env.MOCHA_REPORTER
? { reporter: process.env.MOCHA_REPORTER }
: undefined)
if (!process.env.MOCHA_REPORTER) {
mocha.ui('bdd').reporter(isCi ? 'tap' : 'html');
mocha.ui('bdd').reporter(isCi ? 'tap' : 'html')
}
mocha.timeout(isCi ? 30000 : 10000)
var query = Mocha.utils.parseQuery(window.location.search || '');
if (query.grep) mocha.grep(query.grep);
if (query.invert) mocha.invert();
const query = Mocha.utils.parseQuery(window.location.search || '')
if (query.grep) mocha.grep(query.grep)
if (query.invert) mocha.invert()
// Read all test files.
var walker = require('walkdir').walk(path.dirname(__dirname), {
const walker = require('walkdir').walk(path.dirname(__dirname), {
no_recurse: true
});
})
walker.on('file', function(file) {
if (/-spec\.js$/.test(file) && !file.includes('api-crash-reporter-spec.js'))
mocha.addFile(file);
});
const crashSpec = 'api-crash-reporter-spec.js'
walker.on('end', function() {
mocha.addFile(path.resolve(__dirname, '..', 'api-crash-reporter-spec.js'))
var runner = mocha.run(function() {
// This allows you to run specific modules only:
// npm run test -match=menu
const moduleMatch = process.env.npm_config_match
? new RegExp(process.env.npm_config_match, 'g')
: /.*/gi
walker.on('file', (file) => {
if (/-spec\.js$/.test(file) && moduleMatch.test(file) && !file.includes(crashSpec)) {
mocha.addFile(file)
}
})
walker.on('end', () => {
if (!process.env.npm_config_match || new RegExp(process.env.npm_config_match, 'g').test(crashSpec)) {
mocha.addFile(path.resolve(__dirname, '..', crashSpec))
}
const runner = mocha.run(() => {
if (isCi && runner.hasOnly) {
try {
throw new Error('A spec contains a call to it.only or describe.only and should be reverted.')
@ -89,21 +92,22 @@
return
}
Mocha.utils.highlightTags('code');
Mocha.utils.highlightTags('code')
var coverage = new Coverage({
const coverage = new Coverage({
libPath: path.join(__dirname, '..', '..', 'lib'),
outputPath: path.join(__dirname, '..', '..', 'out', 'coverage'),
formats: ['text', 'lcov']
});
})
coverage.addCoverage(ipcRenderer.sendSync('get-main-process-coverage'))
coverage.generateReport()
if (isCi)
ipcRenderer.send('process.exit', runner.failures);
});
});
})();
if (isCi) {
ipcRenderer.send('process.exit', runner.failures)
}
})
})
})()
</script>
</body>
</html>