💥
負荷ツール vegeta を使って multipart/form-data で画像を送る方法
はじめに
負荷テストツールの vegeta を使った画像を送る API のパフォーマンステストを実施したときに、
multipart/form-data で画像を送る設定に詰まったので、備忘録として記録します。
vegeta とは
あのベジータから名前を取った、 golang 製の負荷テストツールです。
やり方
概要
テキストファイルを作ることで、 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 を使って直接作成したバイナリを書き込む方法に変更しました。
参考文献
Discussion