Upgrade to Pro — share decks privately, control downloads, hide ads and more …

io/fs.FS for testability. io/fs.FS for abstract...

io/fs.FS for testability. io/fs.FS for abstraction. / Go Conference 2021 Autumn (Online)

https://gocon.jp/2021autumn/sessions/io-fs-fs-testability-abstraction/

Go 1.16から追加されたio/fsパッケージが提供しているインターフェースについて、皆さんはどのような目的で活用していますか?

私は、主に2つの目的で活用しています。1つはテスト容易性(テスタビリティ)、もう1つはファイルシステムとしての抽象化です。

本発表では、具体的な事例を元に上記の2つの目的での使い方を紹介します。
また、fs.FSインターフェースを使ったことで失敗した事例も紹介したいと思います。

本発表を通じてio/fsのインターフェースの利用イメージを持ってもらえれば嬉しいです。

Ken’ichiro Oyama

November 13, 2021
Tweet

More Decks by Ken’ichiro Oyama

Other Decks in Technology

Transcript

  1. io/fs.FS for testability . io/fs.FS for abstraction. খࢁ݈Ұ࿠ / GMO

    PEPABO inc. 2021.11.13 Go Conference 2021 Autumn (Online) 1
  2. fs package Package fs defines basic interfaces to a file

    system. A file system can be provided by the host operating system but also by other packages. https://pkg.go.dev/io/fs fsύοέʔδ͸ɺϑΝΠϧγεςϜͷجຊతͳinterfaceΛ ఆ͍ٛͯ͠·͢ɻϑΝΠϧγεςϜ͸ɺϗετOS͔Βఏ ڙ͞ΕΔ͜ͱ΋͋Ε͹ɺଞͷύοέʔδ͔Βఏڙ͞ΕΔ ͜ͱ΋͋Γ·͢ɻ 5
  3. io/fs.FS for testability io.Reader / io.Writer for testability 13 ࣮ࡍͷར༻

    ςετίʔυ ςετ࣌ʹҾ਺ͷ stdin, stdout ʹ౉͢ΠϯελϯεΛม͑Δ
  4. io/fs.FS for abstraction The proc file system is a pseudo-file

    system which is used as an interface to kernel data structures. It is commonly mounted at /proc. procϑΝΠϧγεςϜ͸ɺΧʔωϧͷσʔλߏ ଄΁ͷΠϯλʔϑΣΠεͱͯ͠࢖༻͞ΕΔٙࣅ ϑΝΠϧγεςϜͰ͢ɻ ௨ৗɺ/procʹϚ΢ϯ τ͞Ε·͢ɻ Linuxͷprocfs 18 man 5 proc ͷ DESCRIPTIONΑΓҾ༻
  5. io/fs.FS for abstraction • gh-grepͷ࣮૷͸2ͭͷύοέʔδͷ૊Έ߹Θͤ • github.com/bmatcuk/doublestar • globϥΠΫΑΓ΋͏গ͠Ϧονͳݕࡧ৚݅ͱio/fs.FS interfaceΛड͚औͬͯ৚

    ݅ʹϚονͨ͠ϑΝΠϧͷྻڍ͕Մೳ • github.com/k1LoW/ghfs • GitHubͷϦϙδτϦΛϑΝΠϧγεςϜͱͯ͠ந৅Խͯ͠ io/fs.FS interface Λఏڙ • ࣮૷࣌ɺio/fs.FS interfaceΛհ͢Δ͜ͱͰGitHub APIΛͲ͏ୟ͍ͯϑΝΠϧΛݕࡧ͢Δ͔ ͱ͍͏͜ͱΛҰ੾ߟ͑Δඞཁ͕ͳ͔ͬͨ • ؔ৺ͷ෼཭͕Ͱ͖͍ͯͨ bmatcuk/doublestar ← io/fs.FS ← k1LoW/ghfs 23
  6. • https://github.com/k1LoW/octocov • ίʔυϝτϦΫεπʔϧ…ίʔυΧόϨοδɺCode to Test Ratioɺςετ࣮ߦ࣌ؒ • ଟ਺ͷϓϩάϥϛϯάݴޠͱɺओཁͳΧόϨοδϨϙʔτϑΥʔϚοτʹରԠ •

    GitHub Actionsͷactionͱͯ͠ίʔυϝτϦΫεΛूܭɺP/RίϝϯτɺϨϙʔτ • CLIπʔϧͱͯ͠ίʔυΧόϨοδΛूܭɻදࣔ • ΧόϨοδόοδੜ੒ octocov 25 25 io/fs.FS for abstraction
  7. io/fs.FS for abstraction • octocov͸༷ʑͳछྨͷσʔλετΞʹରԠ͍ͯ͠Δ • શͯͷσʔλετΞͷػೳΛಉ͡Α͏ʹ࣮૷͍ͨ͠ • ڞ௨ͷio/fs.FS interfaceΛ࣋ͨͤΔ͜ͱͰશͯϑΝΠϧγεςϜͷΑ͏ʹ૸ࠪͰ͖Δ

    • ϩʔΧϧϑΝΠϧγεςϜ … github.com/k1LoW/osf s • GitHubϦϙδτϦ… github.com/k1LoW/ghf s • S3 … github.com/jszwec/s3f s • GCS … github.com/mauri870/gcsf s • BigQuery … octocov಺෦Ͱಠࣗʹ࣮૷ ίʔυϝτϦΫεσʔλͷऔಘ(2/2) 27
  8. io/fs.FS for abstraction • octocovͰఆ͍ٛͯ͠Δσʔληοτͷ ςʔϒϧʹରͯ͠ΫΤϦΛൃߦ • SELECTͨ݁͠ՌΛ fstest.MapFS ʹ٧

    ΊࠐΜͰฦ͢ • ͜Ε͚ͩͰ io/fs.FS interfaceΛຬͨͤΔ BigQueryͷσʔληοτͷ io/fs.FS interface 28
  9. io/fs.FS for abstraction Linuxʢͱ͍͏͔OSʣͷϑΝΠϧγεςϜͱio/fsύοέʔδͷࢥ૝͸͍ۙ? 29 • ڞ௨ͨ͠ΠϯλʔϑΣʔεΛఏڙ͢ΔͨΊͷ΋ͷͩͬͨΓɺϑΝΠϧγεςϜͱ͍͏ σʔλߏ଄ʹந৅Խͯ͠ͳΜͰ΋ϑΝΠϧγεςϜͱͯ͠ѻ͏ͱ͍͏໘Ͱ΋ɺ͍ۙ΋ ͷΛײ͡Δ •

    OSͷ։ൃऀͱͯ͠༗໊ͳ͋ͷํ͕͍Βͬ͠ΌͨΓ͢Δ͔Β͔ͳ…ʁ • ݸਓతʹ͸ʮඪ४ύοέʔδͰఏڙ͢Δ΋ͷͳͷ͔ͳʁʯͱࢥ͍͕ͬͯͨ࢖ͬͯΈ ͨΒศརͩͬͨ • LinuxϑΝΠϧγεςϜͰ࣮ݱ͍ͯ͠Δ͞·͟·ͳϞϊ͕ࢀߟʹͳΔͷ͸͔֬
  10. Package fs defines “basic” interfaces to a file system. •

    ͱ͸͍͑ɺجຊతͳinterface͚͕ͩఏڙ͞Ε͍ͯΔͱ͍͏͜ͱ͸ ๨Εͯ͸͍͚ͳ͍ • v1.17࣌఺Ͱ͸Read OnlyͳinterfaceͷΈ͕ఏڙ͞Ε͍ͯΔ • WritableͳϑΝΠϧγεςϜ interface͕ඞཁͳ৔߹͸αʔυ ύʔςΟύοέʔδͱͯ͠ https://github.com/spf13/afero ͕ ༗໊ • ྫ͑͹ʮγϯϘϦοΫϦϯΫʯͱ͍͏Α͏ͳ֓೦͸ͳ͍ • ಛघͳܗͰ೚ҙͷσΟϨΫτϦΛtarͳͲʹΞʔΧΠϒΛ͢Δ ࣾ಺πʔϧΛ࡞੒ͨ͠ࡍʹɺԿ΋ߟ͑ͣ io/fs.FS interface Λ ࠾༻ͯ͠όάΛൃੜͤͯ͞͠·ͬͨ 30 io/fs.FS for abstraction