Slide 1

Slide 1 text

© 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. Better Testing With Vue application

Slide 2

Slide 2 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 2

Slide 3

Slide 3 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 3 console.log(me)

Slide 4

Slide 4 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 4 Better Testing

Slide 5

Slide 5 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 5

Slide 6

Slide 6 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 6 Write better code ! Refactor with confidence ! Deploy on Friday !

Slide 7

Slide 7 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 7

Slide 8

Slide 8 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 8 How to test ?

Slide 9

Slide 9 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 9

Slide 10

Slide 10 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 10 We Love Bugs

Slide 11

Slide 11 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 11 Cost of Bugs

Slide 12

Slide 12 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 12

Slide 13

Slide 13 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 13 Testing Effort ?

Slide 14

Slide 14 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 14 Ice-Cream Cone https://alisterscott.github.io/TestingPyramids.html

Slide 15

Slide 15 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 15 Testing Pyramid https://alisterscott.github.io/TestingPyramids.html

Slide 16

Slide 16 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 16 Testing Pyramid https://alisterscott.github.io/TestingPyramids.html

Slide 17

Slide 17 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 17 Cupcake https://www.thoughtworks.com/insights/blog/introducing-software-testing-cupcake-anti-pattern

Slide 18

Slide 18 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 18 Testing Trophy https://www.testingjavascript.com/

Slide 19

Slide 19 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 19 Testing Rocket https://kentcdodds.com/blog/write-tests https://madewithvuejs.com/blog/how-to-learn-vue-js-testing-the-ultimate-guide

Slide 20

Slide 20 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 20 Fast feedback

Slide 21

Slide 21 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 21 Good Tests ?

Slide 22

Slide 22 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 22 Fast Isolated Repeatable Self-validate Understand

Slide 23

Slide 23 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 23 Test-First vs Test-Last Vs Test-Later

Slide 24

Slide 24 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 24 JavaScript Testing With Vue and Nuxt app https://vuejs.org/guide/scaling-up/testing

Slide 25

Slide 25 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 25 Testable project structure ? Start with

Slide 26

Slide 26 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 26 Project structure Split by Feature or Domain Nuxt app User domain Product domain Catalog domain extends pages components config

Slide 27

Slide 27 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 27 Project structure Split by Feature or Domain Nuxt app export default defineNuxtConfig({ devtools: { enabled: true }, modules: ['@nuxtjs/tailwindcss'], extends: ['./domains/users', './domains/products'], })

Slide 28

Slide 28 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 28 Shared state Nuxt app User domain Product domain Catalog domain extends Shared State use

Slide 29

Slide 29 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 29 https://github.com/goldbergyoni/javascript-testing-best-practices

Slide 30

Slide 30 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 30 Frontend Backend Full stack JavaScript Developer !!

Slide 31

Slide 31 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 31 How to Test ?

Slide 32

Slide 32 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 32 Frontend Backend HTTPs REST gRPC tRPC … DB External System End-to-End testing

Slide 33

Slide 33 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 33 How to test ? 1. Setup external system 2. Setup database 3. Deploy Backend 4. Deploy Frontend 5. Testing Process

Slide 34

Slide 34 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 34 End-to-End Testing Vue External System CRUD Component A Component B

Slide 35

Slide 35 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 35 Flaky Test !!

Slide 36

Slide 36 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 36 Need more stable ???

Slide 37

Slide 37 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 37 Need more speed and feedback ???

Slide 38

Slide 38 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 38 Isolated Testing Vue External System CRUD Component A Component B Mock

Slide 39

Slide 39 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 39 Component Testing Vue External System CRUD Component A Component B Mock https://vuejs.org/guide/scaling-up/testing#component-testing

Slide 40

Slide 40 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 40 More speed and feedback But Lower confidence

Slide 41

Slide 41 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 41 Need to balance

Slide 42

Slide 42 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 42 Demo time Testing for Vue app

Slide 43

Slide 43 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 43 Vue app End-to-End Testing Mock Mock Service Worker HTTP

Slide 44

Slide 44 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 44 Start with write test

Slide 45

