design decisions for · 2020-02-11 · your test automation framework cost? cypress.io is...

49
DESIGN DECISIONS FOR DESIGN DECISIONS FOR PERFECT JAVASCRIPT TESTING FRAMEWORK PERFECT JAVASCRIPT TESTING FRAMEWORK Michael Bodnarchuk 2019

Upload: others

Post on 31-May-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

DESIGN DECISIONS FORDESIGN DECISIONS FORPERFECT JAVASCRIPT TESTING FRAMEWORKPERFECT JAVASCRIPT TESTING FRAMEWORK

Michael Bodnarchuk 2019

Page 2: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

ABOUT MEABOUT MEMichael Bodnarchuk @davertWeb developer from Kyiv, UkraineLead developer of CodeceptJSOpen-source contributorTech Consultant, CTO at SDCLabs

Page 3: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

MY VISIONMY VISIONTests should be simple to write and understandTests have their priority. Don't write tests for everythingTests should follow business valuesTesting should be joyful

Page 4: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

SO YOU WANT SOME BROWSER TEST AUTOMATION?SO YOU WANT SOME BROWSER TEST AUTOMATION?

Page 5: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

JAVASCRIPT IS THE FUTUREJAVASCRIPT IS THE FUTUREFOR TEST AUTOMATIONFOR TEST AUTOMATION

Page 6: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

JAVASCRIPT!JAVASCRIPT!Simple language*Rich ecosystemNot limited to SeleniumIn browser execution

Page 7: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

*JAVASCRIPT IS SIMPLE EXCEPT*JAVASCRIPT IS SIMPLE EXCEPT

PROMISESPROMISES

Page 8: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

LET'S MAKE A SNOWMANLET'S MAKE A SNOWMAN1. Testing Framework2. Assertion library3. Browser Driver4. Runner

Page 9: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

TESTING FRAMEWORKTESTING FRAMEWORKHow tests are written

mochajasminecucumberjestava

Page 10: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

Testing frameworks are pretty much the same for e2e

Page 11: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

ASSERTION LIBRARIESASSERTION LIBRARIESHow to make assertions

chaiframework-relevantnative assert

Page 12: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

In NodeJS assertion libraries are decoupled from a testingframework.

Page 13: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

BROWSER DRIVERBROWSER DRIVERselenium-webdriverProtractorwebdriverioCypress.ioPuppeteerTestCafeNightwatchJSNightmareJS

Page 14: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

RUNNERRUNNERCLI tool to execute tests

mochaprotractorwdiocypresstestcafe

Page 15: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

IN DETAILSIN DETAILS

Page 16: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

BROWSER CONTROLBROWSER CONTROLInternal | External

Page 17: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level
Page 18: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

SELENIUM-WEBDRIVERSELENIUM-WEBDRIVER

O�cial library of SeleniumThe most used Selenium library in NodeJSDocumentation?Repository?

Page 19: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

PROTRACTORPROTRACTOR

Selenium (built on top of o�cial library)Good DocumentationJasmine Testing FrameworkAngular supportJava-like syntaxOoooooutdatedProtractor 6 will break everything

Page 20: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

EXAMPLEEXAMPLEbeforeEach(function() {

browser.get('http://www.angularjs.org');

todoList = element.all(by.repeater('todo in todoList.todos'));

});

it('should add a todo', function() {

var addTodo = element(by.model('todoList.todoText'));

var addButton = element(by.css('[value="add"]'));

addTodo.sendKeys('write a protractor test');

addButton.click();

expect(todoList.count()).toEqual(3);

expect(todoList.get(2).getText()).toEqual('write a protractor test');

});

Page 21: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

NIGHTWATCHNIGHTWATCH

Mastodon of web testing in JSSelenium (JSON-Wire) basedEveryone used it beforeEveryone tries to migrate from it...But they have fancy logo

Page 22: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

this.demoTestGoogle = function (browser) {

browser

.useXpath() // every selector now must be xpath

.click("//tr[@data-recordid]/span[text()='Search Text']")

.useCss() // we're back to CSS now

.setValue('input[type=text]', 'nightwatch')

browser.expect

.element('body')

.to.have.attribute('class')

.which.contains('found-item');

};

Page 23: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

WEBDRIVERIOWEBDRIVERIO

Alternative Selenium implementationMobile testing (Native Apps) with AppiumAwesome documentationv4 to v5 upgrade...W3C spec + JSONWire specStandalone / Jasmine / Mocha / Cucumber integration

Page 24: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

EXAMPLEEXAMPLE// page object

class FormPage extends Page {

get username () { return $('#username') }

get password () { return $('#password') }

}

// test

browser.url('/form');

FormPage.username.setValue('foo')

FormPage.password.setValue('bar')

FormPage.submit()

Page 25: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

CYPRESS.IOCYPRESS.IO

Chrome-based, runs inside a browserMocha testing framework + chai assertionsUI DebuggerGood documentationAuto retry failed steps

No XPathNo �le uploadsNo multiple browsers, multiple tabsNo iframes

LIMITATIONS!!!

Page 26: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

EXAMPLEEXAMPLEit('adds 2 todos', function () {

cy.visit('/');

cy.get('.new-todo')

.type('learn testing{enter}')

.type('be cool{enter}')

cy.get('.todo-list li').should('have.length', 2)

})

Page 27: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

HOW MUCH DOESHOW MUCH DOESYOUR TESTYOUR TEST

AUTOMATIONAUTOMATIONFRAMEWORK COST?FRAMEWORK COST?

Page 28: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level
Page 29: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

