Slide 1

Slide 1 text

Jest 松永遼太

Slide 2

Slide 2 text

話すこと Jest について 話なさないこと youtubeチャンネル

Slide 3

Slide 3 text

Jest とは

Slide 4

Slide 4 text

JavaScript のテスティングフレームワーク TypeScript, Node, React, Angular, Vue, Babel などに対応 テストがシンプルにできる

Slide 5

Slide 5 text

インストールする際は

Slide 6

Slide 6 text

https://jestjs.io/docs/ja/getting-started

Slide 7

Slide 7 text

"name": ”reverseInt_test", "version": "1.0.0", "main": "app.js", "scripts": { "test": "jest" }, "author": "", "license": "ISC", "devDependencies": { "jest": "^24.9.0" }, "dependencies": {}, "description": "" Package.json

Slide 8

Slide 8 text

npm run test / yarn testでテストを実⾏できる

Slide 9

Slide 9 text

PASS ./reverseInt.test.js ✓ reverseIntのユニットテスト (6ms) Test Suites: 1 passed, 1 total Tests: 1 passed, 1 total Snapshots: 0 total Time: 1.816s, estimated 2s Ran all test suites. FAIL ./reverseInt.test.js ✕ reverseIntのユニットテスト (3ms) どこのテストが失敗したか教えてくれ る時もある

Slide 10

Slide 10 text

Matchers

Slide 11

Slide 11 text

Jest では、matcher を使⽤して、様々な⽅法で値のテストをする ことができます。 この時に使われる関数は test expect toBeなど

Slide 12

Slide 12 text

var reverseInt = function(x) { if (x === 0) return 0; const sign = (x > 0) ? 1 : -1; if (x < 0){ x = x * -1; } let reversedInt = 0; while(x > 0){ reversedInt = (reversedInt * 10) + (x % 10); x = Math.floor(x/10); } return reversedInt * sign; }; こういう関数があったとします

Slide 13

Slide 13 text

test('reverseIntのユニットテスト', () => { expect(reverseInt(0)).toBe(0); expect(reverseInt(3)).toBe(3); expect(reverseInt(51)).toBe(15); expect(reverseInt(300)).toBe(3); expect(reverseInt(123456789)).toBe(987654321); expect(reverseInt(-311)).toBe(-113); //他にも expect(reverseInt(null)).toBeNull(); expect(reverseInt(true)).toBeTruthy(); expect(reverseInt(5)).toBeDefined(); expect(reverseInt(false)).toBeFalsy(); }); Jestでmatcherを使ったテストはこんな感じ

Slide 14

Slide 14 text

expect は “expectation” オブジェクトを返します。 toBeはObject.isを使って値を⽐べている expect(2 + 2).toBe(4)

Slide 15

Slide 15 text

じゃーオブジェクト同⼠を⽐べるには? const user = {name: “Ryota”,}; user[‘age'] = 20; expect(user).toEqual({name: Ryota, age: 20});

Slide 16

Slide 16 text

⾮同期

Slide 17

Slide 17 text

⾮同期動のコードがある場合は Jestはテスト対象のコードがいつ 完了したかを別のテストに進む前に知る必要があります。 そのためにdone( )などの関数があります。 *Done を使うのはcallback を使って⾮同期をしている場合 https://jestjs.io/docs/ja/asynchronous

Slide 18

Slide 18 text

Async/ await を使おう

Slide 19

Slide 19 text

⾮同期のコードをテストする場合はjavascript でも使う async/await を使ったほうがシンプル test(‘the data is peanut butter’, async () => { const data = await fetchData(); expect(data).toBe('peanut butter’); });

Slide 20

Slide 20 text

テストの構成

Slide 21

Slide 21 text

テストを実⾏する前にいくつかのセットアップ作業をしたり、テ ストが終了した後にいくつかの仕上げ作業をしたい場合がありま す

Slide 22

Slide 22 text

例えば、テストの前にデータベースを初期化し、テスト後はデータベースのデータを削除 しい

Slide 23

Slide 23 text

beforeEach(() => { initializeDatabase(); }); afterEach(() => { clearDatabase(); }); });

Slide 24

Slide 24 text

スコープ

Slide 25

Slide 25 text

describe('matching cities to foods', () => { beforeEach(() => { return initializeFoodDatabase(); }); test('Vienna <3 sausage', () => { expect(isValidCityFoodPair('Vienna', 'Wiener Schnitzel')).toBe(true); }); test('San Juan <3 plantains', () => { expect(isValidCityFoodPair(‘San Juan’, 'Mofongo')).toBe(true); }); });

Slide 26

Slide 26 text

describe ブロックの中にあるときは、 before などが ある場合 、 describe はdescribe ブロックの中のテストにだけに適⽤されます

Slide 27

Slide 27 text

モック関数

Slide 28

Slide 28 text

モック関数を使えば、複雑なコードも分解してテストできる

Slide 29

Slide 29 text

複雑な関数を分解してテスト const mockCallback = jest.fn(x => 42 + x); forEach([0, 1], mockCallback); expect(mockCallback.mock.calls.length).toBe(2); expect(mockCallback.mock.calls[0][0]).toBe(0); expect(mockCallback.mock.calls[1][0]).toBe(1); expect(mockCallback.mock.results[0].value).toBe(42);

Slide 30

Slide 30 text

コードにテスト⽤の値を⼊れるのにも利⽤できます const myMock = jest.fn(); myMock.mockReturnValueOnce(10).mockReturnValueOnce('x').mockReturnValue(true); console.log(myMock(), myMock(), myMock(), myMock()); // 10, 'x', true, true

Slide 31

Slide 31 text

Jest 応⽤編 Coming up next ……

Slide 32

Slide 32 text

https://jestjs.io/ja/