Slide 45 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 45 Write test with Playwright import { test, expect } from '@playwright/test'; test('add item to list', async ({ page }) => { await page.goto('http://localhost:5173'); await page.fill('#title', '2x4 DIPA Melvin'); await page.click('#add-button'); const item = page.locator('.item:nth-child(1)'); await expect(item).toBeVisible(); }); Passed

Slide 46

Slide 46 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 46 Bad test !! import { test, expect } from '@playwright/test'; test('add item to list', async ({ page }) => { await page.goto('http://localhost:5173'); await page.fill('#title', '2x4 DIPA Melvin'); await page.click('#add-button'); const item = page.locator('.item:nth-child(1)'); await expect(item).toBeVisible(); }); Coupling from test framework and User interface

Slide 47

Slide 47 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 47 Decoupling from test framework

Slide 48

Slide 48 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 48 Vue app Coupling from test framework

Slide 49

Slide 49 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 49 Vue app Decoupling from test framework Custom Driver Testing framework library

Slide 50

Slide 50 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 50 Better test import { test } from '../../drivers/virtual/driver'; test("add item to list", async ({ driver }) => { await driver.goTo("/"); await driver.findByTestId("title").type("2x4 DIPA Melvin"); await driver.findByTestId("add-button").click(); await driver .findByText("2x4 DIPA Melvin", { withinTestId: "active items" }) .shouldBeVisible(); }); Decoupling from test framework and User interface

Slide 51

Slide 51 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 51 3 levels of UI test automation https://gojko.net/2010/04/13/how-to-implement-ui-testing-without-shooting-yourself-in-the-foot-2/

Slide 52

Slide 52 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 52 Test case as specification Human understanding

Slide 53

Slide 53 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 53 Better Better test test("add item to list", async ({ driver }) => { const shoppingList = createShoppingList({ driver }); await shoppingList.open(); const newBeer = "2x4 DIPA Melvin”; await shoppingList.expectItemNotOnList(newBeer); await shoppingList.addItem(newBeer); await shoppingList.expectItemOnList(newBeer); }); Test case as specification Human readable

Slide 54

Slide 54 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 54 Domain Specific Language (DSL) const createShoppingList = ({ driver }: { driver: Driver }) => ({ open: async () => { await driver.goTo('/'); }, addItem: async (title: string) => { await driver.findByTestId("title").type(title); await driver.findByTestId("add-button").click(); }, expectItemOnList: async (item: string) => { await driver .findByText(item, { withinTestId: "active items" }) .shouldBeVisible(); }, expectItemNotOnList: async (item: string) => { await driver.queryByText(item).shouldNotExist(); }, });

Slide 55

Slide 55 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 55 Component Testing Vue External System CRUD Component A Component B Mock https://vuejs.org/guide/scaling-up/testing#component-testing

Slide 56

Slide 56 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 56 Vue app Component Testing Mock Mock Service Worker Testing framework library https://testing-library.com/docs/vue-testing-library/intro Vue Test Utils https://github.com/vuejs/test-utils

Slide 57

Slide 57 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 57 ShoppingList component import { expect, test, render, screen, fireEvent } from '../__test__/utils'; import ShoppingList from './ShoppingList.vue'; test(`Should emit an "remove" event when we click an item`, async () => { let { emitted } = render(ShoppingList, { props: { items: [ { id: '1', title: `2x4 DIPA Melvin 9.9%`, state: `active` }, { id: '2', title: `Muay Thai Kob Khun 6.2%`, state: `active` }, ], }, }); const removeItem = screen.getByRole(`button`, { name: `2x4 DIPA Melvin 9.9%`, }); await fireEvent.click(removeItem); const removeEvents = emitted().remove as unknown[][]; expect(removeEvents[0][0]).toBe('1'); // id of removed item });

Slide 58

Slide 58 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 58 Need more testing ?

Slide 59

Slide 59 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 59

Slide 60

Slide 60 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 60 Snapshot testing Visual testing Contract testing Property- based testing Unit testing … more…

Slide 61

Slide 61 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 61 Continuous Testing === More Confidence

Slide 62

Slide 62 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 62 Back to Basic Why to test What to test When/How to test

Slide 63

Slide 63 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 63 Learn from your mistake

Slide 64

Slide 64 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 64 Bug-Driven Development

Slide 65

Slide 65 text

Better Testing © 2017 - 2024 Siam Chamnankit Company Limited. All rights reserved. 65