Ólafur Sverrir Kjartansson, [email protected]
- Þegar við skrifum kóða erum við alltaf að athuga hvernig hann virkar
- Gerum það yfirleitt handvirkt
- Getum eytt tíma og skrifað próf fyrir þessa handvirku athugun
- Getum keyrt mörg próf hratt, aftur og aftur
- „Notum“ kóðann okkar á meðan við skrifum hann, getum endað með betra API
- Gefur okkur ákveðið traust á virkni og að við munum ekki brjóta hana seinna meir
- Það tekur töluvert lengri tíma að skrifa próf en að athuga eitthvað handvirkt
- Geta gefið okkur falskt öryggi um að það séu ekki villur í kóðanum okkar því við skrifuðum próf
- Við breytingar á kóða þarf að uppfæra próf og ef það er erfitt er mun auðveldara að slökkva bara á þeim
- Ekki vel skilgreint hugtak en..
- Próf á einni einingu í einu án þess að horfa á alla heildina
- Eining gæti verið fall, klasi, módull
- Sumir segja að unit test eigi ekki að snerta á I/O eða einhverju fyrir utan einingu
- Hjálpa okkur við að komast að því hvernig við viljum smíða forritið okkar
- Fáum endurgjöf hratt og örugglega meðan við erum að skrifa
- Leyfa okkur að breyta kóða með vissu öryggi — erum með próf til staðar sem grípa villur
- Prófin geta komið í stað eða aukið við skjölun, sýna bókstaflega hvernig kerfið virkar
- Fyrir villur sem finnast getum við skrifað próf áður en við lögum
- Minnkum líkur á að villa komi upp aftur
- Einföld & DRY (Don't Repeat Yourself)
- Einn hlutur í einu
- Óhað röð sem þau eru keyrð í
- Endurtakanleg (repeatable) með sömu niðurstöðum
- Hröð
- Gæti falið í sér að mocka út allar þjónustur og stöður
- Mocks herma eftir hlutum þ.a. við vitum nákvæmlega hvernig hegðun verður
- Notum ef hlutur er hægur, flókinn, brigðgengur (non-deterministic) o.fl.
- Stubs (stundum kallað fake) eru stubbar sem við skrifum í staðinn fyrir virkni, t.d. að láta fall alltaf skila sömu niðurstöðu
- Þegar við prófum og notum mocks þurfum við að passa að prófa ekki bara þau sjálf, heldur einblína á að prófa raunverulega virkni
- Mocks, stubs og fakes eru ekki vel skilgreind hugtök og notuð á mismunandi hátt af mismunandi aðilum
- Forrit og stillingar sem sjá um að keyra prófin okkar
- Taka saman niðurstöður og láta vita stöðuna
- Get keyrt virkni fyrir og eftir hvert próf eða fyrir og eftir öll próf
- Við skrifum prófin okkar þ.a. þau staðhæfi eitthvað í lokin
- Við gefum rétt gildi og athugum hvort það sé eins
assert(result === 'foo');
- Ættum að hafa færri en fleiri staðhæfingar í hverju prófi
- ekki gera of mikið
- Ein leið til að skipuleggja próf er að fylgja arrange, act, assert
const input = 'bar'; // Arrange
const res = reverse(input); // Act
assert(res === 'rab'); // Assert
Endurtökum:
- Byrjum á að skrifa próf sem bregst
- Skrifum kóða til að láta prófið (og öll önnur próf) heppnast
- Hreinsum kóða og keyrum próf
- Svipar til TDD en einblínir á virkni en ekki prófin sjálf
- Breytum því hvernig við skrifum staðhæfingar og notum
- x ætti að vera jafnt y
foo.should.equal('bar')
- býst við að x sé jafnt y
expect(foo).to.equal('bar');
- Mikil einföldun á flóknara hugtaki
- Hversu stórt hlutfall af kóðanum okkar er prófaður?
- Nokkrar skilgreiningar
- function - hlutfall falla sem kallað er í
- statement - er hver skipun keyrð?
- branch - hefur hver grein verið prófuð? T.d. bæði
if
ogelse
- condition - hafa allar segðir verið prófaðar? T.d.
foo && bar
fyrir alla fjóra möguleika
- Prófa fleiri en eina einingu í einu
- Uppflettingar í gagnagrunn
- Samskipti yfir net
- O.fl.
- Gætu tekið lengri tíma
- Mocha er test framework sem styður mörg assertion library
- Chai er assertion library sem styður
assert
,should
ogexpect
- Sinon sér um mocks og stubs
- istanbul fyrir code coverage
- Nock prófar HTTP beiðnir
- Setjum upp test suite með
describe
- Hvert test er innan
it(description, test)
- description er lýsing á prófi sem byrjar á should
- test er prófið sjálft sem fall
- Getum prófað ósamfasa kóða með
async await
í Mocha
- Setjum upp almennt
npm install -g mocha
- Getum keyrt með mörgum flöggum, t.d.:
-w
- Fylgjast með skrá og keyra ef breytist-R
- Hvernig niðurstaða lítur út, t.d.spec
,dot
const chai = require('chai');
chai.should();
describe('Array', () => {
describe('#indexOf()', () => {
it('should return -1 when the value is not present', () => {
[1,2,3].indexOf(5).should.equal(-1);
});
});
});
jest
er test framework frá Facebook- Orðið frekar vinsælt og sérstaklega með React
- Kemur uppsett með
create-react-app
og í skjölun eru ítarlegar leiðbeiningar - Getum notað með
enzyme
til að staðfesta útkomu úr componentum
import React from 'react';
import { shallow } from 'enzyme';
import App from './App';
it('renders welcome message', () => {
const wrapper = shallow(<App />);
const welcome = <h2>Welcome to React</h2>;
expect(wrapper.contains(welcome)).toEqual(true);
});
- Continuous integration (CI) er þegar við keyrum öll test við hvert commit í source control
- „Integration“ kemur frá því að við erum að integratea við
master
branch- Ef það er gert sjaldan getur komið upp staða þar sem gefa á út og það þarf að mergea mörgu í einu
- Integration hell
- Höfum ákveðið traust á því að
master
sé alltaf tilbúið til útgáfu
- Continuous deployment er þegar við gefum
master
út á raunkerfi fyrir hverja breytingu sem stenst próf - Höldum
master
alltaf í deployable ástandi - Hægt að gefa út oft á dag
- Getum sett upp CI á Heroku ef við notum pipelines
- Skilgreinum nokkur öpp saman í pipeline, t.d.
dev
, alltaf nýjasta útgáfa afmaster
, tengist þróunarþjónustumtest
, útgáfa sem verið er að fara að gefa út, tengist raunþjónustum eða afriti af þeimprod
, raunkeyrsla á kerfi
- Ef við tengjum pipeline við GitHub getum við sjálfkrafa búið til ný öpp fyrir hvert PR
- create-react-app buildpack hefur stuðning við Heroku CI
- Heroku + Git + test + CI = 😍