WebExtensionsとテスト

C51ed1e43b09bfbbb09eead09f803aea?s=47 Shin'ya Ueoka
October 30, 2018

 WebExtensionsとテスト

Tokyo WebExtensions Meetup #3の発表資料です
https://mozilla.doorkeeper.jp/events/81371

C51ed1e43b09bfbbb09eead09f803aea?s=128

Shin'ya Ueoka

October 30, 2018
Tweet

Transcript

  1. WebExtensionsとテスト WebExtensions Meetup #3, 2018-10-30 @ueokande

  2. Shin'ya Ueoka @ueokande WebExtensions歴1年ちょい Vim Vixen つくってます 2

  3. Vim Vixen

  4. Vim Vixen Vimでブラウザを操作できるWebExtensions Vimperator (XUL) が使えなくなったのが開発のきっかけ +1,000 starts、+10,000ユーザー 4

  5. 目次 WebExtensionsのテスト自動化 Vim Vixenの取り組み これからのVim Vixenのテスト まとめ 5

  6. Vim Vixenの開発環境 本体コード5,000行 + テストコード3,000行くらい BabelでES7をトランスパイル webpackでsingle js化 CircleCIで継続的にlint +

    テスト 6
  7. なんでテストを書くんだっけ? テストの自動化による効率化 コード品質の向上 テスタビリティが高いとメンテナンス性もよい リグレッションの早期発見 7

  8. ユニットテスト E2E テスト ユニットテスト (単一の) クラス・メソッドが対象 依存メソッドはモック化したり 一番高速なテスト手法で、 テストケースも追加しやすい 8

  9. E2E テスト ユニットテスト E2Eテスト ユーザーの操作に最も近いテスト 一般的に高コストで遅い 気をつけないと不安定なテスト になることもしばしば 9

  10. E2E テスト ユニットテスト (理想の)テストピラミッド ユニットテストの方が 費用対効果が高い ユニットテストの比率を 大きくなるよう配分 するのが理想 10

  11. Vim Vixenのユニットテスト 11

  12. Vim Vixenのユニットテスト WebExtensionsはフロントエンドの技術と親和性が高い JavaScriptのユニットテストのよくある構成で実行 テストフレームワークにMocha テストランナーに Karma を使ってFirefoxを起動 12

  13. ビジネスロジックのテスト ピュアなビジネスロジックはWebExtensions APIや DOM操作がない 通常のJavaScriptとしてテストできる ビジネスロジックを切り出すために設計する DDD、Clean Architecture ... 13

  14. DOMアクセスのテスト content scriptではDOMアクセスが多い karma-html2js-preprocessor: Karma上でHTMLをロード HTMLファイルをJavaScriptの文字列として格納 window.__html__ オブジェクトでアクセス document.body.innerHTML =

    __html__['testcase1.html']; 14
  15. 利用例 15 describe('#myInjectElements', () => { beforeEach(() => { //

    render HTML from a static file document.body.innerHTML = __html__['testcase1.html']; }); it('injects three elements', () => { myInjectElements(window); let es = window.document.querySelector(".injected") expect(es).to.have.lengthOf(3); }); });
  16. browserオブジェクトのモック webextensions-api-fake: browserオブジェクトをモック Karma上でbrowserオブジェクトが使える const browserFake = require('webextensions-api-fake'); const browser

    = browserFake(); 16
  17. 利用例 17 const browserFake = require('webextensions-api-fake'); describe("#myLastCreatedTab", () => {

    beforeEach(() => { // set fake browser to global variable global.browser = browserFake(); }); it('should get last created tab', async() => { const created = await browser.tabs.create({}); const tab = await myLastCreatedTab(); expect(tab.id).to.equal(created.id); }); });
  18. E2Eテスト 18

  19. Vim Vixenのリリースフロー 受け入れ条件を元に100個以上の試験項目 リグレッションが怖いのでリリース毎に全て試験 Pull Requestの本文にチェックリスト化して手動テスト 19

  20. None
  21. E2Eテストの自動化 リリース毎に試験項目は増え続ける 毎リリース100以上の試験をするのは辛い E2Eテストも自動化だ! 21

  22. 自動化の方針 ビルド済みのVim Vixenを試験 Vim Vixen本体にテストコードを加えない ユーザーの操作に近い方法で入力と結果を観測 22

  23. Vim VixenのE2E試験の仕組み テスト用の「ambassador」アドオンを作成 テストコードからメッセージ経由でキー入力や結果を観測 23

  24. ambassadorアドオン (1/2) テストコードからタブ情報や別タブにキーイベントを送信 24 Background Script browser.runtime.sendMessage() browser.tabs.sendMessage() tab1 Content

    Script Page Script tab2 Content Script Page Script window.postMessage() press(tab2, 'j') window.body .dispatchEvent(e)
  25. ambassadorアドオン (2/2) 別タブの結果の観測もメッセージ経由 25 Background Script browser.runtime.sendMessage() browser.tabs.sendMessage() tab1 Content

    Script Page Script tab2 Content Script Page Script window.postMessage() getScroll(tab2) document .documentElement .scrollTop {x:10, y:20} {x:10, y:20} {x:10, y:20}
  26. ambassadorアドオンの実行 web-extで実行 複数アドオンをロードできるようweb-extを改造 Karmaでweb-ext用テストランナーを自作 Karma vim-vixen/manifest.json ambassador/manifest.json Vim Vixen Ambassador

    web-ext 26
  27. E2Eテストのテストケース例 ambassadorアドオンとの通信は適当にラップ ES7 async/awaitでユーザーの操作を手続き的に記述 27 it('deletes tab by d', async

    () => { let tab = await tabs.create(targetWindow.id, CLIENT_URL); let before = await windows.get(targetWindow.id); await keys.press(tab.id, 'd'); let actual = await windows.get(targetWindow.id); expect(actual.tabs).to.have.lengthOf(before.tabs.length - 1); });
  28. CircleCI git push毎にテストを流す lint ユニットテスト E2Eテスト パスしたPull Requestをマージ 28

  29. デモ 29

  30. これからのVim Vixenのテスト 30

  31. ambassadorアドオンの限界 45/163ケースしか自動化できてない 他アドオンのアクセスできない領域 option_ui, storage, browserAction, ... 表示(スタイル)のリグレッション検出 31

  32. Vim Vixenのこれから ユニットテストを充実させてE2Eテストを軽減 本体コードもテストしやすいような構造に CI/CDに力を入れたい git tagを打ったら新しいバーションをリリースとか 32

  33. まとめ Vim Vixenで取り組んでるテストについて紹介 メンテナンスで怖くないようテストを書く WebExtensionsはフロントエンドの技術と親和性が高い Vim Vixenは品質を維持しつつ機能追加も頑張るぞい 33