アプリケーションに多くのユーザーが同時にアクセスすることで、障害が発生する危険性がある。そうした需要に対応する準備が整っていることを確認することは重要だ。本稿では、負荷テストのベストプラクティスにPythonを利用できる箇所と、アプリケーションを適切に準備する方法を解説する。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
アプリケーション開発チームは負荷テストを実施することで、少なくとも所定の負荷値まではアプリケーションが想定通りに機能することを保証できる。だが、負荷テストを重視しない開発チームがあまりにも多い。
開発者がスポットチェックを行ったり、パフォーマンスを高めるコーディング手法を採用したりすることは可能だ。だが、予期しないユーザー負荷が原因でサーバがロックすると、企業もユーザーも不意を突かれることが多い。負荷が高過ぎてアプリケーションが機能しなくなるのは恥ずべきことだ。
そこで、本稿では、負荷テストのベストプラクティスにPythonを利用できる箇所と、実際の状況に合わせてアプリケーションを適切に準備する方法について説明する。
負荷テストは一種のパフォーマンステストで、アプリケーションにどの程度まで負荷をかければ、パフォーマンスや機能に悪影響が出るかを検証する。
あるソフトウェア開発企業が、登録したユーザーが自身の処方箋と投薬状況を毎日追跡できるWebサイトを新しく立ち上げる準備を整えたとする。このアプリケーションは、指定された時間に薬を服用するよう毎日登録ユーザーにメッセージを送信し、その情報を登録ユーザーの医療記録と医療提供者に中継する。
負荷テストでは、テスト担当者がサーバに負荷をかけ、1000〜100万人のユーザーが同時に登録、ログイン、医療データの入力を行う状況をシミュレーションする。サーバリソースの消費量が1%程度であれば、アプリケーションは想定通りに機能し、適切なパフォーマンスを発揮するはずだ。次に、テスト担当者はサーバリソースの50%を消費するまで、あるいはサーバが停止するかアプリケーションがロックするまでユーザー数を増やしていく。テスト担当者が負荷をテストする際は、負荷をかけた時間やデータ取得速度も計測し追跡する。負荷をかけるユーザー数を変えながら、アプリケーションとサーバのパフォーマンスをドキュメントに記録する。
効果的な負荷テストは、システムの次のような問題点を特定できる。
ポジティブなカスタマーエクスペリエンスを提供する有用なアプリケーションを提供するためには、キャパシティーに応じてアプリケーションがどのようなパフォーマンスを発揮するかを理解することが不可欠だ。負荷テストは、システムのキャパシティーとパフォーマンスをテストして改善する方法を提供する。また、アプリケーションがクラッシュしたり、機能を停止したりすることがないよう、キャパシティーを別のサーバに負荷分散しなければならないポイントも負荷テストによって確立される。
Pythonを使えば、負荷テスト用の機能を組み込むことができる。Pythonは、最も人気が高く、効率の良い負荷テストツールの一つを支えるプログラミング言語だ。
開発チームは、負荷テストツールを使うことで、システムやアプリケーションに対するさまざまな負荷を測定、分析できる。
ツールでは、さまざまな重要項目を測定、分析する機能が提供される。測定、分析される重要項目の例には、ピーク時の負荷をサポートする際のスループットレート、システムリソースの使用レベル、ハードウェアのパフォーマンス、ロードバランサー機能とパフォーマンス、同時実行のパフォーマンス、負荷レベルに応じて生じるアプリケーションの問題点の可視化、アプリケーションの設計上の欠陥などがある。
効果の高い負荷テストは、システムの遅延、非効率なページ読み込み、クラッシュを、他の形式の手動テストや自動テストよりも正確に特定する。
負荷テストを使えば、フェイルオーバーのポイントを判断できる。フェイルオーバーポイントとは、アプリケーションがクラッシュしたり機能を停止したりしないように、ロードバランサーを立ち上げるか、過剰なユーザー負荷を他のサーバにオフロードするポイントを指す。
オープンソースの「Locust」と「Apache JMeter」は最も広く使用されている負荷テストツールだが、他にも多くの選択肢がある。
負荷テストの担当者や開発者は、Locustを使ってアプリケーションにかかるユーザー負荷のシミュレーションができる。Locustでは、負荷テストとテスト後の結果のダッシュボードへの表示にPythonコードを使用する。
Locustを負荷テストツールとして使用すると、次のようなメリットを得られる。
ここからは、Locust負荷テストを作成する手順の簡単な例を紹介する。
import time from locust import HttpUser, task, between class AuthenticateUser(HttpUser): timer = between(1, 10) @task def authenticate_task(self): self.client.get("/login") self.client.get("/register") def on_start(self): self.client.post("/register",json={"username":"testuser", "email":test@test.com", "password":"password"})
広く使われているオープンソースのツールApache JMeterも負荷テスト専用に設計されている。ただし、こちらはPythonではなくJavaをベースとする。このオープンソースのデスクトップアプリケーションはJavaを使って完全にカスタマイズ可能で、さまざまな種類の負荷をテストできる。Apache JMeterは、アプリケーションのパフォーマンステストをサポートし、Webサービス、LDAP(Lightweight Directory Access Protocol)、データベース、シェルスクリプトのテストをサポートする。また、テストスクリプトの作成を容易かつ迅速にするための記録と再生の機能も備え、強力なサポートが得られる開発者コミュニティーもある。
負荷テストは少なくとも最初は複雑に感じる。負荷テストを効果的に行うには、幾つかのベストプラクティスに従う必要がある。ベストプラクティスに従えば、テストの品質とメンテナンスの容易さ、結果の正確性が確保される。一連のベストプラクティスに従うことで、品質の高い負荷テストと結果の正確性が保証される。
負荷テストには次のようなベストプラクティスがある。
Pythonを使用するか、他の手法を利用するかにかかわらず、負荷テストによってアプリケーションの応答性が改善され、フェイルオーバーや負荷分散の計画が生み出される。Pythonは負荷テストに直接使用する場合もツール内で使用する場合も強力な言語になる。
アプリケーションが成功を収め、ポジティブなカスタマーエクスペリエンスを生み出せるかは、そのアプリケーションにかかる負荷をどれだけうまく処理できるかにかかっている。
Copyright © ITmedia, Inc. All Rights Reserved.