متن خبر

نحوه انجام تست بار در Spring Boot با Gatling

نحوه انجام تست بار در Spring Boot با Gatling

شناسهٔ خبر: 634760 -




برای ارزیابی عملکرد یک سیستم، به ابزاری نیاز دارید که بتواند رفتار آن را در تولید شبیه سازی کند.

برای این منظور می توانید از ابزار نرم افزاری مبتنی بر اسکالا به نام Gatling استفاده کنید. این مقاله به شما یاد می دهد که چگونه آن را در یک برنامه Spring Boot ادغام کنید و یک تست بارگذاری انجام دهید.

مفاهیم اصلی

Gatling ابزاری است که می توانید از آن برای اجرای تست های بار و عملکرد استفاده کنید. می توان از آن به عنوان یک برنامه کاربردی مستقل یا ادغام در یک پروژه مبتنی بر Maven یا Gradle استفاده کرد.

Gatling بر اساس Scala، چارچوب Netty و جعبه ابزار Akka است. این دارای یک معماری ناهمزمان و غیر مسدود است که امکان عملکرد بالا با حداقل اتلاف منابع را فراهم می کند.

شما می توانید تست ها را با زبان منعطف دامنه خاص Gatling تعریف کنید. همچنین می‌توانید از عملکرد ضبط‌کننده آن با رابط کاربری گرافیکی برای ثبت تعاملات کاربر در مرورگر و تولید اسکریپت‌های Scala استفاده کنید که می‌توانند برای انجام یک شبیه‌سازی اصلاح و راه‌اندازی شوند.

در این مقاله، نحوه ادغام Gatling در یک برنامه وب Spring Boot مبتنی بر Maven را خواهید آموخت. شما یک تست بارگذاری را توسط DSL آن تعریف می‌کنید و سپس آن را با استفاده از افزونه Gatling Maven اجرا می‌کنید.

با Gatling می توانید تست های عملکرد را به روش های مختلف انجام دهید. به عنوان مثال، می توانید پیاده سازی کنید:

تست بار : برای مشاهده نحوه عملکرد یک سیستم تحت یک بار خاص

تست استرس : برای یافتن نقطه شکست یک سیستم، افزایش تدریجی بار

تست خیساندن : اجرای سیستم با بار ثابت برای مدت طولانی برای یافتن مشکلات آن

تست اسپایک : برای مشاهده نحوه عملکرد سیستم هنگام بالا بردن سریع بار به اوج و سپس پایین آمدن

اجزای اصلی که توسط Gatling ویژگی های شرح داده شده در بالا را پیاده سازی می کند عبارتند از:

سناریوها : مجموعه ای از مراحل انجام شده توسط یک کاربر مجازی

فیدرها : نحوه ارائه داده برای تغذیه سناریوها

تزریق : نوعی طرح اولیه که نحوه انجام آزمایش، از نظر تعداد کاربران مجازی، نحوه تغییر آنها در زمان و غیره را بیان می کند.

ادغام Spring Boot Gatling

در این مقاله شما با یک وب اپلیکیشن ساده Spring Boot شروع کرده و تست بارگذاری را روی آن پیاده سازی و اجرا می کنید. کد منبع این نمونه برنامه را می توانید در GitHub بیابید.

تصور کنید یک کتابخانه دارید و می خواهید کتاب های جدیدی را با عنوان آنها درج کنید. شما می توانید این حداقل نیاز را با استفاده از JPA با تعریف یک موجودیت Book، یک کلاس مخزن، یک کلاس سرویس و یک کنترلر با نگاشت سرویس REST پیاده سازی کنید.

سرویس REST به عنوان یک فراخوانی POST به نقطه پایانی /book تعریف می شود که یک شی کتاب جدید را ذخیره می کند. پیاده سازی را می توانید در کد زیر مشاهده کنید:

 @RestController @RequestMapping("/library") public class BookController { Logger logger = LoggerFactory.getLogger(BookController.class); @Autowired BookService bookService; @PostMapping(value = "/book", consumes = "application/json", produces = "application/json") public Book createPerson(@RequestBody Book book) { return bookService.save(book); } }

