2016-12-02 19 views
2

我在啓動啓動本地服務器的子進程後運行守護程序。 Nightwatch運行測試,它們成功完成,並且瀏覽器窗口全部關閉,但在打印「OK」消息之後,nightwatch進程繼續運行。總共有10個斷言通過。守護程序不在瀏覽器終止後()

我認爲這可能與我在觀看nightwatch過程中的事件有關,但據我所知,我正在觀看所有可能顯示Nightwatch正在退出的事件。

方法shutdown() in runner.js永遠不會被調用。如何在測試結束後讓Nightwatch終止?

更新

如果我刪除sign-in.js最後的測試,然後Nightwatch退出符合市場預期。

runner.js

import spawn from 'cross-spawn' 

// 1. start the dev server using production config 
process.env.NODE_ENV = 'testing' 

let servers 

function shutdown (result) { 
    console.log('HERE', result) 
    try { 
    // Passing a negative PID to kill will terminate all child processes, not just the parent 
    if (servers) process.kill(-servers.pid) 
    } catch (e) { 
    console.error('Unable to shutdown servers, may need to be killed manually') 
    } 

    if (result) { 
    console.error(result) 
    process.exit(1) 
    } else { 
    process.exit(0) 
    } 
} 

function watch (child) { 
    child.on('close', shutdown) 
    child.on('disconnect', shutdown) 
    child.on('error', shutdown) 
    child.on('exit', shutdown) 
    child.on('uncaughtException', shutdown) 
} 

try { 
    servers = spawn('yarn', ['run', 'dev-all'], { cwd: '..', stdio: 'inherit', detached: true }) 
    watch(servers) 

    // 2. run the nightwatch test suite against it 
    // to run in additional browsers: 
    // 1. add an entry in test/e2e/nightwatch.conf.json under "test_settings" 
    // 2. add it to the --env flag below 
    // or override the environment flag, for example: `npm run e2e -- --env chrome,firefox` 
    // For more information on Nightwatch's config file, see 
    // http://nightwatchjs.org/guide#settings-file 
    var opts = process.argv.slice(2) 
    if (opts.indexOf('--config') === -1) { 
    opts = opts.concat(['--config', 'e2e/nightwatch.conf.js']) 
    } 
    if (opts.indexOf('--env') === -1) { 
    opts = opts.concat(['--env', 'chrome']) 
    } 

    var runner = spawn('./node_modules/.bin/nightwatch', opts, { stdio: 'inherit' }) 
    watch(runner) 
    watch(process) 
} catch (error) { 
    shutdown(error) 
} 

nightwatch.conf.js

require('babel-register') 
var config = require('../../frontend/config') 

// http://nightwatchjs.org/guide#settings-file 
module.exports = { 
    src_folders: ['e2e/specs'], 
    output_folder: 'e2e/reports', 
    custom_assertions_path: ['e2e/custom-assertions'], 

    selenium: { 
    start_process: true, 
    server_path: 'node_modules/selenium-server/lib/runner/selenium-server-standalone-3.0.1.jar', 
    host: '127.0.0.1', 
    port: 4444, 
    cli_args: { 
     'webdriver.chrome.driver': require('chromedriver').path 
    } 
    }, 

    test_settings: { 
    default: { 
     selenium_port: 4444, 
     selenium_host: 'localhost', 
     silent: true, 
     globals: { 
     devServerURL: 'http://localhost:' + (process.env.PORT || config.dev.port) 
     } 
    }, 

    chrome: { 
     desiredCapabilities: { 
     browserName: 'chrome', 
     javascriptEnabled: true, 
     acceptSslCerts: true 
     } 
    }, 

    firefox: { 
     desiredCapabilities: { 
     browserName: 'firefox', 
     javascriptEnabled: true, 
     acceptSslCerts: true 
     } 
    } 
    } 
} 

登錄in.js(其中一個測試)

import firebase from 'firebase-admin' 
import uuid from 'uuid' 

import * as firebaseSettings from '../../../backend/src/firebase-settings' 

const PASSWORD = 'toomanysecrets' 

