{"id":25985,"date":"2023-12-13T05:00:00","date_gmt":"2023-12-13T04:00:00","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=25985"},"modified":"2023-12-13T08:36:47","modified_gmt":"2023-12-13T07:36:47","slug":"performance-under-control-with-k6-best-practices-test-suite-creation-and-configuration","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/en\/performance-under-control-with-k6-best-practices-test-suite-creation-and-configuration\/","title":{"rendered":"Performance under control with k6 \u2013 best practices, test suite creation, and configuration"},"content":{"rendered":"\n<p>Best practices in performance testing programming in the context of k6 encompass a range of techniques and approaches that aid in efficient, reliable, and effective performance testing of applications. Additionally, these best practices aim to demonstrate how to create test scenarios that are easy to build and maintain.<\/p>\n\n\n\n<figure class=\"wp-block-embed aligncenter is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe title=\"Testy wydajno\u015bciowe z k6: Dobre praktyki, tworzenie zbior\u00f3w test\u00f3w i konfiguracja | cz\u0119\u015b\u0107 6\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/KZ3JP9rCPl8?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Simplifying test scenarios<\/strong><\/h2>\n\n\n\n<p>Up until now, we have focused on creating simple test scenarios. However, even with the reuse of many elements within a scenario, there is potential for further simplification.<\/p>\n\n\n\n<p>To achieve this, <strong>we will utilize the httpx module based on the k6 API<\/strong>. This module changes the approach to creating test scenarios, making them more intuitive and easier to maintain. It is considered one of the many good practices in k6.<\/p>\n\n\n\n<p>The core of using the httpx module is the creation of a user session. This approach is reminiscent of that used in tools like JMeter. On the session object, we can define fields such as the base URL or headers, which will be included in every subsequent request. Furthermore, it&#8217;s possible to define global settings, such as the timeout duration in case of no application response.<\/p>\n\n\n\n<p>Let&#8217;s take a look at an example test scenario.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-01.png\"><img decoding=\"async\" width=\"985\" height=\"1024\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-01-985x1024.png\" alt=\"An example test scenario\" class=\"wp-image-25958\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-01-985x1024.png 985w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-01-289x300.png 289w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-01-768x798.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-01.png 1428w\" sizes=\"(max-width: 985px) 100vw, 985px\" \/><\/a><figcaption class=\"wp-element-caption\">Fig. 1 An example test scenario<\/figcaption><\/figure>\n\n\n\n<p>In the above example, we no longer need to define headers or the full application URL each time.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Covering HTTP requests for static resources<\/strong><\/h3>\n\n\n\n<p>Another interesting practice is covering HTTP requests for static resources. Static files often change on a webpage, which can lead to cumbersome test scenario edits with every change. Therefore, we will create a utils directory to house our helper functions. Next, we&#8217;ll place a file named helper.js with the following content in this directory:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-02.png\"><img decoding=\"async\" width=\"1024\" height=\"826\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-02-1024x826.png\" alt=\"Contents of the helper.js file\" class=\"wp-image-25960\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-02-1024x826.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-02-300x242.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-02-768x620.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-02-1536x1239.png 1536w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-02.png 1790w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Fig. 2 Contents of the helper.js file<\/figcaption><\/figure>\n\n\n\n<p>The above file contains two functions. The first one is already familiar to us and is responsible for pausing the execution of the script. The second function, on the other hand, is used to extract all requests related to static resources on the page, and then it sends a GET request to each of them. This function could be expanded to include proper tagging and checking whether the domain belongs to those of interest.<\/p>\n\n\n\n<p>Moreover, we could add the ability to perform six simultaneous asynchronous calls to static resources at once. This would make our tests even more closely resemble browser behavior.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Creating a test suit<\/strong><\/h2>\n\n\n\n<p>Based on the knowledge gained <a href=\"https:\/\/sii.pl\/blog\/en\/all\/k6-en\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">throughout the series<\/a>, let&#8217;s try to create two test scenarios that will be based on the Sii application. Let&#8217;s assume we want to cover the following simplified test scenarios:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Scenario named search-article.js \u2013 responsible for searching for articles on the page and then accessing the one of interest:<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\"><strong>Step number<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>Test step<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>Expected outcome<\/strong><\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">1<\/td><td class=\"has-text-align-center\" data-align=\"center\">User navigates to the homepage<\/td><td class=\"has-text-align-center\" data-align=\"center\">User is on the homepage<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">2<\/td><td class=\"has-text-align-center\" data-align=\"center\">User searches for 1 of the 5 pre-defined articles<\/td><td class=\"has-text-align-center\" data-align=\"center\">The searched article is displayed to user<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">3<\/td><td class=\"has-text-align-center\" data-align=\"center\">User clicks on the searched article<\/td><td class=\"has-text-align-center\" data-align=\"center\">The article&#8217;s name is displayed to the user<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Implementation in k6:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-03.png\"><img decoding=\"async\" width=\"554\" height=\"1024\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-03-554x1024.png\" alt=\"Scenario implementation in k6\" class=\"wp-image-25962\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-03-554x1024.png 554w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-03-162x300.png 162w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-03-768x1420.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-03-831x1536.png 831w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-03-1108x2048.png 1108w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-03.png 2048w\" sizes=\"(max-width: 554px) 100vw, 554px\" \/><\/a><figcaption class=\"wp-element-caption\">Fig. 3 Scenario implementation in k6<\/figcaption><\/figure>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>Scenario named search-training.js \u2013 this scenario searches for a training of interest:<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\"><strong>Step number<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>Test step<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>Expected outcome<\/strong><\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">1<\/td><td class=\"has-text-align-center\" data-align=\"center\">User navigates to the homepage<\/td><td class=\"has-text-align-center\" data-align=\"center\">User is on the homepage<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">2<\/td><td class=\"has-text-align-center\" data-align=\"center\">User goes to the \u201cSzkolenia\u201d (Trainings) section<\/td><td class=\"has-text-align-center\" data-align=\"center\">User is in the \u201cSzkolenia\u201d section<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">3<\/td><td class=\"has-text-align-center\" data-align=\"center\">User navigates to the training search<\/td><td class=\"has-text-align-center\" data-align=\"center\">User is in the training search section<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">4<\/td><td class=\"has-text-align-center\" data-align=\"center\">User searches for a training named \u201cZosta\u0144 Analitykiem Biznesowym\u201d<\/td><td class=\"has-text-align-center\" data-align=\"center\">The offer for the training is displayed<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Implementation in k6:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-04.png\"><img decoding=\"async\" width=\"573\" height=\"1024\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-04-573x1024.png\" alt=\"Scenario implementation in k6\" class=\"wp-image-25964\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-04-573x1024.png 573w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-04-168x300.png 168w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-04-768x1372.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-04-860x1536.png 860w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-04-1147x2048.png 1147w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-04.png 2048w\" sizes=\"(max-width: 573px) 100vw, 573px\" \/><\/a><figcaption class=\"wp-element-caption\">Fig. 4 Scenario implementation in k6<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Scenario Configurations<\/strong><\/h2>\n\n\n\n<p>In the previous sections, we discussed various types of executors used in k6. This is important because if we wanted to change the type of executor, we would need to edit the code inside the scenario. Another option is duplicating the same test scenario.<\/p>\n\n\n\n<p>Both of these solutions are cumbersome to maintain in the long run and impractical. Therefore, different test configurations are used, which can be universally applied to each scenario. Let&#8217;s take a look at two configurations:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>smoke.json \u2013 a configuration responsible for a single run of the scenario.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-05.png\"><img decoding=\"async\" width=\"1024\" height=\"734\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-05-1024x734.png\" alt=\"Configuration of smoke.json\" class=\"wp-image-25966\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-05-1024x734.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-05-300x215.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-05-768x550.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-05.png 1066w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Fig. 5 Configuration of smoke.json<\/figcaption><\/figure>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>load.json \u2013 target configuration that increases the load along with the test duration:<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-06.png\"><img decoding=\"async\" width=\"1024\" height=\"830\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-06-1024x830.png\" alt=\"Configuration of load.json\" class=\"wp-image-25968\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-06-1024x830.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-06-300x243.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-06-768x623.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-06.png 1204w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Fig. 6 Configuration of load.json<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Defining custom commands<\/strong><\/h2>\n\n\n\n<p>The final stage involves defining commands to run the target scenarios. We will utilize the familiar mechanism from the package.json configuration file that we have already encountered.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-07.png\"><img decoding=\"async\" width=\"1024\" height=\"681\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-07-1024x681.png\" alt=\"Defining custom commands\" class=\"wp-image-25970\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-07-1024x681.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-07-300x199.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-07-768x510.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-07-1536x1021.png 1536w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p6-attachment-07.png 1980w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Fig. 7 Defining custom commands<\/figcaption><\/figure>\n\n\n\n<p>We have defined four commands, where the first ones are responsible for running two tests with a single iteration configuration. In the latter ones, the execution is for the load testing configuration.<a><\/a><\/p>\n\n\n\n<p>One aspect that could be improved is dynamically defining the number of virtual users used in the second configuration scenario. This enhancement would make the configurations even more versatile for each scenario. After all, the appropriate load for the first scenario is likely to differ from that of the second scenario. This could be achieved using environment variables.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Summary<\/strong><\/h2>\n\n\n\n<p>In the sixth article of our series, we discussed best practices for writing performance test scenarios in k6. We created sample test scenarios and configured them to enhance the versatility of our testing framework.<\/p>\n\n\n\n<p>Our journey with k6 is far from over \u2013 we can continue developing the framework and tailor it to our needs to ensure the quality and reliability of our applications. In the next part, we will delve into using Grafana, InfluxDB, and Docker.<strong><\/strong><\/p>\n\n\n\n<p>***<\/p>\n\n\n\n<p>If you haven\u2019t had a chance to read the articles in the series yet, you can find them here:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/sii.pl\/blog\/en\/performance-under-control-with-k6-introduction\/\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"ek-link\">Performance under control with k6 \u2013 introduction<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/sii.pl\/blog\/en\/performance-under-control-with-k6-recording-parametrization-and-running-the-first-test-scenario\/\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"ek-link\">Performance under control with k6 \u2013 recording, parametrization, and running the first test scenario<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/sii.pl\/blog\/en\/performance-under-control-with-k6-metrics-quality-thresholds-tagging\/\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"ek-link\">Performance under control with k6 \u2013 metrics, quality thresholds, tagging<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/sii.pl\/blog\/en\/performance-under-control-with-k6-additional-configurations-types-of-scenario-models-and-executors\/\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"ek-link\">Performance under control with k6 \u2013 additional configurations types of scenario models and executors<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/sii.pl\/blog\/en\/performance-under-control-with-k6-framework-initialization\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">Performance under control with k6 \u2013 framework initialization<\/a><\/li>\n<\/ul>\n\n\n\n<p>In addition, I encourage you to&nbsp;<a href=\"https:\/\/github.com\/gpiechnik2\/k6-boilerplate\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >check out the project\u2019s Repository<\/a>.<\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;25985&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;2&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5 ( votes: 2)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Performance under control with k6 \u2013 best practices, test suite creation, and configuration&quot;,&quot;width&quot;:&quot;139.5&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 139.5px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            5\/5 ( votes: 2)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Best practices in performance testing programming in the context of k6 encompass a range of techniques and approaches that aid &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/en\/performance-under-control-with-k6-best-practices-test-suite-creation-and-configuration\/\">Continued<\/a><\/p>\n","protected":false},"author":517,"featured_media":25499,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1321],"tags":[1790,1791,1604,1590],"class_list":["post-25985","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-testing","tag-k6-en","tag-tosca-en","tag-pros-and-cons","tag-tools"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/11\/Wydajnosc-pod-kontrola-\u2013-co-sklania-mnie-do-wyboru-k6.jpg","category_names":["Testing"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/posts\/25985"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/users\/517"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/comments?post=25985"}],"version-history":[{"count":3,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/posts\/25985\/revisions"}],"predecessor-version":[{"id":26086,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/posts\/25985\/revisions\/26086"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/media\/25499"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/media?parent=25985"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/categories?post=25985"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/tags?post=25985"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}