برای انجام تست بار در نقطه پایانی REST فوق، باید Gatling را ادغام کنید. می توانید این کار را با تنظیم چند وابستگی Maven در ابتدا انجام دهید:

 <dependency> <groupId>io.gatling</groupId> <artifactId>gatling-app</artifactId> <version>3.7.2</version> </dependency> <dependency> <groupId>io.gatling.highcharts</groupId> <artifactId>gatling-charts-highcharts</artifactId> <version>3.7.2</version> </dependency> <dependency> <groupId>com.github.javafaker</groupId> <artifactId>javafaker</artifactId> <version>0.15</version> </dependency>

سپس برای اجرای آزمایش به افزونه Maven نیز نیاز دارید:

 <plugin> <groupId>io.gatling</groupId> <artifactId>gatling-maven-plugin</artifactId> <version>4.2.9</version> <configuration> <simulationClass>com.codingstrain.springcloud.sample.libraryapp.books.BookSaveSimulation</simulationClass> </configuration> </plugin>

اجرای آزمایش بارگذاری

برای اجرای یک تست، باید کلاس io.gatling.javaapi.core.Simulation را مانند کلاس BookSaveSimulation زیر گسترش دهید:

 import static io.gatling.javaapi.core.CoreDsl.StringBody; import static io.gatling.javaapi.core.CoreDsl.global; import static io.gatling.javaapi.core.CoreDsl.rampUsersPerSec; import static io.gatling.javaapi.http.HttpDsl.http; import java.time.Duration; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.stream.Stream; import com.github.javafaker.Faker; import io.gatling.javaapi.core.CoreDsl; import io.gatling.javaapi.core.OpenInjectionStep.RampRate.RampRateOpenInjectionStep; import io.gatling.javaapi.core.ScenarioBuilder; import io.gatling.javaapi.core.Simulation; import io.gatling.javaapi.http.HttpDsl; import io.gatling.javaapi.http.HttpProtocolBuilder; public class BookSaveSimulation extends Simulation { public BookSaveSimulation() { setUp(buildPostScenario() .injectOpen(injection()) .protocols(setupProtocol())).assertions(global().responseTime() .max() .lte(10000), global().successfulRequests() .percent() .gt(90d)); } private static ScenarioBuilder buildPostScenario() { return CoreDsl.scenario("Load POST Test") .feed(feedData()) .exec(http("create-book").post("/library/book") .header("Content-Type", "application/json") .body(StringBody("{ \"title\": \"${title}\" }"))); } private static Iterator &lt;Map&lt;String, Object&gt;&gt; feedData() { Faker faker = new Faker(); Iterator&lt;Map&lt;String, Object&gt;&gt; iterator; iterator = Stream.generate(() -&gt; { Map&lt;String, Objectglt; stringObjectMap = new HashMap<>(); stringObjectMap.put("title", faker.book() .title()); return stringObjectMap; }) .iterator(); return iterator; } private static HttpProtocolBuilder setupProtocol() { return HttpDsl.http.baseUrl("http://localhost:8080") .acceptHeader("application/json") .maxConnectionsPerHost(10) .userAgentHeader("Performance Test"); } private RampRateOpenInjectionStep injection() { int totalUsers = 100; double userRampUpPerInterval = 10; double rampUpIntervalInSeconds = 30; int rampUptimeSeconds = 300; int duration = 300; return rampUsersPerSec(userRampUpPerInterval / (rampUpIntervalInSeconds)).to(totalUsers) .during(Duration.ofSeconds(rampUptimeSeconds + duration)); } }

کلاس BoookSaveSimulation از سازنده خود برای انجام تمام تنظیمات با استفاده از روش setUp کلاس والد استفاده می کند. ابتدا یک سناریو را اجرا می کند. از آنجایی که هدف آزمایش شبیه سازی یک وضعیت واقعی در تولید است، این سناریو مراحل انجام شده توسط تعداد پیکربندی شده ای از کاربران مجازی که با سیستم در تعامل هستند را نشان می دهد.

سناریوی مثال، یک فراخوانی POST را به نقطه پایانی /library/book اجرا می‌کند و یک پارامتر عنوان واحد را در بار ارسال می‌کند. سرویس فراخوانی شده یک کتاب جدید را با مقدار عنوان ارسال شده ذخیره می کند. کلاسی به نام com.github.javafaker.Faker مقادیر عنوان را به طور خودکار تولید می کند و مولفه فیدر که قبلاً در بخش Main Concepts توضیح داده شد را پیاده سازی می کند.

