Skip to content

Commit 491af91

Browse files
committed
part5d fixes
1 parent b6e4916 commit 491af91

File tree

3 files changed

+44
-58
lines changed

3 files changed

+44
-58
lines changed

src/content/5/fi/osa5d.md

Lines changed: 44 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,13 @@ Jos valintasi on Playwright, jatka eteenpäin. Jos päädyt käyttämään Cypre
3535

3636
Kirjastojen vertailuista on kirjoitettu monia blojeja, esim. [tämä](https://www.lambdatest.com/blog/cypress-vs-playwright/) ja [tämä](https://www.browserstack.com/guide/playwright-vs-cypress).
3737

38-
On vaikea sanoa kumpi kirjastoista on parempi. Eräs Playwrightin etu on sen selaintuki, Playwright tukee Chromea, Firefoxia ja Webkit-pohjaisia selaimia kuten Safaria. Nykyisin Cypress sisältää tuen kaikkiin näihin selaimiin, Webkit-tuki on tosin vasta kokeellinen ja ei tue kaikkia Cypressin ominaisuuksia. Oma preferenssini kallisuu kirjoitushetkellö (1.3.2024) hieman Playwrightin puolelle.
38+
On vaikea sanoa kumpi kirjastoista on parempi. Eräs Playwrightin etu on sen selaintuki, Playwright tukee Chromea, Firefoxia ja Webkit-pohjaisia selaimia kuten Safaria. Nykyisin Cypress sisältää tuen kaikkiin näihin selaimiin, Webkit-tuki on tosin vasta kokeellinen ja ei tue kaikkia Cypressin ominaisuuksia. Oma preferenssini kallisuu kirjoitushetkellä (1.3.2024) hieman Playwrightin puolelle.
3939

4040
Tutustutaan nyt Playwrightin käyttöön.
4141

4242
### Testien alustaminen
4343

44-
Toisin kuin React-frontille tehdyt yksikkötestit tai backendin tekstit, nyt tehtävien End to End -testien ei ei tarvitse sijaita samassa npm-projektissa missä koodi on. Tehdään E2E-testeille kokonaan oma projekti komennolla _npm init_. Asennetaan sitten Playwright suorittamalla suorittamalla uuden projektin hakemistossa komento
44+
Toisin kuin React-frontille tehdyt yksikkötestit tai backendin tekstit, nyt tehtävien End to End -testien ei tarvitse sijaita samassa npm-projektissa missä koodi on. Tehdään E2E-testeille kokonaan oma projekti komennolla _npm init_. Asennetaan sitten Playwright suorittamalla uuden projektin hakemistossa komento
4545

4646
```js
4747
npm init playwright@latest
@@ -154,7 +154,7 @@ Tehdään <i>backendille</i> npm-skripti, jonka avulla se saadaan käynnistetty
154154
}
155155
```
156156

157-
Käynnistetään frontend ja backend, ja luodaan sovellukselle ensimmäinen testi tiedotoon <code>tests/note\_app.spec.js</code>:
157+
Käynnistetään frontend ja backend, ja luodaan sovellukselle ensimmäinen testi tiedostoon <code>tests/note\_app.spec.js</code>:
158158

159159
```js
160160
const { test, expect } = require('@playwright/test')
@@ -169,7 +169,7 @@ test('front page can be opened', async ({ page }) => {
169169
```
170170

171171
Ensin testi avaa sovelluksen metodilla [page.goto](https://playwright.dev/docs/writing-tests#navigation).
172-
Tämän jälkeen testi etsii metodilla [page.getByText](https://playwright.dev/docs/api/class-page#page-get-by-text) [lokaattorin](https://playwright.dev/docs/api/class-locator) joka vastaa elementtiä missä esiintyy teksti <i>Notes</i>.
172+
Tämän jälkeen testi etsii metodilla [page.getByText](https://playwright.dev/docs/api/class-page#page-get-by-text) [lokaattorin](https://playwright.dev/docs/api/class-locator) joka vastaa elementtiä, missä esiintyy teksti <i>Notes</i>.
173173

174174
Metodilla [toBeVisible](https://playwright.dev/docs/api/class-locatorassertions#locator-assertions-to-be-visible) varmistetaan, että lokaattoria vastaava elementti on renderöitynä näkyville.
175175

@@ -189,7 +189,7 @@ test('front page can be opened', async ({ page }) => {
189189
})
190190
```
191191

192-
Kuten arvata saattaa, testi ei mene läpi. Playwright avaa testiraportin selaimeen ja siitä käy selväksi, että Playwright on itseasiassa suorittanut testit kolmella eri selaimella Chromella, yhden Firefoxilla sekä Webkitillä eli esim. Safarin käyttämällä selaimoottorilla:
192+
Kuten arvata saattaa, testi ei mene läpi. Playwright avaa testiraportin selaimeen ja siitä käy selväksi, että Playwright on itseasiassa suorittanut testit kolmella eri selaimella Chromella, yhden Firefoxilla sekä Webkitillä eli esim. Safarin käyttämällä selainmoottorilla:
193193

194194
![](../../images/5/play2.png)
195195

@@ -221,7 +221,7 @@ describe('Note app', () => {
221221
})
222222
```
223223

224-
Ennen kuin mennään eteenpäin, rikotaan testit vielä kertaalleen. Huomaamme, että testien suoritus on melko nopeaa kuin testit menevät läpi, mutta paljon hitaampaa jos testit eivät mene läpi. Syynä tälle on se, että Playwrightin toimintaperiaatteena on odottaa etsittyjä elementtejä kunnes [ne ovat renderöityjä ja toimintaan valmiita](https://playwright.dev/docs/actionability). Jos elementtiä ei löydy, seurauksena on _TimeoutError_ ja testi ei mene läpi. Playwright odottaa elementtejä oletusarvoisesti 5 tai 30 sekunnin ajan testauksessa käytetyistä funktioista [riippuen](https://playwright.dev/docs/test-timeouts#introduction).
224+
Ennen kuin mennään eteenpäin, rikotaan testit vielä kertaalleen. Huomaamme, että testien suoritus on melko nopeaa kun testit menevät läpi, mutta paljon hitaampaa jos testit eivät mene läpi. Syynä tälle on se, että Playwrightin toimintaperiaatteena on odottaa etsittyjä elementtejä kunnes [ne ovat renderöityjä ja toimintaan valmiita](https://playwright.dev/docs/actionability). Jos elementtiä ei löydy, seurauksena on _TimeoutError_ ja testi ei mene läpi. Playwright odottaa elementtejä oletusarvoisesti 5 tai 30 sekunnin ajan testauksessa käytetyistä funktioista [riippuen](https://playwright.dev/docs/test-timeouts#introduction).
225225

226226
Testejä kehitettäessä voi olla viisaampaa pienentää odotettavaa aikaa muutamaan sekuntiin. [Dokumentaation](https://playwright.dev/docs/test-timeouts) mukaan tämä onnistuu muuttamalla tiedostoa _playwright.config.js_ seuraavasti:
227227

@@ -270,7 +270,7 @@ Klikkauksen jälkeen lomake tulee näkyviin
270270

271271
![](../../images/5/play5.png)
272272

273-
Kun lomake on avattu, testin tulisi etsiä siitä teksikentät ja kirjoittaa niihin käyttäjätunnus sekä salasana. Tehdään ensimmäinen yritys funktiota [page.getByRole](https://playwright.dev/docs/api/class-page#page-get-by-role) käyttäen:
273+
Kun lomake on avattu, testin tulisi etsiä siitä tekstikentät ja kirjoittaa niihin käyttäjätunnus sekä salasana. Tehdään ensimmäinen yritys funktiota [page.getByRole](https://playwright.dev/docs/api/class-page#page-get-by-role) käyttäen:
274274

275275
```js
276276
describe('Note app', () => {
@@ -293,7 +293,7 @@ Error: locator.fill: Error: strict mode violation: getByRole('textbox') resolved
293293
2) <input value="" type="password"/> aka locator('input[type="password"]')
294294
```
295295

296-
Ongelmana on nyt se, että _getByRole_ löytää kaksi tekstikenttää, ja metodin [fill](https://playwright.dev/docs/api/class-locator#locator-fill) ei onnistu. Eräs tapa kiertää ongelma on käyttää metodeja [first](https://playwright.dev/docs/api/class-locator#locator-first) ja [last](https://playwright.dev/docs/api/class-locator#locator-last):
296+
Ongelmana on nyt se, että _getByRole_ löytää kaksi tekstikenttää, ja metodin [fill](https://playwright.dev/docs/api/class-locator#locator-fill) kutsuminen ei onnistu, sillä se olettaa että löydettyjä tekstikenttiä on vain yksi. Eräs tapa kiertää ongelma on käyttää metodeja [first](https://playwright.dev/docs/api/class-locator#locator-first) ja [last](https://playwright.dev/docs/api/class-locator#locator-last):
297297

298298
```js
299299
describe('Note app', () => {
@@ -1078,24 +1078,17 @@ Jostain syystä testi alkaa toimia epäluotettavaksi, se menee välillä läpi j
10781078
10791079
### Testien kehittäminen ja debuggaaminen
10801080
1081-
Playwright tarjoaa muutamia melko hyviä testin kehittämistä ja debuggaamista auttavia työkaluja. [Dokumentaatiota](https://playwright.dev/docs/intro) kannattaa ehdottomasti selailla, eritysen tärkeitä ovat
1082-
- [lokaattoreita](https://playwright.dev/docs/locators) kertova osa antaa hyviä vihjeitä testattavien elementtien etsimiseen
1083-
- osa [actions](https://playwright.dev/docs/input) kertoo miten selaimen kanssa käytävää vuorovaikutusta on mahdollista simuloida testeissä
1084-
- [assertioista](https://playwright.dev/docs/test-assertions) kertova osa demonstroi mitä erilaisia testauksessa käytettäviä ekspektaatioita Playwright tarjoaa
1085-
1086-
Tarkemmat detaljit löytyvät [API](https://playwright.dev/docs/api/class-playwright)-kuvauksesta, erityisen hyödyllisiä ovat testattavan sovelluksen selainikkunaa vastaavan komponentin [Page](https://playwright.dev/docs/api/class-page) kuvaus, sekä testeissä etsittyjä elementtejä vastaavan komponentin [Locator](https://playwright.dev/docs/api/class-locator)-kuvaus.
1087-
10881081
Jos/kun testit eivät mene läpi ja herää epäilys, että vika on koodin sijaan testeissä, kannattaa testejä suorittaa [debug](https://playwright.dev/docs/debug#run-in-debug-mode-1)-moodissa.
10891082
1090-
Seuraava komento suorittaa yksittäisen testin debug-moodissa:
1083+
Seuraava komento suorittaa ongelmallisen testin debug-moodissa:
10911084
10921085
```
1093-
npm test -- --debug -g 'a new note can be created'
1086+
npm test -- -g'importance can be changed' --debug
10941087
```
10951088
10961089
Playwright-inspector näyttää testien etenemisen askel askeleelta. Yläreunan nuoli-piste-painike vie testejä yhden askeleen eteenpäin. Lokaattorien löytämät elementit sekä selaimen kanssa käyty interaktio visualisoituvat selaimeen:
10971090
1098-
![](../../images/5/play6.png)
1091+
![](../../images/5/play6a.png)
10991092
11001093
Oletusarvoisesti debugatessa askelletaan testi läpi komento komennolta. Jos on kyse monimutkaisesta testistä, voi olla melko vaivalloista askeltaa testissä kiinnostavaan kohtaan asti. Liialta askellukselta voidaan välttyä lisäämällä juuri kiinnostavaa kohtaa ennen komento _await page.pause()_:
11011094
@@ -1119,9 +1112,11 @@ describe('Note app', () => {
11191112

11201113
test('one of those can be made nonimportant', async ({ page }) => {
11211114
await page.pause() // highlight-line
1122-
const secondNoteElement = await page.getByText('second note').locator('..')
1123-
await secondNoteElement.getByRole('button', { name: 'make not important' }).click()
1124-
await expect(secondNoteElement.getByText('make important')).toBeVisible()
1115+
const otherNoteText = await page.getByText('second note')
1116+
const otherdNoteElement = await otherNoteText.locator('..')
1117+
1118+
await otherdNoteElement.getByRole('button', { name: 'make not important' }).click()
1119+
await expect(otherdNoteElement.getByText('make important')).toBeVisible()
11251120
})
11261121
})
11271122
})
@@ -1130,37 +1125,13 @@ describe('Note app', () => {
11301125
11311126
Nyt testissä voidaan siirtyä kiinnostavaan kohtaan yhdellä askelella, painamalla inspectorissa vihreää nuolisymbolia.
11321127
1133-
Debuggausmoodin sijaan tai rinnalla voi testien suorittaminen UI-moodissa olla hyödyllistä.
1134-
1135-
```
1136-
npm run test -- --ui
1137-
```
1138-
1139-
Kun suoritamme testit, huomamme UI:ta tarkastelemalla mielenkiintoisen ilmiön:
1140-
1141-
![](../../images/5/play7.png)
1142-
1143-
Kyse on seuraavasta testistä:
1144-
1145-
```js
1146-
describe('and several notes exists', () => {
1147-
beforeEach(async ({ page }) => {
1148-
await createNote(page, 'first note')
1149-
await createNote(page, 'second note')
1150-
await createNote(page, 'third note')
1151-
})
1128+
Kun suoritamme nyt testin ja hyppäämme suorituksessa komenon _page.pause()_ kohdalle, havaitsemme mielenkiintoisen seikan:
11521129
1153-
test('one of those can be made nonimportant', async ({ page }) => {
1154-
const secondNoteElement = await page.getByText('second note').locator('..')
1155-
await secondNoteElement.getByRole('button', { name: 'make not important' }).click()
1156-
await expect(secondNoteElement.getByText('make important')).toBeVisible()
1157-
})
1158-
})
1159-
```
1130+
![](../../images/5/play6b.png)
11601131
1161-
Testi menee kyllä läpi, mutta näyttää siltä, että selain ei renderöi kaikkia lohkossa _beforeEach_ luotuja muistiinpanoja. Mistä on kyse?
1132+
Näyttää siltä, että selain ei renderöi kaikkia lohkossa _beforeEach_ luotuja muistiinpanoja. Mistä on kyse?
11621133
1163-
Syynä ongelmaan on se, että kun testi luo yhden muistiinpanon, se aloittaa seuraavan luomisen jo ennen kuin palvelin on vastannut, ja lisätty muistiinpano on renderöidään ruudulle. Tämä taas saattaa aiheuttaa sen, että jotain muistiinpanoja katoaa, sillä selain päivitetään palvelimen vastatessa perustuen siihen muistiinpanojen tilaan mikä kyseisen lisäysoperaation alussa oli.
1134+
Syynä ongelmaan on se, että kun testi luo yhden muistiinpanon, se aloittaa seuraavan luomisen jo ennen kuin palvelin on vastannut, ja lisätty muistiinpano renderöidään ruudulle. Tämä taas saattaa aiheuttaa sen, että jotain muistiinpanoja katoaa (kuvassa näin kävi toisena luodulle muistiinpanolle), sillä selain uudelleenrenderöidään palvelimen vastatessa perustuen siihen muistiinpanojen tilaan mikä kyseisen lisäysoperaation alussa oli.
11641135
11651136
Ongelma korjaantuu "hidastamalla" lisäysoperaatioita siten, että lisäyksen jälkeen odotetaan komennolla [waitFor](https://playwright.dev/docs/api/class-locator#locator-wait-for), että lisätty muistinpano ehditään renderöidä:
11661137
@@ -1173,6 +1144,12 @@ const createNote = async (page, content) => {
11731144
}
11741145
```
11751146
1147+
Debuggausmoodin sijaan tai rinnalla voi testien suorittaminen UI-moodissa olla hyödyllistä. Tämä tapahtuu seuraavasti:
1148+
1149+
```
1150+
npm run test -- --ui
1151+
```
1152+
11761153
Lähes samaan tapaan kuin UI-moodi, toimii Playwrightin [Trace Viewer](https://playwright.dev/docs/trace-viewer-intro). Ideana siinä on, se että testeistä tallennetaan "visuaalinen jälki", jota voidaan tarkastella tarvittaessa testien suorituksen jälkeen. Trace tallennetaan suorittamalla testit seuraavasti:
11771154
11781155
```
@@ -1187,38 +1164,47 @@ npx playwright show-report
11871164
11881165
tai määrittelemällämme npm-skriptillä _npm run test:report_
11891166
1190-
Trace näyttää käytännöss samalta kuin testien suoritus UI-moodissa.
1167+
Trace näyttää käytännössä samalta kuin testien suoritus UI-moodissa.
11911168
1192-
UI-moodi tarjoaa myös mahdollisuuden avustettuun lokaattorien etsimiseen. Tämä tapahtuu painamalla alapalkin vasemmanpuoleista tuplaympyrää, ja sen jälkeen klikkaamalla haluttua käyttöliittymäelmenttiä. Playwright näyttää elementin lokaattorin:
1169+
UI-moodi sekä Trace viewer tarjoavat myös mahdollisuuden avustettuun lokaattorien etsimiseen. Tämä tapahtuu painamalla alapalkin vasemmanpuoleista tuplaympyrää, ja sen jälkeen klikkaamalla haluttua käyttöliittymäelmenttiä. Playwright näyttää elementin lokaattorin:
11931170
11941171
![](../../images/5/play8.png)
11951172
11961173
Playwright ehdottaa siis kolmannen muistiinpanon lokaattoriksi seuraavaa
11971174
11981175
```js
1199-
page.locator('li').filter({ hasText: 'third notemake not important' }).getByRole('button')
1176+
page.locator('li').filter({ hasText: 'third note' }).getByRole('button')
12001177
```
12011178
1202-
Tämä poikkeaa jossain määrin testien käyttämästä lokaattorista, joka oli
1179+
Metodia [page.locator](https://playwright.dev/docs/api/class-page#page-locator) kutsutaan parametrilla _li_ eli etsitään sivulta kaikki li-elementit, joita sivulla on yhteensä kolme. Tämän jälkeen rajaudutaan metodia [locator.filter](https://playwright.dev/docs/api/class-locator#locator-filter) käyttäen siihen li-elementtiin, joka sisältää tekstin <i>third notemake not important</i> ja otetaan sen sisällä oleva button-elementti metodia [locator.getByRole](https://playwright.dev/docs/api/class-locator#locator-get-by-role) käyttäen.
1180+
1181+
Playwrightin generoima lokaattori poikkeaa jossain määrin testien käyttämästä lokaattorista, joka oli
12031182
12041183
```js
1205-
page.getByText('second note').locator('..').getByRole('button', { name: 'make not important' })
1184+
page.getByText('first note').locator('..').getByRole('button', { name: 'make not important' })
12061185
```
12071186
12081187
Lienee makuasia kumpi lokaattoreista on parempi.
12091188
1210-
Playwright sisältää myös [testigeneraattorin](https://playwright.dev/docs/codegen-intro), jonka avulla on mahdollista "nauhottaa" käyttöliittymän kautta klikkailemalla testejä. Testigeneraattori käynnistyy komennolla
1189+
Playwright sisältää myös [testigeneraattorin](https://playwright.dev/docs/codegen-intro), jonka avulla on mahdollista "nauhottaa" käyttöliittymän kautta klikkailemalla testien käyttämiä lokaattoreita. Testigeneraattori käynnistyy komennolla
12111190
12121191
```
12131192
npx playwright codegen http://localhost:5173/
12141193
```
12151194
1216-
Testigeneraattori _Record_-tilan päälläollessa käyttäjän interaktion Playwright inspectoriin, mistä koodin käyttämät lokaattorit ja actionit voi sitten kopioida testeihin:
1195+
_Record_-tilan päälläollessa testigeneraattori "tallentaa" käyttäjän interaktion Playwright inspectoriin, mistä lokaattorit ja actionit on mahdollista kopioida testeihin:
12171196
12181197
![](../../images/5/play9.png)
12191198
12201199
Komentorivin sijaan Playwrightiä voi käyttää myös [VS Code](https://marketplace.visualstudio.com/items?itemName=ms-playwright.playwright)-pluginin kautta. Plugin tarjoaa monia käteviä ominaisuuksia, mm. breakpointien käytön testejä debugatessa.
12211200
1201+
Ongelmatilanteiden välttämiseksi ja ymmärryksen lisäämiseksi kannattaa ehdottomasti selailla Playwrightin laadukasta [dokumentaatiota](https://playwright.dev/docs/intro). Seuraavassa on listattu tärkeimmät:
1202+
- [lokaattoreista](https://playwright.dev/docs/locators) kertova osa antaa hyviä vihjeitä testattavien elementtien etsimiseen
1203+
- osa [actions](https://playwright.dev/docs/input) kertoo miten selaimen kanssa käytävää vuorovaikutusta on mahdollista simuloida testeissä
1204+
- [assertioista](https://playwright.dev/docs/test-assertions) kertova osa demonstroi mitä erilaisia testauksessa käytettäviä ekspektaatioita Playwright tarjoaa
1205+
1206+
Tarkemmat detaljit löytyvät [API](https://playwright.dev/docs/api/class-playwright)-kuvauksesta, erityisen hyödyllisiä ovat testattavan sovelluksen selainikkunaa vastaavan luokan [Page](https://playwright.dev/docs/api/class-page) kuvaus, sekä testeissä etsittyjä elementtejä vastaavan luokan [Locator](https://playwright.dev/docs/api/class-locator)-kuvaus.
1207+
12221208
Testien lopullinen versio on kokonaisuudessaan [GitHubissa](https://github.com/fullstack-hy2020/notes-e2e/tree/part5-3), branchissa <i>part5-3</i>.
12231209
12241210
</div>
@@ -1227,7 +1213,7 @@ Testien lopullinen versio on kokonaisuudessaan [GitHubissa](https://github.com/f
12271213
12281214
### Tehtävät 5.17.-5.23.
12291215
1230-
Tehdään osan lopuksi muutamia E2E-testejä blogisovellukseen. Yllä olevan materiaalin pitäisi riittää suurimman osan tehtävien tekemiseen. Playwrightin [dokumentaatiota]https://playwright.dev/docs/intro) ja [API-kuvausta](https://playwright.dev/docs/api/class-playwright) kannattaa ehdottomasti lukea, ainakin edellisessä luvussa mainitut osat.
1216+
Tehdään osan lopuksi muutamia E2E-testejä blogisovellukseen. Yllä olevan materiaalin pitäisi riittää suurimman osan tehtävien tekemiseen. Playwrightin [dokumentaatiota](https://playwright.dev/docs/intro) ja [API-kuvausta](https://playwright.dev/docs/api/class-playwright) kannattaa kuitenkin ehdottomasti lukea, ainakin edellisen luvun lopussa mainitut osat.
12311217
12321218
#### 5.17: blogilistan end to end ‑testit, step1
12331219
@@ -1265,7 +1251,7 @@ Testin <i>beforeEach</i>-alustuslohkon tulee nollata tietokannan tilanne esim. [
12651251
12661252
#### 5.18: blogilistan end to end ‑testit, step2
12671253
1268-
Tee testit kirjautumiselle, testaa sekä onnistunut että epäonnistunut kirjautuminen. Luo testejä varten käyttäjä <i>beforeEach</i>-lohkossa.
1254+
Tee testit kirjautumiselle. Testaa sekä onnistunut että epäonnistunut kirjautuminen. Luo testejä varten käyttäjä <i>beforeEach</i>-lohkossa.
12691255
12701256
Testien runko laajenee seuraavasti
12711257

src/content/images/5/play6a.png

503 KB
Loading

src/content/images/5/play6b.png

455 KB
Loading

0 commit comments

Comments
 (0)