Cypress.io is over-estimated as end 2 end testing framework

Page 30: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

PUPPETEERPUPPETEER

O�cial Google Chrome DevTools libraryStandalone library (no testing framework)Good API DocumentationProvides full browser controlHeaders, Mock requests, ResponsesMulti tab control, incognito modeIframes, �le upload...

Page 31: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

EXAMPLEEXAMPLE

beforeEach(async () => {

const page = await browser.newPage()

await page.setViewport({ width: 1280, height: 800 })

await page.goto('https://www.walmart.com/ip/Super-Mario-Odyssey-Nint

await page.click('button.prod-ProductCTA--primary')

await page.waitForSelector('.Cart-PACModal-ItemInfoContainer')

await page.screenshot({path: screenshot})

await browser.close()

});

Page 32: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

TESTCAFETESTCAFE

Cross-browser client-side testingProxy server for mocking all requestsDoesn't control browserCustom test framework, assertions, runnerParallel execution built-inMulti-browser setup

Page 33: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

EXAMPLEEXAMPLEtest('Dealing with text using keyboard', async t => {

await t

.typeText(page.nameInput, 'Peter Parker') // Type name

.click(page.nameInput, { caretPos: 5 }) // Move caret position

.pressKey('backspace') // Erase a character

.expect(page.nameInput.value).eql('Pete Parker') // Check result

.pressKey('home right . delete delete delete') // Pick even shorter

.expect(page.nameInput.value).eql('P. Parker'); // Check result

});

Page 34: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

HOW TO CHOOSE DRIVERHOW TO CHOOSE DRIVERLearn how the tool worksConsider its limitationsCheck documentationUpgrade strategyLook into source code

Page 35: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

ASYNCHRONITYASYNCHRONITYIn JavaScript all browser commands are promises

Driver Strategy

selenium-webdriver async/await

Protractor 5 control �ow

Protractor 6 async/await

webdriverio sync �bers, async/await

cypress control �ow

Puppeteer async/await

TestCafe async/await

Page 36: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

HOW TO CHOOSE TESTING FRAMEWORKHOW TO CHOOSE TESTING FRAMEWORKUse the one provided by driverExcept...

Page 37: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

...CUCUMBER...CUCUMBERHas its own runner & testing frameworkTo hide JS complexityTo work as BDD toolSupported by standalone libraries

ProtractorWebdriverIOPuppeteer

Page 38: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

EXAMPLEEXAMPLEFeature: Visit the app dashboard

As a citizen

I should be able to log in to the app with DigiD

In order to access my personal information

Scenario: Log in with DigiD

Given I am logged in with DigiD as 123456789

And there are the following toggles: personal

When I visit the dashboard

Then I should be greeted with H.A. Janssen

Page 39: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

CONCLUSIONSCONCLUSIONSGet your requirementsLearn ecosystemChoose the testing stack

Page 40: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

LET'S BUILD PERFECT TESTING FRAMEWORK!LET'S BUILD PERFECT TESTING FRAMEWORK!

Page 41: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

WE DID IT!WE DID IT!

...but not that snowman!

Page 42: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

WHATEVER YOU CHOOSE, YOU LOSE!WHATEVER YOU CHOOSE, YOU LOSE!New testing frameworks emergeCool fancy library will be legacy tomorowYou hit issues with edge casesDi�erent APIYou can't migrate your code

Page 43: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

SURVIVE THE CHANGESURVIVE THE CHANGEWrite high level test codeSeparate scenario from browser controlUse Cucumber or CodeceptJS

Page 44: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

CODECEPTJSCODECEPTJSMulti-driver testing framework

webdriverioPuppeteerProtractor

Custom runner, mocha-based test frameworkHigh level API (with Cucumber support)Interactive debug modeAuto retry failed steps

Page 45: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

ARCHITECTUREARCHITECTURE

WebDriverIO Protractor Nightmare Puppeteer

ElectronWebDriver API

CODECEPTJS

Selenium Server

Firefox Browser Chrome BrowserEdge Browser

DevTools Protocol

Cloud Browsers

HELPERS

Page 46: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

EXAMPLEEXAMPLEScenario('todomvc', (I, loginPage) => {

const user = await I.createUser('davert');

loginPage.login(davert);

I.see('davert', 'nav');

I.click('Create Todo');

I.see('1 item left', '.todo-count');

I.fillField('What needs to be done?', 'Write a test');

I.pressKey('Enter');

I.see('Write a test', '.todo-list');

I.see('2 items left', '.todo-count');

I.fillField('What needs to be done?', 'Write a code');

I.pressKey('Enter');

I.see('Write a code', '.todo-list');

I.see('3 items left', '.todo-count');

});

Page 47: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

LIVE DEVELOPMENTLIVE DEVELOPMENTI.amOnPage('/');

pause();

Call pause() to interrupt the testUse interactive shell to try di�erent commandsCopy successful commands into a test

Page 48: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

CONCLUSIONSCONCLUSIONSFor advanced e2e testing use webdriverioFor full browser control use puppeteerFor high-level automated e2e tests use codeceptjsFor component testing use cypress.ioFor simple multi-browser testing use testcafeFor BDD use CucumberJS

Page 49: DESIGN DECISIONS FOR · 2020-02-11 · YOUR TEST AUTOMATION FRAMEWORK COST? Cypress.io is over-estimated as end 2 end testing framework. ... mocha-based test framework High level

THANK YOU!THANK YOU!Michael Bodnarchuk @davert

Web developer from Kyiv, UkraineAuthor of CodeceptJS testing frameworksConsultant @ SDCLabs