0
0

More than 1 year has passed since last update.

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

Posted at

はじめに

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

vegeta とは

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

やり方

概要

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

body.txt を作成する

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

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

コマンド実行

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

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

おわりに

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

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0