$30 off During Our Annual Pro Sale. View Details »

Goで multipart/form-dataのUnit Testingを書く方法

VIVEN, Inc.
August 03, 2022
280

Goで multipart/form-dataのUnit Testingを書く方法

会社HP🦉 https://www.viven.inc/

PDFファイル 📁は以下のリンクからでも、Downloadできます。
https://viven-inc-tech-presentations.s3.ap-northeast-1.amazonaws.com/2022_0803_Go_MultiPartFormData_UnitTesting.pdf

VIVEN, Inc.

August 03, 2022
Tweet

Transcript

  1. 吉⽥ 慎太郎 Let’s Go Talk #2 2022年8⽉3⽇ 更新 Goで multipart/form-dataの

    Unit Testingを書く⽅法
  2. ⽬次 1 2 3 4 5 ⾃⼰紹介 なぜ、Unit Testingを書くべきか multipart/form-dataとは

    multipart/form-dataのUnit Testingを書く まとめ・参考資料
  3. ⾃⼰紹介 吉⽥ 慎太郎 (株式会社微分) バックエンドエンジニア (Go 2年, Python, PHP) Go

    / TypeScript / AWS と広くやっています。 cinchan2020 cin-chan
  4. Unit Testingをなぜ書くべきか ⼀⾔で⾔えば、 持続的にサービス / プロダクトを成⻑させるため 具体的には 1. 変更が正しく加えられたかを判断 2.

    バグを早急に特定 3. コードの質を計測 画像参照元(Unit Testing Principles, Practices, and Patterns)
  5. multipart/form-dataとは MIME Typeの1つ。 JavaScriptのFormDataクラスを⽤いて、 複数のデータタイプを⼀度に扱う際に必要。 (例) SpeakerDeckにおけるUpload画⾯ application/jsonとapplication/pdfという 2種類のデータタイプを扱う 画像参照元(Upload

    a new Deck in SpeakerDeck)
  6. multipart/form-dataのUnit Testingを書く(1) url := ”/decks” req := httptest.NewRequest(http.MethodPost, url, bytes.NewReader(body.Bytes()))

    req.Header.Set(“Content-Type”, mwriter.FormDataContentType()) Request周りのポイント2つ 1. MIME Typeのhttptest.NewRequestの第三引数にbodyとしてbyte列を挿⼊ 2. requestのHeaderにmime/multipartのFormDataContentTypeという関数で Content-Typeを設定
  7. multipart/form-dataのUnit Testingを書く(2) body := new(bytes.Buffer) mwriter = multipart.NewWriter(body) mwriter.close() writer1,

    err := mwriter.CreateFormFile(“pdf”, “./tmp.pdf”) writer1.close() _, err := writer1.write([]byte(”pdf sample body”)) writer2, err := mwriter.CreateFormField(“title”) writer2.close() _, err := writer2.write([]byte(“sample title”)) requestのbodyについて 1. Request Bodyのbyte配列をmultipart.Writerがio.Writerを作成し、 そのio.Writerが書き込みを⾏う 2. 画像やPDFといったファイル形式のMIME Typeに対してはCreateFormFileを使⽤ その他のMIME Typeに関しては CreateFormFieldを使⽤
  8. まとめ Unit Testingは⾯倒だが、将来の開発メンバーのために書きましょう multipart/form-dataのUnit Testingの際には、 1. Content-Typeには、multipartのFormDataContentType関数を使う 2. multipart.WriterのCreateFormFile, CreateFormFieldの

    2つの関数で作成するio.Writerを使い分け、requestのBodyを作成する
  9. 参考資料 1. Testing in Go (Oreilly Learning) 2. Intro to

    Unit Testing in Go (YouTube) 3. Unit Testing Principles, Practices, and Patterns 4. MIME Types 5. bytes.Buffer (STL) 6. RFC 2046