如何在量角器运行之前启动服务器并在之后进行清理



似乎量角器没有提供任何开箱即用的解决方案来在服务器运行之前启动服务器。 在运行功能测试之前必须运行多个命令是一种糟糕的用户体验,并且对自动化测试不利。

Angular-cli 有自己的解决方案,相当复杂,这个插件声称可以复制,尽管它对我不起作用并且可能未维护。 https://www.npmjs.com/package/protractor-webpack

编辑:下面接受更好的解决方案

我想出了一个使用 child_process.exec 的解决方案,它似乎运行良好,尽管我不太喜欢它。 我想分享它,以防有人需要它,看看是否有人能想出更好的解决方案。

在量角器的 beforeLaunch 钩子中启动该过程:

beforeLaunch: () => {
webpackServerProcess = exec(`webpack-dev-server --port=3003 --open=false`, null, () => { 
console.log(`Webpack Server process reports that it exited. Its possible a server was already running on port ${port}`)
});
},

然后在配置块上方,我们设置了退出处理程序,以确保服务器在我们完成后被杀死。

let webpackServerProcess; // Set below in beforeLaunch hook
function cleanUpServer(eventType) {
console.log(`Server Cleanup caught ${eventType}, killing server`);
if (webpackServerProcess) {
webpackServerProcess.kill();
console.log(`SERVER KILLED`);
}
}
[`exit`, `SIGINT`, `SIGUSR1`, `SIGUSR2`, `uncaughtException`].forEach((eventType) => {
process.on(eventType, cleanUpServer.bind(null, eventType));
})

需要各种事件侦听器来处理 cntrl+c 事件以及进程被 ID 终止的情况。 奇怪的是,节点没有提供包含所有这些的事件。

量角器也有onCleanUp,它将在文件中的所有规范完成后运行。

通过保留对进程的引用,您正在做正确的事情,以便以后可以终止它。

let webpackServerProcess;
beforeLaunch: () {
webpackServerProcess = exec('blah'); // you could use spawn instead of exec
},
onCleanUp: () {
process.kill(webpackServerProcess.pid);
// or webpackServerProcess.exit();
}

由于您正在使用 child_process.exec 启动 serverProcess,而不是处于分离状态,因此如果主进程被 SIGINT 或其他任何东西杀死,它应该消失。因此,您甚至可能不必杀死它或清理它。

我找到了一种更可靠的方法来使用 webpack-dev-server node api。 这样就不会产生单独的进程,我们也不必清理任何东西。 此外,它会阻止量角器,直到 webpack 准备就绪。

beforeLaunch: () => {
return new Promise((resolve, reject) => {
new WebpackDevServer(webpack(require('./webpack.config.js')()), {
// Do stuff
}).listen(APP_PORT, '0.0.0.0', function(err) {
console.log('webpack dev server error is ', err)
resolve()
}).on('error', (error) => {
console.log('dev server error ', error)
reject(error)
})
})
},
// conf.js
var jasmineReporters = require('jasmine-reporters');
var Jasmine2HtmlReporter = require('protractor-jasmine2-html-reporter');
const path = require('path');
const WebpackDevServer = require('webpack-dev-server');
const webpack = require('webpack');
let webpackServerProcess;
beforeLaunch: () => {
return new Promise(resolve => {
setTimeout(() => {
const compiler = webpack(require('./webpack.config.js'));
const server = new WebpackDevServer(compiler, {
stats: 'errors-only'
});
server.listen(0, 'localhost', () => {
// `server.listeningApp` will be returned by `server.listen()`
// in `webpack-dev-server@~2.0.0`
const address = server.listeningApp.address();
config.baseUrl = `http://localhost:${address.port}`;
resolve();
});
}, 5000);
});
};
exports.config = {
framework: 'jasmine',
//seleniumAddress: 'http://localhost:4444/wd/hub',
specs: ['Test/spec.js'],
directConnect: true,
// Capabilities to be passed to the webdriver instance.
capabilities: {
'browserName': 'chrome'/*,
chromeOptions: {
args: [ '--headless','--log-level=1', '--disable-gpu', '--no-sandbox', '--window-size=1920x1200' ]
}*/
},
onPrepare: function() {
jasmine.getEnv().addReporter(new jasmineReporters.JUnitXmlReporter({
consolidateAll: true,
filePrefix: 'guitest-xmloutput',
savePath: 'reports'
}));
jasmine.getEnv().addReporter(new Jasmine2HtmlReporter({
savePath: 'reports/',
screenshotsFolder: 'images',
takeScreenshots: true,
takeScreenshotsOnlyOnFailures: true,
cleanDestination: false,
fileName: 'TestReport'
}));
},
}
onCleanUp: ()=> {
//process.kill(webpackServerProcess.pid);
webpackServerProcess.exit();
}

相关内容

最新更新