💥

負荷ツール vegeta を使って multipart/form-data で画像を送る方法

2023/07/05に公開

はじめに

負荷テストツールの vegeta を使った画像を送る API のパフォーマンステストを実施したときに、
multipart/form-data で画像を送る設定に詰まったので、備忘録として記録します。

vegeta とは

あのベジータから名前を取った、 golang 製の負荷テストツールです。
https://github.com/tsenart/vegeta

やり方

概要

テキストファイルを作ることで、 vegeta で POST API をテストする際の、パラメータを設定することが出来ます。

body.txt を作成する

画像のバイナリデータをテキストファイルに入れる際に、 Go で以下のようなコードを書いて、 body.txt を作成します。

main.go
package main

import (
   "bytes"
   "fmt"
   "io"
   "io/ioutil"
   "mime/multipart"
   "os"
)

func main() {
   // 送信するバイナリデータ
   imageFile, err := os.Open("./img/hoge.jpeg")
   if err != nil {
      fmt.Println("ファイルを開く際にエラーが発生しました:", err)
      return
   }
   defer imageFile.Close()

   // マルチパート形式のリクエストボディを作成
   var requestBody bytes.Buffer
   multipartWriter := multipart.NewWriter(&requestBody)

   // 1つ目のパート (画像ファイル)
   imagePart, err := multipartWriter.CreateFormFile("file", "hoge.jpeg")
   if err != nil {
      fmt.Println("ファイルパートを作成する際にエラーが発生しました:", err)
      return
   }
   _, err = io.Copy(imagePart, imageFile)
   if err != nil {
      fmt.Println("ファイルのコピー中にエラーが発生しました:", err)
      return
   }

   // 2つ目のパート (テキストデータ)
   err = multipartWriter.WriteField("key1", "value1")
   if err != nil {
      fmt.Println("フィールドを書き込む際にエラーが発生しました:", err)
      return
   }

   // 3つ目のパート (テキストデータ)
   err = multipartWriter.WriteField("key2", "value2")
   if err != nil {
      fmt.Println("フィールドを書き込む際にエラーが発生しました:", err)
      return
   }

   // マルチパートの終端を書き込む
   err = multipartWriter.Close()
   if err != nil {
      fmt.Println("マルチパートの終端を書き込む際にエラーが発生しました:", err)
      return
   }

   // リクエストボディをテキストファイルに保存
   err = ioutil.WriteFile("body.txt", requestBody.Bytes(), 0644)
   if err != nil {
      fmt.Println("リクエストボディを保存する際にエラーが発生しました:", err)
      return
   }

   fmt.Println("リクエストボディがテキストファイルに保存されました。")
}

完成したファイル

body.txt
--HogeHogeBoundary
Content-Disposition: form-data; name="file"; filename="hoge.jpeg"
Content-Type: image/jpeg

{画像のバイナリ}
--HogeHogeBoundary
Content-Disposition: form-data; name="key1"

value1
--HogeHogeBoundary
Content-Disposition: form-data; name="key2"

value2
--HogeHogeBoundary--

targets.txt を作成する

targets.txt 以下のように作成します。

targets.txt
POST https://hogehoge.jp/upload-image
Content-Type: multipart/form-data; boundary=HogeHogeBoundary
@body.txt

コマンド実行

shell
vegeta attack -targets=targets.txt -rate 5 -duration 60s

これで、画像アップロードの API がテスト出来ます!

おわりに

最初バイナリをシェルで作成して、それをコピペするということをやっていましたが、
上手く行きませんでした。
なので、Go を使って直接作成したバイナリを書き込む方法に変更しました。

参考文献

https://qiita.com/nrnrk/items/4e0dab2c8573e3fe7576

Discussion