【问题标题】:How to start a server before protractor runs and clean up afterwards如何在量角器运行之前启动服务器并在之后清理
【发布时间】:2018-08-28 04:02:58
【问题描述】:

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

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

【问题讨论】:

    标签: javascript protractor webpack-dev-server


    【解决方案1】:

    Protractor 还有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 或其他任何东西杀死,它应该会消失。所以你甚至可能不必杀死它或清理它。

    【讨论】:

    • 很好,所有的输入都很好。我尝试了“oncleanup”,但它在中断或其他情况下失败了很多时间,所以我不得不手动观看。否则它将停留在系统上并占用一个端口。不知道为什么
    【解决方案2】:

    我发现了一种使用 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)
          })
        })
      },
    

    【讨论】:

    • 这个答案不能按原样工作。你能把它扩大一点吗? “WebpackDevServer”未定义。你是从要求“webpack-dev-server”中得到的吗?你在调用什么“webpack”函数? “做事”应该包括什么?
    • 这可以用来在 API 请求完成之前不启动浏览器吗?
    猜你喜欢
    • 2018-01-14
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    相关资源
    最近更新 更多