54
Testing in Frontend World Nikita Galkin

Никита Галкин "Testing in Frontend World"

  • Upload
    fwdays

  • View
    114

  • Download
    5

Embed Size (px)

Citation preview

Page 1: Никита Галкин "Testing in Frontend World"

Testing in Frontend WorldNikita Galkin

Page 2: Никита Галкин "Testing in Frontend World"

NikitaGalkin

Love and Know:▰ how to make developers and business happy▰ technical and process debt elimination

Believe that:▰ Any problem must be solved at the right level▰ Software is easy. People are hard▰ A problem should be highlighted,

an idea should be "sold",a solution should be demonstrated

Links:Site GitHub Twitter Facebook

2

Page 3: Никита Галкин "Testing in Frontend World"

Why Test?Motivation

3

Page 4: Никита Галкин "Testing in Frontend World"

4© turnoff.us

Page 5: Никита Галкин "Testing in Frontend World"

Portrait of Ukrainian Node.js developer

5

Page 6: Никита Галкин "Testing in Frontend World"

What is testing?Several points of view

6

Page 7: Никита Галкин "Testing in Frontend World"

7

Bugs:elimination,

taming,controll,

...

Page 8: Никита Галкин "Testing in Frontend World"

8

Verification of requirements implementation

Page 9: Никита Галкин "Testing in Frontend World"

9

Understanding review

Page 10: Никита Галкин "Testing in Frontend World"

Types of testing More work, more time, more money

10

Page 11: Никита Галкин "Testing in Frontend World"

11

1. Usability testing2. Performance testing3. Load testing4. Stress testing5. Security testing6. Configuration testing7. Compatibility testing8. Installability testing9. Recovery testing10. Availability testing11. Volume testing12. ...

Page 12: Никита Галкин "Testing in Frontend World"

12

Page 13: Никита Галкин "Testing in Frontend World"

13

LintingUnit testingComponent testingVisual testingEnd to end testing

Page 14: Никита Галкин "Testing in Frontend World"

14

Who are you? Frontend or Full

Stack?What is your

artifact?

Page 15: Никита Галкин "Testing in Frontend World"

15

Your project should have

automated tests running in CI

Page 16: Никита Галкин "Testing in Frontend World"

AAA

16

Page 17: Никита Галкин "Testing in Frontend World"

Test structure

Arrange/Given – setup data and dependency.Act/When – run the code.Assert/Then – check expectation.Cleanup – remove side effects and clean data.

17

Page 18: Никита Галкин "Testing in Frontend World"

Without structure

18

describe('Array', function() { describe('#indexOf()', function() { it('should return -1 when the value is not present', function() { assert.equal(-1, [1,2,3].indexOf(4)); }); });});

Page 19: Никита Галкин "Testing in Frontend World"

With structure

19

