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

时间:2018-03-19 14:40:28

标签: javascript protractor webpack-dev-server

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

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杀死的情况。奇怪的是,该节点没有提供包含所有这些内容的事件。

2 个答案:

答案 0 :(得分:1)

量角器也有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或其他任何东西杀死,它应该消失。所以你甚至不必杀死它或清理它。

答案 1 :(得分:1)

我发现了使用webpack-dev-server节点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)
      })
    })
  },
相关问题