End-to-end & Node (Angular senere)
{
"name": "first-end-to-end-project",
"dependencies": {
"express": "^4.12.3"
},
"devDependencies": {
"chai": "^2.2.0",
"mocha": "^2.2.4",
"protractor": "^2.0.0"
}
}Automatisert oppsett av WebDriver med Selenium
$ ./node_modules/.bin/webdriver-manager update
Updating selenium standalone
downloading https://selenium-release.storage.googleapis.com/2.45/selenium-server-standalone-2.45.0.jar...
Updating chromedriver
downloading https://chromedriver.storage.googleapis.com/2.14/chromedriver_mac32.zip...
chromedriver_2.14.zip downloaded to /the-project/node_modules/protractor/selenium/chromedriver_2.14.zip
selenium-server-standalone-2.45.0.jar downloaded to \
/the-project/node_modules/protractor/selenium/selenium-server-standalone-2.45.0.jar
Flexible testing framework
"Tilsvarer" XUnit (JUnit for Java, NUnit for .NET), XCTest for Swift/Objective-C
Krever litt config (men ikke noe ille)
Putt alle tester i project-root/test (konvensjon)
Lag et directory for hver type test
describe('making a post', function() {
it('logs in and creates a new item', function() {
// go to homepage
// click 'login'
// fill out and submit login form
// submit a new item on the home page
// The new item should be visible as the first item on the page
});
});test/e2e/making-an-item.spec.js
exports.config = {
framework: 'mocha',
specs: [
'test/e2e/**/*.spec.js'
]
};Bruk Mocha & kjør tester med navn *.spec.js
(husk $ npm install --save-dev mocha)
describe('making a post', function() {
it('logs in and creates a new post', function() {
// go to homepage
browser.get('http://localhost:3000');
// click 'login'
// fill out and submit login form
// submit a new post on the posts page
// The new post should be visible as the first post on the page
});
});$ ./node_modules/.bin/protractor
Starting selenium standalone server...
[launcher] Running 1 instances of WebDriver
Selenium standalone server started at http://10.21.24.161:63592/wd/hub
Listening on port 3001
making a post logs in and creates a new post: Connected to MongoDB!
․ making a post logs in and creates a new post: 1289ms
1 passing (1s)
Shutting down selenium standalone server.
[launcher] 0 instance(s) of WebDriver still running
[launcher] chrome #1 passed(Samme kommando som før, uten update)
Siden må være en faktisk Angular-app
Start serveren fra Protractor
exports.config = {
framework: 'mocha',
specs: [
'test/e2e/**/*.spec.js'
],
onPrepare: function() {
require('./server-node/hello-tests-server.js');
}
};Hva hvis den allerede kjører?
project root/protractor.conf.js
project root/server-node/the-server.js
project root/test/e2e/the-test.js
// find an element using css selector
by.css('.someclass');
// find an element using id
by.id('someid');
// find an element by ng-model (e.g. username)
by.model('username');
// find an element by binding (e.g., {{currentUser}})
by.binding('currentUser');
// find an element by repeater (e.g., item in items
by.repeater('item in items');// click a button or link
element(by.css('.mybutton')).click();
// fill out a text input
element(by.css('.username-input')).sendKeys('theneva');NB: Events er asynkrone
// fill out and submit login form
var usernameInput = element(by.model('username'));
usernameInput.sendKeys('theneva');
var passwordInput = element(by.model('password'));
passwordInput.sendKeys('1234');
// Click the login button
var loginButton = element(by.css('.button-login'));
loginButton.click();
// save a new item on the home page
var nameInput = element(by.model('newItem.name'));
nameInput.sendKeys('Some random item');
var saveButton = element(by.css('.button-save'));
saveButton.click();
// the new item should be visible as the first item on the page
element.all(by.repeater('item in items')).then(function(items) {
var firstItem = items[0];
firstItem.element(by.css('.item-name')).getText().then(function(firstItemName) {
console.log(firstItemName);
});
firstItem.element(by.css('.item-author')).getText().then(function(firstItemAuthor) {
console.log(firstItemAuthor);
});
});Assertion time!
... vent, Mocha har ikke assertions?
$ npm install --save-dev chai
var expect = require(’chai ’).expect;
...
firstItem.element(by.css(’.item−name’)).getText().then(function(firstItemName) {
expect(firstItemName).to.equal(itemContent);
});
firstItem.element(by.css(’.item−author’)).getText().then(function(firstItemAuthor) {
expect(firstItemAuthor).to.equal(username);
});Ex: wrong assertion:
var expect = require('chai').expect;
var controller = require('../../../server-node/controllers/items');
describe('controllers.items', function() {
it('should exist', function() {
expect(controller).to.exist;
});
});$ mocha test/node/controllers/items.spec.jstest/mocha.opts: finds all tests in test/node recursively
test/node
−−recursiveNeste gang
Endelig noe annet enn dependencies i package.json!
{
"name": "itemsApp",
"dependencies: "<@\dots@>",
"devDependencies": "<@\dots@>",
"scripts": {
"test: "./node_modules/.bin/mocha && ./node_modules/.bin/protractor"
}
}package.json
$ npm test
PS: Man kan definere andre scripts også!