2015-03-17 8 views
0

Я пытаюсь создать функциональную систему тестирования, чтобы убедиться, что наш веб-сайт ведет себя правильно для наших пользователей. Я объединил кучу модулей и помощников Node.js в попытке получить фреймворк, который обеспечивает простые, сжатые тесты без кучи вложенных обратных вызовов функций, и я считаю, что обещания могут обеспечить это, поэтому мой файл package.json выглядит так:Функциональное тестирование с помощью grunt-webdriver, мокко и chai-as-обещано

"dependencies": { 
    "chai-as-promised": "^4.3.0", 
    "grunt": "^0.4.5", 
    "grunt-webdriver": "^0.4.8" 
} 

Мои Gruntfile.js выглядит следующим образом:

module.exports = function(grunt) { 
    grunt.initConfig({ 
    webdriver: { // for use with webdriver.io 
     options: { 
     desiredCapabilities: { 
      browserName: 'phantomjs' // No Xvfb required 
     } 
     }, 
     chrome: { 
     tests: ['chrome/*.js'], 
     options: { 
      desiredCapabilities: { 
      browserName: 'chrome' 
      } 
     } 
     }, 
    }, 
    }); 
    grunt.loadNpmTasks('grunt-webdriver'); 
    grunt.registerTask('default', ['webdriver']); 
}; 

И, наконец, мой тест в chrome/login.js выглядит следующим образом:

'use strict'; 

var chai = require('chai'), 
    chaiAsPromised = require('chai-as-promised'), 
    assert; 

chaiAsPromised.transferPromiseness = browser.transferPromiseness; 
chai.use(chaiAsPromised); 
assert = chai.assert; 

describe('login test', function() { 
    it('verifies user can log in', function(done) { 
     browser 
      .url('https://localhost/') 
      .setValue('#userauth_username','foo') 
      .setValue('#userauth_password',"password") 
      .submitForm('#form_users_login') 
      .then(function(){ 
       browser.getText('#auth-user-id', function(err, value){ 
        console.log(value); 
       }); 
       assert.becomes(browser.getText('#auth-user-id'), 'foo'); 
      })//.call(done); 
    }); 
}); 

Когда я запустил grunt webdriver:chrome в командной строке, я вижу, что он запускает Chrome и заходит на сайт. Интервал «auth-user-id» корректно отображает идентификатор пользователя после входа в систему, но по какой-то причине browser.getText() не возвращает его, поэтому тест не работает. Я попытался добавить .pause(100) после .submitForm(), чтобы дать мне время для взаимодействия со страницей в Chrome, поэтому я знаю, что это проблема в тестовом примере.

Что я делаю неправильно?

ответ

2

Это, кажется, лучший и самый лаконичный способ делать то, что я хочу. Я не уверен, что мне нужно chai-as-promised, но, может быть, я переведу функцию входа в файл с включенным файлом и использую chai-as-обещал утверждать, что обещанный логин произошел до ввода тестов.

'use strict';

var chai = require('chai'), 
    chaiAsPromised = require('chai-as-promised'), 
    assert, 
    expect; 

chaiAsPromised.transferPromiseness = browser.transferPromiseness; 
chai.use(chaiAsPromised); 
assert = chai.assert; 
expect = chai.expect; 

describe('login test', function() { 

    it('verifies user can log in', function(done) { 

     browser 
      .url('https://localhost/') 
      .setValue('#userauth_username','foo') 
      .setValue('#userauth_password',"password") 
      .submitForm('#form_users_login') 
      .waitForExist('#auth-user-id') 
      .getText('#auth-user-id') 
      .then(function(text){ 
       //console.log('Username: ' + text); 
       assert.equal(text, 'foo'); 
      }) 
      .saveScreenshot('out.png') 
      .call(done) 

    }); 

    it('should not display logincontrols after login', function(done){ 

     browser 
      .isVisible('#logincontrols') 
      .then(function(bool){ 
       expect(bool).to.be.false; 
      }) 
      .call(done) 

    }); 

    it('should display loggedin section after login', function(done){ 

     browser 
      .isVisible('#loggedin') 
      .then(function(bool){ 
       expect(bool).to.be.true; 
      }) 
      .call(done) 

    }); 

}); 

и для полноты картины, это то, что я вижу на выходе:

# grunt webdriver:chrome 
Running "webdriver:chrome" (webdriver) task 


    login test 
    ✓ verifies user can log in (7691ms) 
    ✓ should not display logincontrols after login (70ms) 
    ✓ should display loggedin section after login (58ms) 


    3 passing (8s) 


Done, without errors.