سپس روش injectOpen نحوه اضافه شدن کاربران مجازی به شبیه سازی را مشخص می کند. روش injectOpen قسمت تزریق را با استفاده از حالت به اصطلاح باز پیاده سازی می کند. دو مدل مختلف تزریق وجود دارد، open و closed .

مدل باز سناریویی را شبیه سازی می کند که در آن کاربران جدید می توانند به طور مداوم و مستقل از وضعیت اجرای دیگران اضافه شوند. این مدلی است که در مثال این مقاله استفاده شده است. از طرف دیگر، در مدل بسته، کاربران جدید تنها زمانی می توانند اضافه شوند که بقیه وظایف خود را خاتمه داده باشند. این به شبیه سازی بار ثابت در سیستم کمک می کند.

پیکربندی تزریق باز در مثال، تعداد کل 100 کاربر را تنظیم می کند که هر 30 ثانیه به تدریج 10 کاربر در هر زمان اضافه می شوند. پس از اضافه شدن همه کاربران، اجرا به مدت 300 ثانیه ادامه می یابد.

روش پروتکل ها URL پایه، نوع داده مورد انتظار در پاسخ، حداکثر تعداد اتصالات در هر میزبان و سربرگ User-Agent را تنظیم می کند.

بخش آخر این مرحله تنظیم، چند ادعا را برای در نظر گرفتن قبولی آزمون تعریف می کند: حداکثر زمان پاسخ کمتر از 10 ثانیه و درصد درخواست های موفق بیش از 90%.

نحوه اجرای تست

برای اجرای تست، ابتدا باید اپلیکیشن وب Spring Boot را راه اندازی کنید. برای مثال می‌توانید این کار را با رفتن به پوشه پایه پروژه انجام دهید و دستور زیر را اجرا کنید: mvn spring-boot:run .

پس از شروع برنامه، می توانید شبیه سازی Gatling را با اجرای mvn gatling:test اجرا کنید.

نحوه مشاهده نتایج

پس از پایان آزمایش، یک index.html در فهرست /target/gatling با تمام اندازه‌گیری‌ها و چندین نمودار پیدا خواهید کرد.

شکل زیر تمامی نتایج را نشان می دهد. فهرستی از ادعاها و نتیجه آنها را نشان می دهد. سپس می‌توانید تعداد کل درخواست‌ها و اینکه چند درخواست نتیجه مثبت یا منفی دارند را مشاهده کنید. شما اطلاعات مفیدی در مورد زمان پاسخگویی دارید: حداقل، حداکثر، میانگین و انحراف معیار، و همچنین صدک های 50، 75، 95 و 99 را دارید.

خلاصه
خلاصه نتایج آزمون

نمودار تعداد درخواست ها را با نتایج مثبت و منفی در یک بازه زمانی خاص مانند شکل زیر نشان می دهد.

GlobalInfo
تعداد درخواست ها در محدوده زمانی پاسخ خاص

نمودار دیگری تعداد درخواست ها در ثانیه و نحوه تغییر آن بسته به تعداد کاربران فعال را نشان می دهد.

Requests Persecond
تعداد درخواست در ثانیه و کاربران فعال در طول زمان

همچنین می توانید در شکل بعدی مشاهده کنید که چگونه صدک ها در طول زمان و با تعداد کاربران فعال در هر نقطه از زمان تغییر می کنند.

صدک ها

نتیجه

ارزیابی عملکرد یک سیستم یک کار پیچیده است. Gatling کارها را به اندازه کافی آسان می کند تا بتوان این نوع کارها را با یکپارچه سازی مداوم ادغام کرد. این یک نمای جامع به شما می دهد و به شما امکان می دهد تست ها را برای یافتن نقاط ضعف و پیشنهاد راه حل تغییر دهید.

خبرکاو

ارسال نظر

دیدگاه‌ها بسته شده‌اند.


تبليغات ايهنا تبليغات ايهنا

تمامی حقوق مادی و معنوی این سایت متعلق به خبرکاو است و استفاده از مطالب با ذکر منبع بلامانع است