(1) まずコントローラー層でRunTestPlanRequestを通じてリクエストパラメータを受け取ります。
@PostMapping("/run")
public String run(@RequestBody RunTestPlanRequest request)
(2) PerformanceTestService での実行で特定の論理処理を実行し、
まず、リクエスト内のIDを元にライブラリに格納されているテストケース情報を取得(空判定、実行状態判定)
final LoadTestWithBLOBs loadTest = loadTestMapper.selectByPrimaryKey(request.getId());
if (request.getUserId() != null) {
loadTest.setUserId(request.getUserId());
}
if (loadTest == null) {
MSException.throwException(Translator.get("run_load_test_not_found") + request.getId());
}
- 次に、見つかったユースケース情報のリソースプール ID に基づいて、その ID のリソースプールが存在し、ステータスが有効であるかどうかを判断します。
String testResourcePoolId = loadTest.getTestResourcePoolId();
TestResourcePool testResourcePool = testResourcePoolMapper.selectByPrimaryKey(testResourcePoolId);
if (testResourcePool == null) {
MSException.throwException(Translator.get("test_resource_pool_not_exists"));
}
if (ResourceStatusEnum.INVALID.name().equals(testResourcePool.getStatus())) {
MSException.throwException(Translator.get("test_resource_pool_invalid"));
}
- そして、kafka がアクセス可能かどうかを確認します
String bootstrapServers = kafkaProperties.getBootstrapServers();
String[] servers = StringUtils.split(bootstrapServers, ",");
try {
for (String s : servers) {
String[] ipAndPort = s.split(":");
//1,建立tcp
String ip = ipAndPort[0];
int port = Integer.parseInt(ipAndPort[1]);
Socket soc = new Socket();
soc.connect(new InetSocketAddress(ip, port), 1000); // 1s timeout
//2.输入内容
String content = "1010";
byte[] bs = content.getBytes();
OutputStream os = soc.getOutputStream();
os.write(bs);
//3.关闭
soc.close();
次に、ノード ノード タイプ、new DockerTestEngine(loadTest)、k8s タイプの場合、(Engine) ConstructorUtils.invokeConstructor(kubernetesTestEngineClass,loadTest)、ノード タイプがインスタンス化されている場合など、さまざまなリソース プール タイプに応じて異なるエンジンをインスタンス化します。 2 つのタスク。1 つは threadNum、JMETER_IMAGE、HEAP などの初期化作業で、もう 1 つは後続のリクエストのためにコンテナから RestTemplate を取得することです。
final ResourcePoolTypeEnum type = ResourcePoolTypeEnum.valueOf(resourcePool.getType());
if (type == ResourcePoolTypeEnum.NODE) {
return new DockerTestEngine(loadTest);
}
if (type == ResourcePoolTypeEnum.K8S) {
try {
return (Engine) ConstructorUtils.invokeConstructor(kubernetesTestEngineClass, loadTest);
- startEngineでユースケースの実行を開始します。まずテストレポートの開始時刻などの基本情報を設定し、エンジン内のstartメソッドを呼び出して実行を開始します。開始処理は以下に分かれます。
現在必要な同時スレッドがアイドル状態のスレッドの数より少ないかどうかを判断します。
int totalThreadNum = resourceList.stream()
.filter(r -> ResourceStatusEnum.VALID.name().equals(r.getStatus()))
.map(r -> JSON.parseObject(r.getConfiguration(), NodeDTO.class).getMaxConcurrency())
.reduce(Integer::sum)
.orElse(0); //获取所有有效资源池的最大并发数,并累加
if (threadNum > totalThreadNum - runningSumThreadNum) {
MSException.throwException(Translator.get("max_thread_insufficient"));
}
各リソース プールの同時実行数の最大数と同時実行数の合計の比率を計算します。
Object[] resourceRatios = resourceList.stream()
.filter(r -> ResourceStatusEnum.VALID.name().equals(r.getStatus()))
.map(r -> JSON.parseObject(r.getConfiguration(), NodeDTO.class).getMaxConcurrency())
.map(r -> r * 1.0 / totalThreadNum)
.map(r -> String.format("%.2f", r))
.toArray();// 各个资源池最大并发数占总的并发数比例
jmeter コンテナの起動に必要な環境パラメータ (イメージ、テスト ID、レポート ID、トピックなど) を準備するなど、テスト用のリソース プールの使用を開始し、RestTemplate を通じてコンテナの起動リクエストをノード コントローラに送信します。対応する環境パラメータを渡します。ノード
コントローラーはリクエストを受信した後に jmeter コンテナを作成し、jmeter コンテナは対応する環境パラメータに従って metis プラットフォームから jmx を自動的にダウンロードし、ストレス テストを開始します。
まとめ:
最後に、私の記事を注意深く読んでくださった皆さんに感謝します。互恵性は常に必要です。それほど価値のあるものではありませんが、使用できる場合は、直接受け取ることができます。
この情報は、[ソフトウェア テスト] の友人にとって最も包括的かつ完全な準備倉庫となるはずです。この倉庫は、最も困難な旅を乗り越える何万人ものテスト エンジニアにも同行してきました。また、皆さんのお役に立てれば幸いです。