function createUser (user) { 
    console.log('Creating user', user.uid) 
    let db = firebase.database() 
    return Promise.all([ 
    firebase.auth().createUser({ 
     uid: user.uid, 
     email: user.email, 
     emailVerified: true, 
     displayName: user.fullName, 
     password: PASSWORD 
    }), 
    db.ref('users').child(user.uid).set({ 
     email: user.email, 
     fullName: user.fullName 
    }), 
    db.ref('roles').child(user.uid).set({ 
     instructor: false 
    }) 
    ]) 
} 

function destroyUser (user) { 
    if (!user) return 

    console.log('Removing user', user.uid) 
    let db = firebase.database() 
    try { db.ref('roles').child(user.uid).remove() } catch (e) {} 
    try { db.ref('users').child(user.uid).remove() } catch (e) {} 
    try { firebase.auth().deleteUser(user.uid) } catch (e) {} 
} 

module.exports = { 
    'Sign In links exist': browser => { 
    // automatically uses dev Server port from /config.index.js 
    // default: http://localhost:8080 
    // see nightwatch.conf.js 
    const devServer = browser.globals.devServerURL 

    browser 
     .url(devServer) 
     .waitForElementVisible('#container', 5000) 

    browser.expect.element('.main-nav').to.be.present 
    browser.expect.element('.main-nav a[href^=\'https://oauth.ais.msu.edu/oauth/authorize\']').to.be.present 
    browser.expect.element('.main-nav a[href^=\'/email-sign-in\']').to.be.present 
    browser.end() 
    }, 
    'Successful Sign In with Email shows dashboard': browser => { 
    const devServer = browser.globals.devServerURL 

    firebase.initializeApp(firebaseSettings.appConfig) 

    let userId = uuid.v4() 
    let user = { 
     uid: userId, 
     email: `${userId}@test.com`, 
     fullName: 'Test User' 
    } 

    createUser(user) 

    browser.url(devServer) 
     .waitForElementVisible('.main-nav a[href^=\'/email-sign-in\']', 5000) 
     .click('.main-nav a[href^=\'/email-sign-in\']') 
     .waitForElementVisible('button', 5000) 
     .setValue('input[type=text]', user.email) 
     .setValue('input[type=password]', PASSWORD) 
     .click('button') 
     .waitForElementVisible('.main-nav a[href^=\'/sign-out\']', 5000) 
     .end(() => { 
     destroyUser(user) 
     }) 
    } 
} 

測試成功完成後,我看到以下內容:

grimlock:backend egillespie$ ps -ef | grep nightwatch 
501 13087 13085 0 1:51AM ttys000 0:02.18 node ./node_modules/.bin/nightwatch --presets es2015,stage-0 --config e2e/nightwatch.conf.js --env chrome 

回答

1

我沒有明確關閉Firebase連接。這導致最後一次測試無限期地掛起。

這裏是我怎麼做的測試清理後關閉連接:

browser.end(() => { 
    destroyUser(user).then(() => { 
    firebase.app().delete() 
    }) 
}) 

destroyUser函數現在看起來是這樣的:

function destroyUser (user) { 
    if (!user) return Promise.resolve() 

    let db = firebase.database() 
    return Promise.all([ 
    db.ref('roles').child(user.uid).remove(), 
    db.ref('users').child(user.uid).remove(), 
    firebase.auth().deleteUser(user.uid) 
    ]) 
} 
+0

如何從控制檯殺死它 –

+1

@zero_cool我?我使用'killall節點',但更安全的方法是使用'kill ',其中''是節點命令的進程號(在我原來的問題中爲13087)。 –

0

我曾嘗試以下方法:

在「nightwatch.conf.js」,

"test_settings" { "default" { "silent": true, ... }, ... }

我將「silent」從true設置爲false

它導致在控制檯中變得冗長。 https://github.com/vuejs-templates/pwa

我的平臺:

  • 的Windows 7(64位)
  • 節點v8.1.3和chromedriver.exe將運行測試

    我用的是VUE模板從平靜後退出

  • 「守夜人」:「^ 0.9。16" ,
  • 「硒服務器」: 「^ 3.6.0」,
  • 「chromedriver」: 「^ 2.33.1」
相關問題