describe('Array', function() { describe('#indexOf()', function() { it('should return -1 when the value is not present', function() { // arrange const arr = [1,2,3]; const el = 4; // act const index = arr.indexOf(el); // assert assert.equal(-1, index); }); });});

Page 20: Никита Галкин "Testing in Frontend World"

FIRSTDRY, YAGNI, KISS, SOLID, etc

20

Page 21: Никита Галкин "Testing in Frontend World"

21

FastIndependentRepeatableSelf-ValidatingThorough&Timely

Page 22: Никита Галкин "Testing in Frontend World"

Fast

22

Page 23: Никита Галкин "Testing in Frontend World"

▰ A developer should not hesitate to run the tests as they are slow.

▰ All of these including setup, the actual test and tear down should execute really fast (milliseconds) as you may have thousands of tests in your entire project.

run tests in parallel with ava or jest using mock and stabs

Fast

23

Page 24: Никита Галкин "Testing in Frontend World"

Independent

No order-of-run dependency.They should pass or fail the same way in suite or when run individually.

24

Page 25: Никита Галкин "Testing in Frontend World"

Independent

25

beforeEach(function() { return db.clear() .then(function() { return db.save([tobi, loki, jane]); });});

Page 26: Никита Галкин "Testing in Frontend World"

▰ A test method should NOT depend on any data in the environment/instance in which it is running.

▰ Deterministic results - should yield the same results every time and at every location where they run.

▰ No dependency on date/time or random functions output.

▰ Each test should setup or arrange it's own data.

Repeatable

26

Page 27: Никита Галкин "Testing in Frontend World"

Repeatable

27

it('should write to log',(done)=> {// @todo Fix on travis file writing if (process.env.TRAVIS) { return this.skip() }// main logic ...}

Page 28: Никита Галкин "Testing in Frontend World"

Self-Validating

28

No manual inspection required to check whether the test has passed or failed.

Page 29: Никита Галкин "Testing in Frontend World"

Timely

29

Write tests!

Page 30: Никита Галкин "Testing in Frontend World"

LINTINGCHEAP and SIMPLE

30

Page 31: Никита Галкин "Testing in Frontend World"

Linting

31

▰ Code style documentation▰ Review code,

not code style▰ Autochecking best

practises

Page 32: Никита Галкин "Testing in Frontend World"

Eslint

32

▶ eslint --init? How would you like to configure ESLint? Use a popular style guide? Which style guide do you want to follow? (Use arrow keys)❯ Google Airbnb Standard

Page 33: Никита Галкин "Testing in Frontend World"

ESLint v4.12.0 released

33

New Rules▰ implicit-arrow-linebreak. This rule aims to

enforce a consistent location for an arrow function containing an implicit return.

Autofixable Rules▰ sort-vars. At present, it will only sort

variables with no initial value or a literal initial value, in order to avoid potentially changing the order of function calls.

Page 34: Никита Галкин "Testing in Frontend World"

UNIT TESTINGIn Node.js we trust

34

Page 35: Никита Галкин "Testing in Frontend World"

“Code that is perfect for unit-testing is codethat has no I/O or UIdependencies.

Page 36: Никита Галкин "Testing in Frontend World"

36

BE is the best place

for business logic and

unit tests...

Page 37: Никита Галкин "Testing in Frontend World"

37

or create NPM package!

Page 38: Никита Галкин "Testing in Frontend World"

COMPONENT TESTING

First there was a component

38

Page 40: Никита Галкин "Testing in Frontend World"

Storybook

40

▰ storybook.js.org▰ Documentation as a code▰ Addons!▰ React and Vue support▰ CLI integrated

Page 41: Никита Галкин "Testing in Frontend World"

Storybook code

41

import React from 'react';import { storiesOf } from '@storybook/react';import { action } from '@storybook/addon-actions';import Button from '../components/Button';

storiesOf('Button', module) .add('with text', () => ( <Button onClick={action('clicked')}>Hello Button</Button> )) .add('with some emoji', () => ( <Button onClick={action('clicked')}>� � </Button> ));

Page 42: Никита Галкин "Testing in Frontend World"

Structural Testing

42

▰ Stringсomparison

▰ There is addonStoryshots

Page 43: Никита Галкин "Testing in Frontend World"

Interaction Testing

43

▰ Enzyme▻ Karma▻ Mocha▻ Jest

▰ There is addon called specs▰ Don’t use for rendering testing!

Page 44: Никита Галкин "Testing in Frontend World"

Interaction Testing

44

import React from 'react';import { expect } from 'chai';import { shallow } from 'enzyme';import sinon from 'sinon';import MyComponent from './MyComponent';import Foo from './Foo';

describe('<MyComponent />', () => { it('simulates click events', () => { const onButtonClick = sinon.spy(); const wrapper = shallow(<Foo onButtonClick={onButtonClick} />); wrapper.find('button').simulate('click'); expect(onButtonClick).to.have.property('callCount', 1); });});

Page 45: Никита Галкин "Testing in Frontend World"

Interaction Testing

45

Page 46: Никита Галкин "Testing in Frontend World"

Visual testingBrowsers are required

46

Page 47: Никита Галкин "Testing in Frontend World"

Visual Testing

47

Page 48: Никита Галкин "Testing in Frontend World"

Visual Testing

48

gemini.suite('yandex-search', function(suite) { suite.setUrl('/') .setCaptureElements('.main-table') .capture('plain') .capture('with text', function(actions, find) { actions.sendKeys(find('.input__control'), 'hello gemini'); //… check ScreenShot });});

Page 49: Никита Галкин "Testing in Frontend World"

e2e testingQA Engineer job

49

Page 50: Никита Галкин "Testing in Frontend World"

e2e testing

50

▰ As visual testing use real backend▰ Focus on UX, not on UI▰ Mark your elements for better tests

▻ We use data-e2e attribute for that.▰ Angular has e2e ready framework

protractortest.org

Page 51: Никита Галкин "Testing in Frontend World"

ConclusionsLet’s repeat

51

Page 52: Никита Галкин "Testing in Frontend World"

52

Page 53: Никита Галкин "Testing in Frontend World"

53

LintingUnit testingComponent testingVisual testingEnd to end testing

Page 54: Никита Галкин "Testing in Frontend World"

54

THANKS!WRITE TESTS!

BE AWESOME!!!

You can find me on Twitter as @galk_in

Slides are available at speakerdeck.com/galkin

or at my site galk.in