<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Performance on Nicole van der Hoeven</title><link>https://nicolevanderhoeven.com/tags/performance/</link><description>Recent content in Performance on Nicole van der Hoeven</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><copyright>Nicole van der Hoeven</copyright><lastBuildDate>Thu, 11 Jan 2024 16:00:25 +0100</lastBuildDate><atom:link href="https://nicolevanderhoeven.com/tags/performance/index.xml" rel="self" type="application/rss+xml"/><item><title>Entendiendo los sintéticos (Café con Grafana #008)</title><link>https://nicolevanderhoeven.com/blog/20240111-ccg008-enteniendo-los-sint%C3%A9ticos/</link><pubDate>Thu, 11 Jan 2024 16:00:25 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20240111-ccg008-enteniendo-los-sint%C3%A9ticos/</guid><description>&lt;p&gt;En este episodio de Café con Grafana les traemos a Marcelo Magallón, experto en monitoreo sintético, quien viene precisamente a contarnos que es en sí un sintético. Él nos va a mostrar algunos ejemplos, casos de uso y mucha mas diversión!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/fXNSqrUtiJo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Lee la documentación sobre el monitoreo de sintéticos &lt;a href="https://grafana.com/docs/grafana-cloud/monitor-public-endpoints/installation/"&gt;en Grafana Cloud aquí&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>How to Get Started with Tempo (Grafana Office Hours #22)</title><link>https://nicolevanderhoeven.com/blog/20231201-goh22-how-to-get-started-with-tempo/</link><pubDate>Fri, 01 Dec 2023 11:55:55 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20231201-goh22-how-to-get-started-with-tempo/</guid><description>&lt;p&gt;Grafana Labs Principal Engineer and Tempo maintainer Joe Elliot talks about how to get started with Tempo, what distributed tracing is, and why TraceQL is cool. He is joined by Developer Advocates Nicole van der Hoeven and Paul Balogh.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/zDrA7Ly3ovU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=pUAmL28uzos"&gt;Getting started with Tempo&lt;/a&gt; (video)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/grafana/tempo"&gt;Grafana Tempo repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grafana.com/docs/tempo/latest/getting-started/"&gt;Grafana Tempo docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.grafana.com/c/grafana-tempo/40"&gt;The Tempo category on the Grafana community forum&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/playlist?list=PLDGkOdUX1UjrA4D1MRdAzUgEGp5UXvW3z"&gt;Video playlist for Grafana Tempo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=petbezEmIw4"&gt;Distributed tracing with Grafana Cloud k6&lt;/a&gt; (Grafana Office Hours video)&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Repasemos el G-stack (Café con Grafana #005)</title><link>https://nicolevanderhoeven.com/blog/20231130-ccg005-repasemos-el-g-stack/</link><pubDate>Thu, 30 Nov 2023 13:57:52 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20231130-ccg005-repasemos-el-g-stack/</guid><description>&lt;p&gt;En este episodio de Café con Grafana tenemos a Raul Marin, Solutions Engineer (Ingeniero de soluciones?) quien viene a darnos una repasada completisima de todo el stack de Grafana. TODO! Pues hay muchos que no conocen todas las herramientas, caracteristicas y posibilidades que Grafana Labs viene a ofrecer.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/irUr96JV-Sg?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Performance Testing With Nicole van der Hoeven (Quality Bits Podcast)</title><link>https://nicolevanderhoeven.com/blog/20231128-quality-bits-performance-testing-with-nicole-van-der-hoeven/</link><pubDate>Tue, 28 Nov 2023 14:01:35 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20231128-quality-bits-performance-testing-with-nicole-van-der-hoeven/</guid><description>&lt;p&gt;My friend Lina Zubyte invited me to her podcast Quality Bits to talk about performance testing. We talked about what performance testing is, why it is important, how to get started, and how to get better at it. We also talked about the foundation of any type of testing: empathy.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://qualitybits.buzzsprout.com/2037134/13909242-performance-testing-with-nicole-van-der-hoeven"&gt;Check out the episode here&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>How to Use Flow Mode for Grafana Agent (Grafana Office Hours #21)</title><link>https://nicolevanderhoeven.com/blog/20231124-goh21-how-to-use-flow-mode-for-grafana-agent/</link><pubDate>Fri, 24 Nov 2023 11:47:00 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20231124-goh21-how-to-use-flow-mode-for-grafana-agent/</guid><description>&lt;p&gt;Senior Software Engineer Matt Durham shows us how to use flow mode for Grafana Agent. Flow mode is a new and better way to install and configure Grafana Agent than the older &amp;ldquo;static mode&amp;rdquo;. Among other things, flow mode&amp;rsquo;s modularity makes it easier to build more complex workflows like traditional data pipelines and allows for more use cases than collecting and processing telemetry.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/-_SsFLoJvoc?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/grafana/agent"&gt;Grafana Agent repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grafana.com/docs/agent/latest/"&gt;Grafana Agent docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grafana.com/docs/agent/latest/flow/"&gt;Grafana Agent flow mode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtube.com/live/i0mA0w_MCPQ"&gt;What is Grafana Agent?&lt;/a&gt; (previous Grafana Office Hours video)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://slack.grafana.com/"&gt;Grafana Slack&lt;/a&gt; - there&amp;rsquo;s an &lt;code&gt;#agent&lt;/code&gt; channel&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.google.com/document/d/1TqaZD1JPfNadZ4V81OCBPCG_TksDYGlNlGdMnTWUSpo/edit#heading=h.jkpb8gk2r6u8"&gt;Grafana Agent Community Call agenda&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/grafana/agent-modules"&gt;Modules for Grafana Agent&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Dimensionando el Grafana Suite (Café con Grafana #004)</title><link>https://nicolevanderhoeven.com/blog/20231123-ccg004-dimensionando-el-grafana-suite/</link><pubDate>Thu, 23 Nov 2023 13:51:25 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20231123-ccg004-dimensionando-el-grafana-suite/</guid><description>&lt;p&gt;Almudena Vivanco viene a platicarnos de todos los experimentos y pruebas a las que someten a toda la suite de Grafana. Desde Mimir hasta k6 ella pone al limite todos los elementos constantemente. Además nos dará muchos tips de su experiencia para usar Grafana y mucho mas!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/O9tAkdKMvDg?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Realistic Tests with Testcontainers (Grafana Office Hours #20)</title><link>https://nicolevanderhoeven.com/blog/20231117-goh20-realistic-tests-with-testcontainers/</link><pubDate>Fri, 17 Nov 2023 11:40:46 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20231117-goh20-realistic-tests-with-testcontainers/</guid><description>&lt;p&gt;In this episode of Grafana Office Hours, we talk about realistic unit tests utilizing actual instances of databases and other dependencies. We&amp;rsquo;ll be joined by Manuel de la Peña from AtomicJar, and Pablo Chacin from Grafana to learn how we can use the Testcontainers open-source framework to create lightweight, throwaway dependencies for our tests.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/LtlRvmWzCRE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="related-links"&gt;Related links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://testcontainers.com/"&gt;Testcontainers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://testcontainers.com/modules/k3s/"&gt;k3s Module&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://testcontainers.com/modules/k6/"&gt;k6 Module&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>(ES) Cómo hacer pruebas de carga con Grafana k6 (Café con Grafana #003)</title><link>https://nicolevanderhoeven.com/blog/20231108-ccg003-c%C3%B3mo-hacer-pruebas-de-carga-con-grafana-k6/</link><pubDate>Wed, 08 Nov 2023 13:43:50 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20231108-ccg003-c%C3%B3mo-hacer-pruebas-de-carga-con-grafana-k6/</guid><description>&lt;p&gt;Daniel González Lopes nos viene a demostrar cómo hacer pruebas de carga con Grafana k6 desde zero, y cómo utilizar k6 para ejecutar otros tipos de pruebas. En este episodio para principiantes, hablaremos también sobre la relación entre pruebas y observabilidad.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/NF2R-Zk9iek?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/grafana/k6"&gt;Repositorio de k6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grafana.com/docs/k6/latest/"&gt;Documentación de k6&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>(TL) Ano ang relasyon ng testing at observabilidad?</title><link>https://nicolevanderhoeven.com/blog/20231101-relasyon-ng-testing-at-observabilidad/</link><pubDate>Wed, 01 Nov 2023 12:19:46 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20231101-relasyon-ng-testing-at-observabilidad/</guid><description>&lt;p&gt;Ano ang relasyon ng testing sa observabilidad? Sa video na ito, pinag-uusapan namin ng kaibigan kong si &lt;a href="https://testingwithmarie.com"&gt;Marie Cruz&lt;/a&gt; kung ano ang testing, ano ang observabilidad, at bakit dapat nating gamitin pero para pabutihin ang ating mga aplikasyon.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/rC9trgeMYyk?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>K-SIX News v0.47</title><link>https://nicolevanderhoeven.com/blog/20231030-ksix-news-0_47/</link><pubDate>Mon, 30 Oct 2023 11:57:21 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20231030-ksix-news-0_47/</guid><description>&lt;p&gt;In this video, my colleagues (&lt;a href="https://www.srperf.com/"&gt;Leandro Melendez&lt;/a&gt;, &lt;a href="https://testingwithmarie.com"&gt;Marie Cruz&lt;/a&gt;, and &lt;a href="https://javaducky.com"&gt;Paul Balogh&lt;/a&gt;) and I discuss the latest updates in k6 v0.47.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/iUwSgJgJBAI?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Here are some of the highlights:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We&amp;rsquo;ve created an official &lt;a href="https://grafana.com/grafana/dashboards/19665-k6-prometheus/"&gt;k6 Prometheus Grafana dashboard&lt;/a&gt; and &lt;a href="https://grafana.com/grafana/dashboards/18030-k6-prometheus-native-histograms/"&gt;another dashboard for Prometheus with native histograms&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;New APIs have been added for Prometheus Remote Write output for k6 (authentication and HTTP headers).&lt;/li&gt;
&lt;li&gt;We&amp;rsquo;ve increased the character limit for metric names from 63 to 128, aligned with the OpenTelemetry specification update.&lt;/li&gt;
&lt;li&gt;k6 browser tests can be executed in Grafana Cloud by everyone.&lt;/li&gt;
&lt;li&gt;We&amp;rsquo;ve improved the cookie API for k6 browser.&lt;/li&gt;
&lt;li&gt;We&amp;rsquo;ve added support for &lt;code&gt;page.on('console')&lt;/code&gt; for k6 browser.&lt;/li&gt;
&lt;li&gt;There are now official Docker images that include a Chromium-based browser for running k6 browser tests within CI/CD pipelines.&lt;/li&gt;
&lt;li&gt;Distributed tracing is in public preview for Grafana Cloud.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/avitalique/xk6-file"&gt;xk6-file&lt;/a&gt; is a new extension that lets you rename files within your k6 script.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/deejiw/xk6-gcp"&gt;xk6-gcp&lt;/a&gt; is a new extension that adds k6 support for messaging using Google PubSub.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/grafana/xk6-dashboard"&gt;xk6-dashboard&lt;/a&gt; is now an official Grafana extension that lets you generate HTML dashboards from k6 test results.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/szkiba/k6x"&gt;k6x&lt;/a&gt; is a new utility that automatically detects when you import k6 extensions and builds the custom k6 binary for you so that you don&amp;rsquo;t have to.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/grafana/k6-operator"&gt;k6-operator&lt;/a&gt; now has a Helmchart deployment option.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Real User Monitoring With Grafana Faro (Grafana Office Hours #17)</title><link>https://nicolevanderhoeven.com/blog/20231027-goh17-real-user-monitoring-with-grafana-faro/</link><pubDate>Fri, 27 Oct 2023 07:00:19 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20231027-goh17-real-user-monitoring-with-grafana-faro/</guid><description>&lt;p&gt;My friend &lt;a href="https://testingwithmarie.com"&gt;Marie Cruz&lt;/a&gt; and I chat with Software Engineers Kostas Pelelis and Marco Schaefer to discuss what Grafana Faro is, why it&amp;rsquo;s important to have a real user monitoring solution, and how to get started with it.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/lUYj28znIu8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="useful-links"&gt;Useful links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://grafana.com/docs/grafana-cloud/monitor-applications/frontend-observability/"&gt;Frontend observability docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/grafana/faro-web-sdk"&gt;Grafana Faro repo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Recording a Performance Test With Grafana Cloud k6 (k6 Office Hours #93)</title><link>https://nicolevanderhoeven.com/blog/20230630-koh93-recording-a-performance-test-with-grafana-cloud-k6/</link><pubDate>Fri, 30 Jun 2023 23:33:12 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20230630-koh93-recording-a-performance-test-with-grafana-cloud-k6/</guid><description>&lt;p&gt;Senior Frontend Engineer Edvinas Daugirdas demonstrates recording a performance test with Grafana Cloud k6 and some other new features that have recently come to Grafana Cloud. He is joined by Developer Advocates Marie Drake and Nicole van der Hoeven to talk about getting started with k6 for free.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/CZRyiQN7ht4?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Testing Kubernetes Networking With k6 (k6 Office Hours #91)</title><link>https://nicolevanderhoeven.com/blog/20230616-koh91-testing-kubernetes-networking-with-k6/</link><pubDate>Fri, 16 Jun 2023 13:00:50 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230616-koh91-testing-kubernetes-networking-with-k6/</guid><description>&lt;p&gt;How would you go about testing Kubernetes networking? For his initial project with k6, our new Senior Software Engineer, Roberto Santalla, talks to us about how he used k6 to improve end-to-end network throughput and some insights he learned about Kubernetes networking along the way. I also invited my colleague, Leandro Melendez, to help me interview Roberto.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/DryiirlkKIo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to use k6 for site reliability engineering (k6 Office Hours #90)</title><link>https://nicolevanderhoeven.com/blog/20230609-koh90-how-to-use-k6-for-sre/</link><pubDate>Fri, 09 Jun 2023 18:32:32 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230609-koh90-how-to-use-k6-for-sre/</guid><description>&lt;p&gt;In this k6 Office Hours, our k6 Champion, Sarah Zipkin, chats to the Grafana Labs Developer Advocates on how a Site Reliability Engineer uses k6 to test for reliability.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/yBXzUUGRCMQ?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How Supabase does performance benchmarking using k6 (k6 Office Hours #89)</title><link>https://nicolevanderhoeven.com/blog/20230526-koh89-how-supabase-does-performance-benchmarking-using-k6/</link><pubDate>Fri, 26 May 2023 16:19:51 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230526-koh89-how-supabase-does-performance-benchmarking-using-k6/</guid><description>&lt;p&gt;In this k6 Office Hours, we talk about how Supabase does performance benchmarking using k6 with Egor Romanov, SDET at Supabase; Théo Crevon, Senior Software Engineer at Grafana Labs; and Nicole van der Hoeven, Senior Developer Advocate at Grafana Labs.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/VcrQidYBjEg?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Supabase is an open-source alternative to Firebase. Learn more about Supabase &lt;a href="https://supabase.io"&gt;here&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Intersectionality in Tech (Adobo &amp; Avocados #03)</title><link>https://nicolevanderhoeven.com/blog/20230510-ana03-intersectionality-in-tech/</link><pubDate>Wed, 10 May 2023 21:35:00 +0800</pubDate><guid>https://nicolevanderhoeven.com/blog/20230510-ana03-intersectionality-in-tech/</guid><description>&lt;p&gt;&lt;a href="https://testingwithmarie.com"&gt;Marie Cruz&lt;/a&gt; and I talk about what intersectionality is and how intersecting identities can affect how we relate to the world and our experiences.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/IxHvtWBFCoY?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Getting started in testing (Adobo &amp; Avocados #02)</title><link>https://nicolevanderhoeven.com/blog/20230503-ana02-getting-started-in-testing/</link><pubDate>Wed, 03 May 2023 21:22:18 +0800</pubDate><guid>https://nicolevanderhoeven.com/blog/20230503-ana02-getting-started-in-testing/</guid><description>&lt;p&gt;&lt;a href="https://testingwithmarie.com"&gt;Marie Cruz&lt;/a&gt; and I interviewed &lt;a href="https://azevedorafaela.com/"&gt;Rafaela Azevedo&lt;/a&gt; about her experiences in getting started in testing, what it&amp;rsquo;s like to be a woman in tech, cultural differences between Brazil and the UK, and how she became a founder of a new Blockchain startup.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/MwBKEGkMbP0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to Get Core Web Vitals in k6 (k6 Office Hours #86)</title><link>https://nicolevanderhoeven.com/blog/20230428-koh86-how-to-get-core-web-vitals-in-k6/</link><pubDate>Fri, 28 Apr 2023 16:11:52 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230428-koh86-how-to-get-core-web-vitals-in-k6/</guid><description>&lt;p&gt;In this k6 Office Hours, we discuss how to get Core Web Vitals for your web app using k6, and how it can help you test for user experience. We are Nicole van der Hoeven and &lt;a href="https://testingwithmarie.com"&gt;Marie Cruz&lt;/a&gt;, and in this livestream, we&amp;rsquo;re talking about frontend performance testing with Grafana k6.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/uERQXeWVV_E?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Emergent Load Testing - rules for organized chaos</title><link>https://nicolevanderhoeven.com/blog/20230419-emergent-load-testing/</link><pubDate>Wed, 19 Apr 2023 00:21:06 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230419-emergent-load-testing/</guid><description>&lt;p&gt;Today I spoke at &lt;a href="https://events.linuxfoundation.org/kubecon-cloudnativecon-europe/program/schedule/"&gt;KubeCon EU 2023&lt;/a&gt; about &lt;a href="https://sched.co/1HyYH"&gt;emergent load testing&lt;/a&gt;.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Og4-Z6j_0M0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/img_3556.jpg" alt="Me just before the presentation, with the opening slide on the screen behind me." loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://slides.nicolevanderhoeven.com/2023-emergent-load-testing/#"&gt;Here are the slides&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Below are some links to extensions and experimental modules that I mentioned:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://grafana.com/"&gt;Grafana&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://k6.io/"&gt;k6 site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/grafana/k6"&gt;k6 repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://k6.io/docs/"&gt;k6 docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://k6.io/docs/using-k6-browser/overview/"&gt;k6 browser&lt;/a&gt; (experimental module)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://k6.io/docs/results-output/real-time/prometheus-remote-write/"&gt;Prometheus Remote Write&lt;/a&gt; (experimental module)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://k6.io/docs/javascript-api/k6-experimental/tracing/"&gt;k6 tracing&lt;/a&gt; (experimental module)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/grafana/xk6-kubernetes"&gt;xk6-kubernetes&lt;/a&gt; (extension)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://k6.io/docs/javascript-api/k6-experimental/redis/"&gt;k6 redis&lt;/a&gt; (experimental module)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/grafana/xk6-disruptor"&gt;xk6 disruptor&lt;/a&gt; (extension)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/img_3560-1.jpg" alt="Me presenting, with a slide containing my definition of emergence on the screen" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="abstract"&gt;Abstract&lt;/h2&gt;
&lt;p&gt;When we write load testing scripts against our applications, we write them sequentially: A, then B, then C. But this doesn&amp;rsquo;t accurately reflect the organized chaos of a system in production, nor does it prepare the system for the unexpected.&lt;/p&gt;
&lt;p&gt;Emergence is a phenomenon where parts of a whole independently develop properties not originally present in the whole. Emergence is what helps ant workers develop roles without leadership, prompts animals to evolve adaptive traits without forethought, and facilitates non-toxic communities without moderators.&lt;/p&gt;
&lt;p&gt;The growing field of emergent software applies this swarm logic to the programs that we write. What would it take to write emergent load testing scripts? It turns out that there are a few ingredients for emergence: a large population size, opportunities to interact, feedback, and an element of control.&lt;/p&gt;
&lt;p&gt;In this talk, Nicole van der Hoeven discusses how to bring these elements to load testing by writing a script in Grafana k6 that can independently decide what requests to make next, modify Kubernetes app pods, and disrupt services based on a continual feed of results during runtime&amp;ndash; all without manual intervention. She shows how to wield this new breed of load testing to improve confidence in the complex systems we build.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/img_3558.jpg" alt="Photo of the room while I was presenting" loading="lazy" decoding="async"&gt;
&lt;/p&gt;</description></item><item><title>k6 Javascript Ecosystem (k6 Office Hours #85)</title><link>https://nicolevanderhoeven.com/blog/20230407-koh85-k6-javascript-ecosystem/</link><pubDate>Fri, 07 Apr 2023 13:00:42 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20230407-koh85-k6-javascript-ecosystem/</guid><description>&lt;p&gt;Did you know that there is a k6 JavaScript ecosystem on top of the Go extension ecosystem? What&amp;rsquo;s the difference between the two? What does k6 actually support? What types of things can you do with JavaScript? In this k6 Office Hours, Software Engineer and k6 maintainer Mihail Stoykov joins me to talk all about the different options for k6 available through JavaScript libraries.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/UZ-1yXd4xkk?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Frontend vs. backend: How to plan your performance testing strategy</title><link>https://nicolevanderhoeven.com/blog/20230403-frontend-vs-backend-testing/</link><pubDate>Mon, 03 Apr 2023 13:20:53 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20230403-frontend-vs-backend-testing/</guid><description>&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://grafana.com/blog/2023/04/03/frontend-vs.-backend-how-to-plan-your-performance-testing-strategy/"&gt;here&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;There are many aspects of application performance, but they broadly fall into two categories: frontend performance and backend performance. As a tester, it’s important to know the differences between the two and how that impacts the way you approach your tests.&lt;/p&gt;
&lt;p&gt;In this blog, I’ll provide a high-level overview of frontend performance testing and backend performance testing, including pros and cons of each one. I’ll also explain why you need both if you really want a holistic view of how your application is performing.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/xVACRP5qIJI?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="why-and-where-to-use-frontend-performance-testing"&gt;Why (and where) to use frontend performance testing&lt;/h2&gt;
&lt;p&gt;Frontend performance testing verifies user experience &lt;a href="https://grafana.com/blog/2023/02/10/watch-how-to-pair-grafana-faro-and-grafana-k6-for-frontend-observability/"&gt;at the interface level&lt;/a&gt;. Basically, this entails everything a user sees when they access your web app, whether it’s on a laptop or other devices. This might involve automating user interactions with the site through the browser — for example, clicking on a button, filling out a form, or having scripts that load on the browser and run.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/crocs-r-cool.png" alt="mockup of a site called “Crocs R Cool”" loading="lazy" decoding="async"&gt;
&lt;em&gt;In frontend testing, you&amp;rsquo;re looking at how components of the UI respond.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The metrics we analyze for frontend performance tests are typically quite different from what we use for backend testing. Let’s say we want to know the time it takes for a page to render after a user clicks on a button that directs them there. This isn’t the same thing as measuring server response time; that total round trip takes a lot more into account — things like latency or the time it takes for a client-side script to run and display the requested information.&lt;/p&gt;
&lt;h3 id="advantages-of-frontend-performance-testing"&gt;Advantages of frontend performance testing&lt;/h3&gt;
&lt;p&gt;The great thing about frontend performance testing is that it provides a more realistic measurement of your end users’ experiences. They don’t care what’s going on under the hood; they care about the overall experience — and that’s exactly what frontend performance testing measures. Unlike backend performance testing, frontend performance testing looks at everything from a user’s point of view: from the time they visit a webpage to the time they can interact with something on that page.&lt;/p&gt;
&lt;p&gt;On top of that, most (about 80%) of the performance issues end users report are frontend issues. It doesn’t make much sense to skip this type of testing; it can be a critical step in finding ways to improve the overall user experience.&lt;/p&gt;
&lt;h3 id="disadvantages-of-frontend-performance-testing"&gt;Disadvantages of frontend performance testing&lt;/h3&gt;
&lt;p&gt;The most obvious disadvantage of frontend testing is that it doesn’t look under the hood. If you only do frontend testing, you’re almost certain to miss something. Maybe a component isn’t working, which is creating issues for your users. But you wouldn’t know that because you’re only testing what’s visible from the browser. In other words, you might be in the situation where you know something in the application is wrong and responding too slowly, but you don’t know what.&lt;/p&gt;
&lt;p&gt;Frontend performance testing can also be quite expensive compared to, say, protocol-based testing. That’s because you need enough resources (memory and CPU) to actually spin up a browser instance and interact with your application the way that a real user would. The same load generator that could run tens of thousands of backend virtual users may only be able to run 50 frontend virtual users before running out of resources.&lt;/p&gt;
&lt;p&gt;Finally, only testing frontend performance can sometimes lead to pretty misleading results, especially as you scale. As load increases, the response time for the frontend remains fairly constant, but that’s not the case with the backend.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/Frontend-Backend-LoadTesting.png" alt="graph plotting response time over the number of concurrent users for front-end and back-end" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;While the frontend component of response time remains more or less constant, the backend component of response time increases exponentially with the number of concurrent users.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This phenomenon occurs because most of the issues that frontend performance tests might identify, such as a slow-running client-side script, don’t tend to compound. It’ll be just as slow on each user’s computer regardless of how many users are running it. However, problems uncovered by backend performance testing are on the side of the application, not the users. If a database can’t keep up with 100 users sending queries to it, then 1,000 users sending it queries is likely to yield an even worse response time.&lt;/p&gt;
&lt;h2 id="why-and-where-to-use-backend-performance-testing"&gt;Why (and where) to use backend performance testing&lt;/h2&gt;
&lt;p&gt;As you might have guessed at this point, backend performance testing targets the infrastructure under the hood. This could be a database that contains customer information, a payment gateway, or an authentication service for customers that have already signed up. These are things that an end user doesn’t see and maybe isn’t ever even aware of, but they still have an effect on response times.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/backend.png" alt="graphic of application components" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Backend testing addresses infrastructure users might not even be aware of, like different databases, gateways, and services that underpin an application.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Scripting against the backend is quite different from scripting against the frontend. Instead of scripting user interactions like clicking, you’re scripting certain requests that are being sent on the protocol level. So, for example, you could have an HTTP GET request for the page and also for its embedded resources.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;http&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;k6/http&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;sleep&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;k6&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;default&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; () {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;http&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;https://test.k6.io&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;sleep&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The sample Grafana k6 script above is an example of a simplified backend performance test. It makes a single HTTP request to retrieve the contents of &lt;a href="https://test.k6.io"&gt;https://test.k6.io&lt;/a&gt;, and then waits one second.&lt;/p&gt;
&lt;p&gt;Backend performance includes things beyond just load times and latency. It includes scalability, availability, reliability, and similar attributes, so the metrics that we measure are different as well. We might look at server uptime or response times per component. We could also trace the path of a particular request through the application stack.&lt;/p&gt;
&lt;p&gt;An illustration shows that performance testing can address scalability, elasticity, availability, latency, resiliency, and reliability.
Application performance is more than just speed. Backend testing helps us verify many different aspects of performance.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/performance-ilities.png" alt="diagram of different types of performance" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Application performance is more than just speed. Backend testing helps us verify many different aspects of performance.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="advantages-of-backend-performance-testing"&gt;Advantages of backend performance testing&lt;/h3&gt;
&lt;p&gt;As we already discussed, frontend testing doesn’t cover everything, but it’s also more complicated than that. The 20% or so of performance bottlenecks that are backend-related can be the hardest to troubleshoot, identify, and fix. Even worse, a lot of backend performance issues can spiral out of control at higher levels of load and can be quite expensive to fix later on in a development cycle. The worst time to realize that you need to rethink your entire infrastructure is after it’s already failed in production. If you take care of backend performance testing earlier (commonly known as shifting left), it makes such pivots less costly.&lt;/p&gt;
&lt;p&gt;Another advantage of backend testing is the ability to target different components of an application. You can choose which API endpoint to hit and how hard, and you can target specific user flows, so it doesn’t always have to be end-to-end testing.&lt;/p&gt;
&lt;p&gt;And finally, backend performance tests tend to be less resource-intensive; they’re just protocol-level requests that can be easily ramped up.You don’t need to spin up a browser instance, or even parse through the Document Object Module (DOM) of a webpage or look for specific elements. It’s just a matter of sending these requests, and that’s something that you can increase the scale of pretty cheaply.&lt;/p&gt;
&lt;h3 id="disadvantages-of-backend-performance-testing"&gt;Disadvantages of backend performance testing&lt;/h3&gt;
&lt;p&gt;Backend performance testing won’t tell you anything about what’s happening on the frontend, and a lot of sites these days actually use scripts that have to run on the frontend. So with backend performance testing tools, you just download those scripts. But the response time they measure is the download time, which is not really realistic because those scripts are executed. A backend performance test would fetch the text of the script. A frontend performance test would run it — and that script might do something like perform a calculation. You need frontend performance testing to measure that properly.&lt;/p&gt;
&lt;p&gt;Backend performance testing is also much more expansive than front end performance testing, especially with microservices-based applications. There are so many components to track that it can be difficult to determine where to look. You can quickly find yourself going down a rabbit hole of constant, never-ending performance tuning.&lt;/p&gt;
&lt;h2 id="frontend--backend-testing-for-the-win"&gt;Frontend + backend testing for the win&lt;/h2&gt;
&lt;p&gt;So, as we’ve seen, frontend testing and backend testing both seem to have advantages and disadvantages. So which one should you use? Both, if at all possible! They look at different parts of application performance, so doing both is essential if you want a holistic view of user experience.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/frontend-vs-backend-meta.png" alt="diagram of k6 being used for both frontend and backend testing" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Software teams can use Grafana k6 to address frontend and backend performance testing.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;If you’re operating at a smaller scale, use your own discretion about how to find the right mix for needs. But if you’re testing at a larger scale with thousands of users and you want to test both the frontend and backend aspects of application performance, I suggest you change your test strategy so the majority of the load is generated with backend performance testing scripts. That’s because of the resource intensiveness of frontend performance testing scripts, which we discussed earlier.&lt;/p&gt;
&lt;p&gt;So, if you generate most of the load with the backend and then you have a handful of frontend performance testing scripts running in the background, you should still get a good idea of how both are performing. Remember, frontend application performance remains fairly constant throughout different levels of load, so you’ll still get a lot of useful insights on both types of performance without worrying too much about the scaling costs.&lt;/p&gt;
&lt;p&gt;Frontend and backend performance both affect what your end users think of your application. If the underlying application servers respond immediately to all requests, but then a huge picture of a crocodile makes your homepage excruciatingly slow to load, then users aren’t going to like that.&lt;/p&gt;
&lt;p&gt;On the other hand, if your homepage is really sleek and quick to load, but the application server hasn’t responded with the data that the browser needs to render, then users aren’t going to like that either.&lt;/p&gt;
&lt;p&gt;A common problem when testing both frontend and backend performance is script duplication: because of the differences in the two approaches, you often have to use two separate tools — which means two test suites and potentially two scripting languages. While this is a valid approach, it’s more sustainable to look for a tool that can target both types of performance, such as k6.&lt;/p&gt;
&lt;p&gt;Whichever tool(s) you end up using, testing both frontend and backend performance is going to give you the clearest view of how your application really performs.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The easiest way to get started with k6 is through Grafana Cloud k6. The free tier includes 500 virtual user hours/month for k6 testing and more. &lt;a href="https://grafana.com/auth/sign-up/create-user?pg=blog&amp;amp;plcmt=body-txt"&gt;Sign up for free now!&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;</description></item><item><title>How we got into tech (Adobo &amp; Avocados #01)</title><link>https://nicolevanderhoeven.com/blog/20230329-ana01-how-we-got-into-tech/</link><pubDate>Wed, 29 Mar 2023 14:54:43 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20230329-ana01-how-we-got-into-tech/</guid><description>&lt;p&gt;My friend &lt;a href="https://testingwithmarie.com"&gt;Marie Cruz&lt;/a&gt; and I have been wanting to talk about a few topics related to diversity in tech, and over the few years we&amp;rsquo;ve known each other, we&amp;rsquo;ve only added to that list. We finally decided to take a leap and start a new YouTube channel/video podcast just so we have a space to have those discussions. Here&amp;rsquo;s the first one, where we talk about how we got into tech.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/25Ba4Z694Gw?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Below is a transcript of our conversation.&lt;/p&gt;
&lt;h2 id="why-adobo--avocados"&gt;Why &amp;ldquo;Adobo &amp;amp; Avocados&amp;rdquo;?&lt;/h2&gt;
&lt;p&gt;MARIE: All right, we&amp;rsquo;re live. So, hey everyone, my name is Marie Cruz and with me I have my colleague today.&lt;/p&gt;
&lt;p&gt;NICOLE: Hi, I&amp;rsquo;m Nicole van der Hoeven, I&amp;rsquo;m her colleague. And I&amp;rsquo;m a little sick, but I&amp;rsquo;m here.&lt;/p&gt;
&lt;p&gt;MARIE: So we, today we&amp;rsquo;re actually gonna be doing the first ever recording for the Adobo and Avocados podcast. So we thought about this name and initially like Nicole and I wanted to, you know, ever since before we wanted to launch a podcast where we can talk about, you know, our experiences working in tech and all other things. And then we thought about the name Adobo and Avocado. So you know, to anyone who doesn&amp;rsquo;t know, so we&amp;rsquo;re both from the Philippines, and Adobo is the national dish of the Philippines. So that&amp;rsquo;s why we thought we&amp;rsquo;ll add the name of Adobo in our podcast title. Avocados, &amp;lsquo;cause we&amp;rsquo;re both Developer Advocates. But yeah, I think, why don&amp;rsquo;t we discuss like, why was it called avocados in the first place? Do you have any idea?&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah, well, we don&amp;rsquo;t really know for sure. So I thought that it was something to do with the language of it. Like, you know, an advocate is usually like a, could be like a lawyer in common non-tech senses. And the translation for that is abogado in Spanish or Tagalog actually,&lt;/p&gt;
&lt;p&gt;MARIE: Even in Tagalog.&lt;/p&gt;
&lt;p&gt;NICOLE: our native language.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: So it&amp;rsquo;s like kind of similar to avocado. I don&amp;rsquo;t know, that&amp;rsquo;s kind of what I thought.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah, that&amp;rsquo;s actually an interesting thought. Like, &amp;lsquo;cause the abogado does sound very, you know, similar to avocado, but I actually read this one article where I think their project manager had a hard time saying Developer Advocate, they ended up saying developer avocado. So who knows what the origin is. But yeah, I think it&amp;rsquo;s a great, you know, you know, term in terms of like, you know, the whole play, like playful, you know, meaning behind the word Developer Advocate.&lt;/p&gt;
&lt;h2 id="how-we-got-into-tech"&gt;How we got into tech&lt;/h2&gt;
&lt;p&gt;MARIE: So yeah, I guess first things first, like you know, who we are? Like, why are we doing this podcast? How, you know, we got into tech? So we&amp;rsquo;ll talk first about, I guess a bit of some introductions about ourselves. So Nicole, why don&amp;rsquo;t you start, like how did you get started? You know, what&amp;rsquo;s been your, I guess, background so far? Did you have a traditional, you know, computer science background or did you do like a different, I guess course back when you were still studying?&lt;/p&gt;
&lt;h3 id="nicoles-background"&gt;Nicole&amp;rsquo;s background&lt;/h3&gt;
&lt;p&gt;NICOLE: I did not have a traditional background. I grew up in the Philippines. I moved away when I was 18. And I don&amp;rsquo;t know what your experience was, Marie, but mine was that in the Philippines there are still, I think we do a pretty good job at being equal between genders, but I think there&amp;rsquo;s still gender roles. And when I was growing up, I really loved both the maths and sciences and like literature and languages, but I was very heavily pushed towards the humanities, &amp;lsquo;cause that&amp;rsquo;s what girls do. Girls don&amp;rsquo;t go into tech.&lt;/p&gt;
&lt;p&gt;MARIE: Mm-hmm.&lt;/p&gt;
&lt;p&gt;NICOLE: And so I really struggled at uni and in college. I shifted majors six times. I had no idea what I wanted to do.&lt;/p&gt;
&lt;p&gt;MARIE: Wow.&lt;/p&gt;
&lt;p&gt;NICOLE: And I went through, and that was over two countries. I went to the US to study as well. None of them was computer science because my brother was a developer. And I don&amp;rsquo;t know, he&amp;rsquo;s a little too introverted for me. And I just had this idea that, if I go into computer science, I have to be a developer, and if I&amp;rsquo;m a developer, I won&amp;rsquo;t talk to anyone. I&amp;rsquo;m just going to be&lt;/p&gt;
&lt;p&gt;MARIE: Yes.&lt;/p&gt;
&lt;p&gt;NICOLE: with a machine. Like I had that in mind, which now I know is completely wrong,&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: but that&amp;rsquo;s why I never went into it. So finally my parents were just like, we don&amp;rsquo;t care what you finish,&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: we don&amp;rsquo;t care if it&amp;rsquo;s basket weaving, just pick a major and finish it.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: And that was economics,&lt;/p&gt;
&lt;p&gt;MARIE: Oh.&lt;/p&gt;
&lt;p&gt;NICOLE: which I have never used in a job.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: And then so-&lt;/p&gt;
&lt;p&gt;MARIE: That&amp;rsquo;s really interesting. Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: And then I, how did I get into IT? I was applying for different economics related ones, and then I met my now husband and he,&lt;/p&gt;
&lt;p&gt;MARIE: Hi Rob.&lt;/p&gt;
&lt;p&gt;NICOLE: he was a test manager. Yeah, hi Rob! He was a test manager and I said, well what&amp;rsquo;s a test manager? And then he told me about the world of testing.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: And I didn&amp;rsquo;t understand it at first, but I wanted to know more. And then I thought the way that he described it sounded so interesting, like the idea that,&lt;/p&gt;
&lt;p&gt;MARIE: Mm-hmm.&lt;/p&gt;
&lt;p&gt;NICOLE: that there is a job, there is a person whose job it is to be the one using applications or products first. And then trying to see what&amp;rsquo;s wrong with it for the purposes of improving it. I just, I really loved that idea and it was another branch of tech that I didn&amp;rsquo;t know existed.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: So I started to, I did an ISTQB certification just to like have something&lt;/p&gt;
&lt;p&gt;MARIE: No background.&lt;/p&gt;
&lt;p&gt;NICOLE: &amp;lsquo;cause I didn&amp;rsquo;t have any background. Yeah. And I started job hunting, and somehow managed to land a performance testing job under someone who became my mentor.&lt;/p&gt;
&lt;h3 id="maries-background"&gt;Marie&amp;rsquo;s background&lt;/h3&gt;
&lt;p&gt;MARIE: Hmm, nice. Yeah, it&amp;rsquo;s really relatable because like similar with myself, I fall into tech accidentally. Like it was never my intention, you know, okay, I&amp;rsquo;m gonna study computer science, although I did actually have a computer science degree.&lt;/p&gt;
&lt;p&gt;NICOLE: Oh, wow.&lt;/p&gt;
&lt;p&gt;MARIE: But the story, the story behind that, I don&amp;rsquo;t share it too much to other people &amp;lsquo;cause I think the story behind it is a bit funny. But my first experience with tech is actually updating my MySpace profile. Do you remember MySpace?&lt;/p&gt;
&lt;p&gt;NICOLE: Yes.&lt;/p&gt;
&lt;p&gt;MARIE: Yes so, before you can customize your profile with a bunch of HTML, CSS codes and like I think before I was just trying to, you know, create something even though it didn&amp;rsquo;t look very accessible. I remember I had lots of animations, just lots of like&lt;/p&gt;
&lt;p&gt;NICOLE: Oh.&lt;/p&gt;
&lt;p&gt;MARIE: striking fonts, background music, and it was just something that I was doing for fun. I did a mass communications course back home in the Philippines. So I was majoring in digital media. And then I had to go back here in the UK. So I was working first for about two years before I decided to go back to uni. And during that time when I was looking at, you know, courses catalog, &amp;lsquo;cause I wasn&amp;rsquo;t really sure what to pick. So I saw a course which basically has three different things. So it&amp;rsquo;s computer science with business management and financial accounting.&lt;/p&gt;
&lt;p&gt;So I thought,&lt;/p&gt;
&lt;p&gt;NICOLE: Oh wow, okay.&lt;/p&gt;
&lt;p&gt;MARIE: I was like thinking in my head I think that sounds like a really cool name for a course, so I&amp;rsquo;m gonna go for it. So to me I just found the name like very interesting. And it means that-&lt;/p&gt;
&lt;p&gt;NICOLE: So when did you&lt;/p&gt;
&lt;p&gt;MARIE: Yeah?&lt;/p&gt;
&lt;p&gt;NICOLE: move out of the Philippines?&lt;/p&gt;
&lt;p&gt;MARIE: So I, so we went back 2008. So I was in the UK since 2004. Actually no, we went back 2006, and then I went back in the UK 2008. So 2006 I enrolled, you know, to study mass communications. I didn&amp;rsquo;t finish the course &amp;lsquo;cause I had to go back in the UK after two years because of like visa, like status. And then when I got back, I just put that into a pause, you know, did some work experience. So I was working as an office assistant for about two years and then my friend and I just decided, okay, I think we should go back to uni. So I actually applied as a mature student &amp;lsquo;cause I didn&amp;rsquo;t, you know, had any like actual qualifications &amp;lsquo;cause I never graduated from my degree in the Philippines. I never finished high school as well, &amp;lsquo;cause I kept going back and forth between the UK and the Philippines. So the last time I actually graduated was during middle school.&lt;/p&gt;
&lt;p&gt;NICOLE: Oh, wow.&lt;/p&gt;
&lt;p&gt;MARIE: but applying as a mature student, they just looked at my, you know, work credentials, like my work attitude. And I submitted some of my grades like back, you know, when I was still in the Philippines &amp;lsquo;cause like my first two years I had some, you know, grades from like the different subjects that I was doing. But yeah, that&amp;rsquo;s how I got into tech. I just found the name like really interesting and I thought before I could mix and match it with business and accounting. So even if the computer science bit didn&amp;rsquo;t work out, like I can still maybe utilize some of the things that I&amp;rsquo;ve learned on the business side and on the accounting side. And then, when I was about to look for graduate jobs, I got approached by a testing consultancy company. I didn&amp;rsquo;t, I wasn&amp;rsquo;t aware that there&amp;rsquo;s a graduate job for, you know, just doing testing &amp;lsquo;cause most of the graduate jobs that, you know, we were being offered is, you know, how to, you know, do like development, or like database like management roles. So initially I wasn&amp;rsquo;t really sure if I wanted to do the developer route. Like I enjoyed the coding, I was doing the coding bit, but like back then I wasn&amp;rsquo;t like fully 100% sure that it was the right path for me. So I found out that, yeah you can have a career in testing. Again this is all accidental &amp;lsquo;cause if that testing company didn&amp;rsquo;t approach me, I would&amp;rsquo;ve probably looked at like other roles. So it was like really great to hear that, yeah, there&amp;rsquo;s like a graduate jobs for just doing testing. And yeah, we were doing the ISTQB as well. So we were doing some training. And yeah, the rest is history. It&amp;rsquo;s funny because I didn&amp;rsquo;t intend to continue on a developer route, but then now I work as a Developer Advocate.&lt;/p&gt;
&lt;h2 id="how-did-we-become-developer-advocates-without-being-developers"&gt;How did we become Developer Advocates without being developers?&lt;/h2&gt;
&lt;p&gt;NICOLE: Yeah, maybe we should talk about that a bit &amp;lsquo;cause I also don&amp;rsquo;t consider myself as a developer even though I can code.&lt;/p&gt;
&lt;p&gt;MARIE: Mm-hmm. Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: And yet somehow we&amp;rsquo;re both Developer Advocates. How did that happen?&lt;/p&gt;
&lt;p&gt;MARIE: Yeah. It&amp;rsquo;s like there&amp;rsquo;s some sort of, I guess, interesting link between software testing and developer advocacy. I don&amp;rsquo;t know like if it&amp;rsquo;s the same for you, but like with me, I really enjoy the teaching part, the learning and public part as well. And when I was doing my role as a software tester, I felt that I was doing the advocacy, but maybe, you know, not really in a way that it&amp;rsquo;s very out there. So I was, you know, helping my colleagues, I was talking about tools that I&amp;rsquo;ve learned, you know, with them, I was showing them how to use it. And then while I was working as well, like I started doing the learning in public on the side. So I started with my personal blog and then getting involved, you know, with meetups to talk about, you know, the different tools that I&amp;rsquo;ve learned. So I guess for me, like being a software tester also, you know, encouraged me to, I guess be a Developer Advocate &amp;lsquo;cause I was just telling people what I&amp;rsquo;ve been doing as a software tester. I&amp;rsquo;ve been telling them what different tools I&amp;rsquo;ve been using, you know, different concepts that I&amp;rsquo;ve been learning as well on like a day-to-day. So is that the same for you?&lt;/p&gt;
&lt;p&gt;NICOLE: For me it was more because I was a consultant,&lt;/p&gt;
&lt;p&gt;MARIE: Mm-hmm.&lt;/p&gt;
&lt;p&gt;NICOLE: which means I was going on different projects all the time. And when you&amp;rsquo;re really new in an industry, I think it&amp;rsquo;s really exciting and you&amp;rsquo;re learning a lot. And certainly every project has like its own framework and different languages and different people, which is interesting for a while.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: But I don&amp;rsquo;t know, after several years of it, I started to feel like, people are actually asking the same questions. You know, there&amp;rsquo;s always, there&amp;rsquo;s some things that I always had to explain. You know, I always had to, for example, fight against the fact that performance testing is often seen as just something where you run the test, okay, you check the box, you&amp;rsquo;ve done performance testing.&lt;/p&gt;
&lt;p&gt;MARIE: Uh-huh.&lt;/p&gt;
&lt;p&gt;NICOLE: There&amp;rsquo;s always a certain amount of education where I&amp;rsquo;m like, no, it&amp;rsquo;s not just about checking the box, it can actually provide real value, here&amp;rsquo;s how.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: And I just found myself repeating a lot of the same things. And so I actually started to create videos also because load testing results are kind of difficult to explain sometimes.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: And I would create this like test summary report that lots of people don&amp;rsquo;t read.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: And so, as kind of an alternative way to explain things, I started creating video summaries to go along with it. And then I just thought, well maybe I can, &amp;lsquo;cause I can&amp;rsquo;t publish those, because it&amp;rsquo;s very specific to that company.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: But then I, I thought maybe I can pull out, I can abstract away some things and then publish those videos where I&amp;rsquo;m not talking about a specific project. And I guess that&amp;rsquo;s kind of how it started. I started, I put it into text first, because that&amp;rsquo;s just easier than video.&lt;/p&gt;
&lt;p&gt;MARIE: Mm-hmm.&lt;/p&gt;
&lt;p&gt;NICOLE: And then eventually found myself into video anyway.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: So I guess for me, I got into Developer Advocacy because I was tired of, I was trying to automate a part of my life, the explanation part where I kept having to say the same things and I just wanted to be like, hey, read this blog post where I explain why you need think time in a much more coherent and considerate way.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: So that&amp;rsquo;s, that&amp;rsquo;s how it naturally happened. I think you and I are the same in that regard that we were already doing it before we got the title.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah. I totally relate to that. Like, especially when you said that like, we&amp;rsquo;re just trying to solve the same problems. I started, you know, my blogging journey just trying to communicate like, you know, questions that people have been asking me on a day-to-day basis. And rather than just, you know, speaking to individual people and repeating the same things like again and again, like just put everything into a post or like you said like a video, and then just share that, you know, like to the public, &amp;lsquo;cause you&amp;rsquo;re not only gonna be able to help like one person but you know, maybe if someone else stumbled upon your blog or your video, then like, you might help them as well. I think like one of the, like, one of the best reward that I experienced when doing this like learning in public and you know, sharing more content out there is if you just get a message from someone or like a comment and then they say that, oh, like, I&amp;rsquo;ve been stuck with the same issue, I found your blog post or your video and it really helped me. And just that feeling that you know, you&amp;rsquo;ve helped someone is like a really great feeling. &amp;lsquo;Cause at first I wanted the blog as well just so that I can have something that I can look back to in case I, you know, forget like what I&amp;rsquo;ve done on a previous project. Like I can document it on a blog post, but then like now it&amp;rsquo;s also helping like other people who are experiencing the same like issues at work.&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah, I definitely see that. At first I was doing these things for myself because you know, you don&amp;rsquo;t really know that you know a subject until you can teach it to some degree. And I really believe that. And I, for me there were so many things &amp;lsquo;cause as a consultant, you have to switch tools very quickly, you have to switch languages, you have to be a polyglot on a lot of different levels and it&amp;rsquo;s impossible to keep all that in your mind. So after every project I tried to like, distill my learnings from it, so that I,&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: future me would come back to that framework, or tool, or whatever, and not be starting from zero. But yeah,&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: the kind of other people finding it was an unexpected boon.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah. So let&amp;rsquo;s just move on a bit. So we&amp;rsquo;ve talked about, you know, how we transition from software testing to developer advocacy. But I guess in terms of like the process, like did you apply to a lot of, you know, companies? Was developer advocacy something that, you know, you were aware of already, or like you just found a job description and then you&amp;rsquo;re like, oh, this is what I do already. Okay, let me apply to that job. So what&amp;rsquo;s been like the process for you?&lt;/p&gt;
&lt;p&gt;NICOLE: So I was, this is only, this is my first job as an actual, like the first job where I have Developer Advocate in my title.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: My previous job was with a, well at the time it was a startup, it was Flood.io, which is now acquired by Tricentis.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: And when I joined, I think I was like, I think the fifth person that they hired in the team.&lt;/p&gt;
&lt;p&gt;MARIE: Oh, wow.&lt;/p&gt;
&lt;p&gt;NICOLE: So it was very small. And it was, I really love that environment because you can do a lot of things, you can wear multiple hats. And that&amp;rsquo;s really where it started. On a typical day, I might be answering questions in support, or presenting at a conference or ducking into a sales call or like,&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: there were so many things that I could do. I was like part of the rotation for things going down basically, for things exploding. And I had to learn a lot about infrastructure as well to be competent in that role. And I started doing a lot of advocacy type things, mainly from a support perspective&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: because I got the same questions there as well. And I wanted to be able to focus on the crunchier topics.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: And you can&amp;rsquo;t do that unless you address some of the more basic or common questions. And then my manager at the time told me about Developer Advocacy&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: and my immediate response was, but I&amp;rsquo;m not a developer.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: He said that that&amp;rsquo;s just the name for the whole industry that I think you would be really good at and that you&amp;rsquo;re already doing. And with his encouragement, this is Tim Koopmans, the one of the co-founders of Flood, with his encouragement, strong encouragement by the way, things like, he said, oh, I&amp;rsquo;ve got this conference in Moscow that I&amp;rsquo;m speaking at. Do you wanna come watch me?&lt;/p&gt;
&lt;p&gt;MARIE: Right.&lt;/p&gt;
&lt;p&gt;NICOLE: And I said yes. And he backed out so I had to do it, things like that. Because of things like that that he did, I started to understand what developer advocacy is&lt;/p&gt;
&lt;p&gt;MARIE: Mm-hmm.&lt;/p&gt;
&lt;p&gt;NICOLE: and when it was, when I felt the time to change directions, I specifically looked at k6 actually. I didn&amp;rsquo;t apply to any other jobs because I was pretty happy where I was.&lt;/p&gt;
&lt;p&gt;MARIE: Mm-hmm.&lt;/p&gt;
&lt;p&gt;NICOLE: But I really loved k6. I had already not used it in a project, but I&amp;rsquo;d already, I knew what the tool was and I used it, I tested it a bit. I love the site, I love the principles behind it. And I saw that they had a Developer Advocate role. So,&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: It just kind of happened. How about you?&lt;/p&gt;
&lt;p&gt;MARIE: Well the first time I heard about the term was from you, when you said that, hey we&amp;rsquo;ve got this role for, you know like, you know like, we&amp;rsquo;ve got a Developer Advocate role for one of the tools that, you know, we&amp;rsquo;re gonna launch. Like, you&amp;rsquo;ll be like the great fit. So I didn&amp;rsquo;t really send any CV. I don&amp;rsquo;t think I sent any CV or like, yeah, I think, you just like, &amp;lsquo;cause we just connected already like via this Automation Guild conference. So like we were already connected via Twitter. And I think this is where like one of the benefits of like learning in public really came into play, &amp;lsquo;cause I was just, you know, publishing constantly. I was, you know, talking at various meetups and conferences already. But I was just doing all of this like as part of my, you know, side projects. Like it wasn&amp;rsquo;t part of my day-to-day role on my previous job. So when you explain to me what a Developer Advocate is, I&amp;rsquo;m like, oh yeah, I&amp;rsquo;ve been doing that on the side. So that was my first actual, you know, experience of like hearing what a Developer Advocate, you know, does on a day-to-day. &amp;lsquo;Cause I had the same perception that I&amp;rsquo;m not a developer, how can I be a Developer Advocate? But I think because as like as part of our day-to-day jobs, like even if we&amp;rsquo;re not writing application code, we&amp;rsquo;re still writing, you know, test scripts. we&amp;rsquo;re creating test automation frameworks. So I think that&amp;rsquo;s really helped as well transitioning into this role. But yeah, like I never sent any CV. I just remembered like we were talking a lot like back and forth and then I met up with, you know, a bunch of our colleagues now. And yeah, the rest is like history again.&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah, I think that there are just some people that when you meet them, you click or you don&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;MARIE: Mm-hmm.&lt;/p&gt;
&lt;p&gt;NICOLE: And when that click happens, I&amp;rsquo;m just like, okay, I&amp;rsquo;m gonna write her name down. I think I told you about it like for two years,&lt;/p&gt;
&lt;p&gt;MARIE: Yeah, I just joined-&lt;/p&gt;
&lt;p&gt;NICOLE: we were talking, and I was like, hey, this could happen&amp;hellip;&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah, I don&amp;rsquo;t know when. I think you&amp;rsquo;d be perfect for it. And you&amp;rsquo;re like, okay,&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: but it&amp;rsquo;s kind of early to be telling me, right?&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: I was like, Yeah, yeah, but let&amp;rsquo;s just keep in touch. You know, and it worked out. I can&amp;rsquo;t believe it actually did.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah. And now we&amp;rsquo;re, doing.&lt;/p&gt;
&lt;p&gt;NICOLE: We didn&amp;rsquo;t actually-&lt;/p&gt;
&lt;p&gt;MARIE: Yeah, go on Nicole.&lt;/p&gt;
&lt;p&gt;NICOLE: We haven&amp;rsquo;t actually defined what a Developer Advocate is.&lt;/p&gt;
&lt;h2 id="whats-a-developer-advocate"&gt;What&amp;rsquo;s a Developer Advocate?&lt;/h2&gt;
&lt;p&gt;MARIE: Yeah, I guess like we can both, you know, share what our, you know, view is of a Developer Advocate. So to me when it comes to developers, I guess trying out, you know, new tools or learning about new things, they feel most comfortable talking to someone who&amp;rsquo;s actually used, you know, the product, or you know, the tool that they want to use. So, we are, you know, that person. So we&amp;rsquo;re helping developers, we&amp;rsquo;re helping testers when it comes to, I guess learning about best recommended practices, learning about different tools. So we&amp;rsquo;re kind of like a bridge between the community and like the company that we work for. There&amp;rsquo;s a lot of misconception that people think that we&amp;rsquo;re salespeople but we&amp;rsquo;re actually not, like it&amp;rsquo;s a completely different, you know, role. We are focused more on the community side, helping them grow, helping them, you know, I guess in some ways, like be some sort of champions as well, so they can also promote like, you know, the different tools, the different practices that we have been communicating to them. But yeah, what about you? Is that like sort of the same concept?&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah, I agree with everything you said, especially about being a bridge.&lt;/p&gt;
&lt;p&gt;MARIE: Mm-hmm.&lt;/p&gt;
&lt;p&gt;NICOLE: Because as a Developer Advocate you&amp;rsquo;re not quite a developer, that&amp;rsquo;s not our primary responsibility,&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: but we&amp;rsquo;re also not like marketers or sales people. Although there&amp;rsquo;s an overlap there in both. I kind of think of it as anti-marketing. So a marketer is going to be talking about something that they themselves have never used, are not the target user for.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: And might not know much about in terms of the technical details.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: A Developer Advocate is someone who actually is the target user. So for those who don&amp;rsquo;t know, Marie and I work at Grafana Labs specifically on k6, which is a performance testing tool. But we have both used k6, we have both been testers and still are. And so there are things that we can suggest. Part of it is advocating internally.&lt;/p&gt;
&lt;p&gt;MARIE: Mm-hmm.&lt;/p&gt;
&lt;p&gt;NICOLE: We advocate for testers everywhere to the product team so that we say, like these are the features that we would be looking for as testers. Like we would say it this way or we wouldn&amp;rsquo;t really use that feature, we want this other one. But another part of it is advocating externally. So this is the part that people think of as marketing, but I think of it as anti-marketing, because we&amp;rsquo;re not going out there and saying, hey, you should use this product that we&amp;rsquo;ve never used before.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: Instead, we build cool things and demonstrate cool things that we have done, not some other developer.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: Like we do our demos,&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: And then when people ask us, then we say, oh yeah, we use k6. So I don&amp;rsquo;t know, marketing definitely has its place, but for me I am so addicted to that authenticity and genuineness that comes from just talking about a tool that you actually love, which is,&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: what k6 is for me.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah. I really like that because for me, an important part of, you know, this advocacy is, like communicating something that I truly believe in. Like I&amp;rsquo;m not going to advocate for, you know, a tool that I haven&amp;rsquo;t used. Like I would just feel like, you know, I&amp;rsquo;m a fraud if I do that. So if I know that, you know, there are situations where a certain tool or a certain practice, you know, would work better, then I would advocate for, you know, that as well. So it&amp;rsquo;s not just about, you know, for example, like at the moment we can&amp;rsquo;t do k6 for accessibility and I&amp;rsquo;m an accessibility advocate as well. So I would go and, you know, recommend like other tools and practices based on what like I&amp;rsquo;ve experienced, based on what I&amp;rsquo;ve done. And I think, like for me, that&amp;rsquo;s one of the biggest like advantage, &amp;lsquo;cause yeah, if I&amp;rsquo;ve been put on the spot and say, hey, you should talk about this to then promote it to other people, that would just totally go against my, like one of my beliefs.&lt;/p&gt;
&lt;p&gt;NICOLE: I think I also really appreciate that this position lets us shine a light on people like us who maybe,&lt;/p&gt;
&lt;p&gt;MARIE: Mm-hmm.&lt;/p&gt;
&lt;p&gt;NICOLE: who don&amp;rsquo;t look like the average person in tech. I know it&amp;rsquo;s still, I&amp;rsquo;ve been lucky to work with teams of mainly men that haven&amp;rsquo;t treated me any differently because I&amp;rsquo;m a woman, but there is still like a sense of being Other.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah And I guess that-&lt;/p&gt;
&lt;p&gt;NICOLE: And being in a position of advocacy means that we&amp;rsquo;re, we&amp;rsquo;re also able to appeal to other women who maybe didn&amp;rsquo;t, who didn&amp;rsquo;t have as good an experience as we did.&lt;/p&gt;
&lt;h2 id="what-can-you-expect-from-adobo--avocados"&gt;What can you expect from Adobo &amp;amp; Avocados?&lt;/h2&gt;
&lt;p&gt;MARIE: Yeah. And I guess that really leads to this next question. And you know, people who will watch this in the future might also ask like, what are the expectations like for this podcast? Like why are we doing this? So do you want to maybe start.&lt;/p&gt;
&lt;p&gt;NICOLE: Why ARE we doing this Marie?&lt;/p&gt;
&lt;p&gt;MARIE: Yeah. Oh, yeah. So do you wanna start like from your side, like what are the expectations that you know, that we can, yeah, share to people?&lt;/p&gt;
&lt;p&gt;NICOLE: Sure. I think that you and I both do a lot of technical advocacy. We, you know, do demos, we write scripts, and we tell people how to do things in tech, very technical things. But, I think that there&amp;rsquo;s a whole other side of tech that doesn&amp;rsquo;t get talked about and that&amp;rsquo;s like, things like interpersonal dynamics or cultural differences. You and I are both Europeans that have to work in, in our situation, predominantly American space, and we&amp;rsquo;re also Asian. So balancing the two, you know, we are on different sides of the spectrum on that. Just also the general stress that comes with tech. It is not easy, not just as a Developer Advocate, but just to be in tech to keep up with changing trends.&lt;/p&gt;
&lt;p&gt;MARIE: Mm-hmm.&lt;/p&gt;
&lt;p&gt;NICOLE: I feel like there are so many emotional aspects and psychological aspects that don&amp;rsquo;t get talked about that I would really like to cover.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: Then also, I kind of alluded to it. I would like to make it a little bit more open, an open discussion for particularly underrepresented people&lt;/p&gt;
&lt;p&gt;MARIE: Mm-hmm.&lt;/p&gt;
&lt;p&gt;NICOLE: like ourselves. We identify with several minority groups.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: And maybe help them along a bit by telling them things that we had to find out the hard way early on in our career. How about you?&lt;/p&gt;
&lt;p&gt;MARIE: Yeah. Yeah, I agree with all of those. And I guess it&amp;rsquo;s also to just have a safe space, you know, for everyone just to share their experiences in tech. Like you said, there&amp;rsquo;s this whole other side of tech that we don&amp;rsquo;t talk about that maybe other women are also uncomfortable to talk about, you know, with like, I guess other colleagues, especially if it&amp;rsquo;s just predominantly male. So we want to, you know, have a safe space for them, share, you know, I guess from their side, like their unique experiences as well. And maybe like we can all have, I mean maybe we also have those shared experiences that we don&amp;rsquo;t talk about, but then when someone says, oh yeah, I&amp;rsquo;ve experienced that too. So it&amp;rsquo;s just really finding, you know, shared experiences that we can all relate to. And like you said, just helping them, you know, or empower them to, I guess move forward in terms of like the next stage in their career. Like, you know, share what&amp;rsquo;s worked for us, share what hasn&amp;rsquo;t worked for us. &amp;lsquo;cause I think it&amp;rsquo;s all about like being authentic as well and not just talking about the good things, but we could also talk about the bad and the negative things as well.&lt;/p&gt;
&lt;p&gt;NICOLE: I&amp;rsquo;m excited to see where we go from here.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: I think we have a lot of ideas about where we&amp;rsquo;re going to take this and I hope people will come along for the ride.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah. So, yep. I guess this is it for the first episode. We are just, you know, extremely excited to do this on a regular basis. So we&amp;rsquo;ll talk about different, you know, topics in every episode. And we might, you know, have like really awesome, like guests as well in future episodes. So yeah, I guess just stay tuned and yeah, look out for Adobo and Avocados.&lt;/p&gt;
&lt;p&gt;MARIE: Thanks everyone. See you next time.&lt;/p&gt;
&lt;p&gt;NICOLE: Bye-bye.&lt;/p&gt;</description></item><item><title>Grafana Cloud k6 (k6 Office Hours #83)</title><link>https://nicolevanderhoeven.com/blog/20230324-koh-83-grafana-cloud-k6/</link><pubDate>Fri, 24 Mar 2023 18:00:00 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20230324-koh-83-grafana-cloud-k6/</guid><description>&lt;p&gt;With the release of Grafana Cloud k6, you can get observability and performance testing in the same platform. Senior Product Manager Mark Meier and Frontend Lead Simon Legander join me to talk about what Grafana Cloud k6 is, how you can use it, and demonstrate what it can do to improve your system&amp;rsquo;s reliability.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://grafana.com/products/cloud/k6/"&gt;Sign up to Grafana Cloud k6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grafana.com/docs/grafana-cloud/k6/"&gt;Learn more about Grafana Cloud k6&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/oIBNIsZaN_8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Introducing Grafana Cloud k6</title><link>https://nicolevanderhoeven.com/blog/20230321-introducing-grafana-cloud-k6/</link><pubDate>Tue, 21 Mar 2023 15:20:58 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20230321-introducing-grafana-cloud-k6/</guid><description>&lt;p&gt;Grafana Cloud k6 is a feature available to all users of Grafana Cloud. It allows you to run load and performance tests right from the comfort of your Grafana Cloud instance, without needing to create a separate account on k6 Cloud. Grafana Cloud k6 helps you get started quickly with a GUI Test Builder or with test scripts written in JavaScript, and then visualize your test results in real-time, alongside your other Grafana dashboards that monitor your system infrastructure. With Grafana Cloud k6, you can get a holistic look at your system&amp;rsquo;s performance&amp;ndash; on any environment.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://grafana.com/products/cloud/k6/"&gt;Sign up to Grafana Cloud k6&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://k6.io/docs/cloud/integrations/grafana-app/"&gt;Learn more about Grafana Cloud k6&lt;/a&gt;.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/OMh7bWk2qnQ?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Experimental modules in k6 (k6 Office Hours #82)</title><link>https://nicolevanderhoeven.com/blog/20230317-koh82-experimental-modules-in-k6/</link><pubDate>Fri, 17 Mar 2023 16:00:35 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20230317-koh82-experimental-modules-in-k6/</guid><description>&lt;p&gt;Experimental modules in k6 were released in v0.40, and new modules for distributed tracing and browser testing have been added since. In this video, k6 Senior Software Engineer Théo Crevon talks to Developer Advocates Marie Cruz and Nicole van der Hoeven about what experimental modules are and how to use them.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/0-dfzCUV7m4?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to Do Exploratory Testing for Performance (k6 Office Hours #79)</title><link>https://nicolevanderhoeven.com/blog/20230224-koh79-how-to-do-exploratory-testing-for-performance/</link><pubDate>Fri, 24 Feb 2023 23:01:26 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20230224-koh79-how-to-do-exploratory-testing-for-performance/</guid><description>&lt;p&gt;Marie Cruz and Nicole van der Hoeven talk about what exploratory testing is, why you should do it, and how to do exploratory testing to improve application performance. They discuss some heuristics to add structure and intention to exploratory testing for both frontend and backend performance.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/6wVwdlMwsJ8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Integrating k6 and Tracetest (k6 Office Hours #77)</title><link>https://nicolevanderhoeven.com/blog/20230203-koh77-integrating-k6-and-tracetest/</link><pubDate>Fri, 03 Feb 2023 08:00:15 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20230203-koh77-integrating-k6-and-tracetest/</guid><description>&lt;p&gt;Tracetest enables trace-based testing with assertions at any point within a request transaction. Using the xk6-tracetest extension, your k6 tests can launch deep testing by unlocking the power of OpenTelemetry.&lt;/p&gt;
&lt;p&gt;Join us as Developer Advocates Nicole and der Hoeven and Paul Balogh are joined by founder Ken Hamric and software engineer Oscar Reyes from Tracetest.&lt;/p&gt;
&lt;p&gt;Check out Tracetest:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tracetest.io/"&gt;site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kubeshop/xk6-tracetest"&gt;xk6-tracetest&lt;/a&gt;: repo for k6 extension&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.tracetest.io/tools-and-integrations/k6/"&gt;docs&lt;/a&gt; on how to use Tracetest with k6&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Dog70D7aVyg?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Frontend vs Backend Performance Testing</title><link>https://nicolevanderhoeven.com/blog/20230201-frontend-vs-backend-performance-testing/</link><pubDate>Wed, 01 Feb 2023 22:59:18 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20230201-frontend-vs-backend-performance-testing/</guid><description>&lt;p&gt;Which should you do: frontend vs. backend performance testing? The short answer is both. Each has its pros and cons, but hybrid load testing combines them and gives you the most holistic view of performance, including frontend concerns like how quickly a page renders or perceived application performance as well as backend concerns like response times of individual components.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/xVACRP5qIJI?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to Organize Testing Scripts in k6 (k6 Office Hours #76)</title><link>https://nicolevanderhoeven.com/blog/20230127-koh76-how-to-organize-testing-scripts-in-k6/</link><pubDate>Fri, 27 Jan 2023 17:00:10 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20230127-koh76-how-to-organize-testing-scripts-in-k6/</guid><description>&lt;p&gt;In this video, we talk about how to organize testing scripts in k6 using features like tags, groups, and functions depending on what type of testing you want to do with your test script. Developer Advocates Paul Balogh, Marie Cruz, and Nicole van der Hoeven show us a few examples of how they would organize and modularize scripts in a test suite.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/zDtEzp_JUOE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Introduction to Performance Testing</title><link>https://nicolevanderhoeven.com/blog/20230125-introduction-to-performance-testing/</link><pubDate>Wed, 25 Jan 2023 22:28:43 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20230125-introduction-to-performance-testing/</guid><description>&lt;p&gt;In this introduction to performance testing, we talk about how performance is part of the functionality of an application, why you should do performance testing, and some myths about performance that discourage teams from testing for it and make applications more likely to fail and fail miserably.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/FqOwO4y8SbA?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Guide to Load Testing Websites</title><link>https://nicolevanderhoeven.com/blog/20230112-load-testing-websites/</link><pubDate>Thu, 12 Jan 2023 17:12:42 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20230112-load-testing-websites/</guid><description>&lt;p&gt;&lt;em&gt;Original article &lt;a href="https://k6.io/docs/testing-guides/load-testing-websites/"&gt;here&lt;/a&gt;, written for k6.io&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This doc explains some key concepts about load testing websites, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The difference between backend and frontend performance testing&lt;/li&gt;
&lt;li&gt;When to choose between protocol-based, browser-based, or hybrid scripts&lt;/li&gt;
&lt;li&gt;Recommended practices about how to load test websites&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All load tests try to simulate real user traffic to prevent failures, improve reliability, and release new code with confidence.
But your approach to load testing must adapt to the type of application you want to test.&lt;/p&gt;
&lt;p&gt;In this guide, learn about strategies to test websites, including specific recommendations for complex scenario scripting and test execution.&lt;/p&gt;
&lt;h2 id="load-testing-approaches"&gt;Load testing approaches&lt;/h2&gt;
&lt;p&gt;When you approach the load test, first consider the following perspectives:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Backend vs. frontend performance&lt;/li&gt;
&lt;li&gt;Protocol-based, browser-based, or hybrid load testing&lt;/li&gt;
&lt;li&gt;Component testing vs. end-to-end testing&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="backend-vs-frontend-performance"&gt;Backend vs. frontend performance&lt;/h2&gt;
&lt;p&gt;Performance has a significant influence on the user experience of a website.&lt;/p&gt;
&lt;p&gt;For example, when users want to visualize or interact with some information, they expect the website to react quickly.&lt;/p&gt;
&lt;p&gt;To measure performance, testers often look at response times, which are affected by two main factors:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Frontend performance&lt;/li&gt;
&lt;li&gt;Backend performance&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="frontend-performance"&gt;Frontend performance&lt;/h3&gt;
&lt;p&gt;Frontend performance testing verifies application performance on the interface level, measuring round-trip metrics that consider how and when page elements appear on the screen. It&amp;rsquo;s concerned with the end-user experience of an application, usually involving a browser.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/frontend-rendering.png" alt="Snapshots over time of webpage elements rendering on a browser" title="Snapshots over time of webpage elements rendering on a browser" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Frontend performance testing excels at identifying issues on a micro level but does not expose issues in the underlying architecture of a system.&lt;/p&gt;
&lt;p&gt;Because it primarily measures a single user&amp;rsquo;s experience of the system, frontend performance testing tends to be easier to run on a small scale.
Frontend performance testing has metrics that are distinct from backend performance testing. Frontend performance tests for things like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Whether the pages of the application are optimized to render quickly on a user&amp;rsquo;s screen&lt;/li&gt;
&lt;li&gt;How long it takes a user to interact with the UI elements of the application.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some concerns when doing this type of performance testing are its dependency on fully integrated environments and the cost of scaling. You can test frontend performance only once the application code and infrastructure have been integrated with a user interface. Tools to automate frontend testing are also inherently more resource-intensive, so they can be costly to run at scale and are not suitable for high load tests.&lt;/p&gt;
&lt;h3 id="backend-performance"&gt;Backend performance&lt;/h3&gt;
&lt;p&gt;Backend performance testing targets the underlying application servers to see how they behave under production-like conditions. When it comes to websites, while frontend performance involves how assets included in the page are rendered, backend performance focuses on how those assets are processed by the application servers, served to users, and downloaded by browsers.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/backend-performance.png" alt="Backend components" title="Backend components of an application" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Backend testing is broader in scope than frontend performance testing. API testing can be used to target specific components or integrated components, meaning that application teams have more flexibility and higher chances of finding performance issues earlier. Backend testing is less resource-intensive than frontend performance testing and is thus more suitable for generating high load.&lt;/p&gt;
&lt;h3 id="which-one-should-you-test"&gt;Which one should you test?&lt;/h3&gt;
&lt;p&gt;It depends! Ideally, both.&lt;/p&gt;
&lt;p&gt;Frontend testing tools are executed on the client side and are limited in scope: they do not provide enough information about backend components for fine-tuning beyond the user interface.&lt;/p&gt;
&lt;p&gt;This limitation can lead to false confidence in overall application performance when the amount of traffic against an application increases. While the frontend component of response time remains more or less constant, the backend component of response time increases exponentially with the number of concurrent users:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/Frontend-Backend-LoadTesting.png" alt="Backend performance often contributes significantly to overall user experience" title="Backend performance often contributes significantly to overall user experience" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Testing &lt;em&gt;only&lt;/em&gt; frontend performance ignores a large part of the application, one more susceptible to increased failures and performance bottlenecks at higher levels of load.&lt;/p&gt;
&lt;p&gt;Testing &lt;em&gt;only&lt;/em&gt; backend performance, on the other hand, ignores &amp;ldquo;the first mile&amp;rdquo; of user experience and breadth. Backend testing involves messaging at the protocol level rather than interacting with page elements the way a real user would. It verifies the foundation of an application rather than the highest layer of it that a user ultimately sees.&lt;/p&gt;
&lt;p&gt;Testing both frontend and backend performance leads to the best overall performance and user experience for your application. Ignoring one or the other exposes you to performance bottlenecks that significantly decrease a user&amp;rsquo;s satisfaction with your application.&lt;/p&gt;
&lt;p&gt;However, if your testing is smaller in scope, you can choose to focus on either frontend or backend with the goal of eventually building a test suite that encompasses both.&lt;/p&gt;
&lt;h2 id="component-testing-vs-end-to-end-testing"&gt;Component testing vs. end-to-end testing&lt;/h2&gt;
&lt;p&gt;When you&amp;rsquo;re testing a web app, you may wonder whether how you structure your test scripts. Consider the following two methods.&lt;/p&gt;
&lt;h3 id="component-testing"&gt;Component testing&lt;/h3&gt;
&lt;p&gt;One way you could load test a web app is to load test its components. Maybe you know there are issues with a specific functionality due to previous production issues, or maybe you&amp;rsquo;d like to target components that are business-critical to reduce risk exposure.&lt;/p&gt;
&lt;p&gt;In these cases, the type of test you write may:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;be protocol-based&lt;/li&gt;
&lt;li&gt;call only those API endpoints that are relevant&lt;/li&gt;
&lt;li&gt;have smaller or no sleep/think time&lt;/li&gt;
&lt;li&gt;be focused on eventually stress testing a component or service or finding its breaking point&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Testing in this way is more flexible. With protocol testing, you can specify the endpoints or servers you&amp;rsquo;d like to hit, and narrow your test&amp;rsquo;s target that way. You can test specific functionalities while skipping others that come chronologically before it in a standard user flow. You can more finely control the type of traffic that is generated. If you&amp;rsquo;re recreating a specific mix of requests, you can script those requests and reproduce them in a repeatable manner.&lt;/p&gt;
&lt;p&gt;Doing component testing for load may not always require that your script behave like an end user. In fact, it may be necessary to artificially inflate traffic to more quickly reproduce issues, or to deflate traffic to reduce the noise in the logs. By the nature of this type of testing, scripts don&amp;rsquo;t contain the full flow of a request that you would expect to see in production, so realism is not a priority.&lt;/p&gt;
&lt;h3 id="end-to-end-testing"&gt;End-to-end testing&lt;/h3&gt;
&lt;p&gt;You could also do end-to-end testing against a web app. End-to-end testing seeks to replicate real user behaviour and track its effects across the entire stack. When doing end-to-end testing, you might:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;do protocol-level, browser-level, or hybrid load testing&lt;/li&gt;
&lt;li&gt;replicate the actions in a typical user flow&lt;/li&gt;
&lt;li&gt;think about the performance of the entire workflow as well as how long a request took to be processed by each component&lt;/li&gt;
&lt;li&gt;write scripts that access the application the same way users would, such as by browsing to the homepage before finding their way to other parts of the website&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This type of load testing is broader in scope than component testing, but shallower in terms of depth. With end-to-end testing, you get a better idea of the full user experience of the application as a whole. However, it can also be more complex to troubleshoot, as you have more components to monitor and more places to look for issues that are found.&lt;/p&gt;
&lt;p&gt;End-to-end testing is based on real user behavior, so it&amp;rsquo;s often important that end-to-end test scripts also be realistic.&lt;/p&gt;
&lt;h2 id="protocol-based-browser-based-or-hybrid-load-testing"&gt;Protocol-based, browser-based, or hybrid load testing&lt;/h2&gt;
&lt;p&gt;The decision of whether to test the frontend, backend, or both will also affect the type of load testing you should carry out and the kind of scripts you should write.&lt;/p&gt;
&lt;h3 id="protocol-based-load-testing"&gt;Protocol-based load testing&lt;/h3&gt;
&lt;p&gt;Protocol-based load testing verifies the backend performance of an application by simulating the requests underlying user actions. For websites, this commonly involves HTTP requests that bypass the user interface of your application and are sent directly to a server or application component.&lt;/p&gt;
&lt;p&gt;For example, a protocol-based load testing script might request all the resources on a webpage from the application servers, but those resources are merely downloaded. The response times reported by a purely protocol-based script do not include frontend metrics such as the time taken for images to render on a browser. The load is generated by simulating many requests sent to application servers.&lt;/p&gt;
&lt;p&gt;While protocol-based load testing may seem to lend itself better to component testing, you can also do end-to-end website testing with protocol-level scripts.&lt;/p&gt;
&lt;h4 id="sample-protocol-based-test-script"&gt;Sample protocol-based test script&lt;/h4&gt;
&lt;p&gt;The following is an example of a protocol-based load testing script in k6 that fetches the homepage, along with resources embedded into the page.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;http&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;k6/http&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;sleep&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;check&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;k6&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Homepage&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;params&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;sec-ch-ua&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#34;Chromium&amp;#34;;v=&amp;#34;94&amp;#34;, &amp;#34;Google Chrome&amp;#34;;v=&amp;#34;94&amp;#34;, &amp;#34;;Not A Brand&amp;#34;;v=&amp;#34;99&amp;#34;&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;accept-encoding&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;gzip, deflate, br&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;accept-language&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;en-GB,en;q=0.9&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 01. Go to the homepage
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;responses&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;http&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;batch&lt;/span&gt;([
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;GET&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;https://mywebsite.com/&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;params&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;GET&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;https://mywebsite.com/style.min.css&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;params&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;GET&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;https://website.com/header.png&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;params&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;GET&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;https://website.com/polyfill.min.js&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;params&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;check&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;responses&lt;/span&gt;, {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;Homepage loaded&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;r&lt;/span&gt;) =&amp;gt; &lt;span style="color:#a6e22e"&gt;JSON&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;stringify&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;r&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;includes&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;Welcome to my site&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;sleep&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 02. View products
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;responses&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;http&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;batch&lt;/span&gt;([
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;GET&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;https://mywebsite.com/products&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;params&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;GET&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;https://mywebsite.com/style.css&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;params&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;GET&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;https://website.com/product1.jpg&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;params&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;GET&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;https://website.com/product2.jpg&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;params&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;GET&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;https://website.com/displaylist.js&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;params&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;check&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;responses&lt;/span&gt;, {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;Products loaded&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;r&lt;/span&gt;) =&amp;gt; &lt;span style="color:#a6e22e"&gt;JSON&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;stringify&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;r&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;includes&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;Add to Cart&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;sleep&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="https://k6.io/docs/test-authoring/recording-a-session/browser-recorder/"&gt;Recording browser traffic&lt;/a&gt; helps you prototype to test websites on the protocol level.&lt;/p&gt;
&lt;h3 id="browser-based-load-testing"&gt;Browser-based load testing&lt;/h3&gt;
&lt;p&gt;Browser-based load testing verifies the frontend performance of an application by simulating real users using a browser to access your website.&lt;/p&gt;
&lt;p&gt;For example, a browser-based load testing script might include instructions to navigate to a page, click on a button, and type out text on a form. Those user actions then trigger underlying requests on the protocol layer, but only user actions are scripted in browser-based testing.&lt;/p&gt;
&lt;p&gt;Unlike protocol-based load testing, browser-based load testing scripts generate load by starting multiple instances of browsers and interacting with your application the way real users would. Testing at the browser level can also be the only option for testing Single-Page Applications where a lot of the application logic is executed by client-side scripts.&lt;/p&gt;
&lt;p&gt;Scripting on the browser level usually requires the use of different tools from the ones used to test at the protocol level.
However, k6 has an extension called &lt;a href="https://k6.io/docs/javascript-api/xk6-browser/"&gt;xk6-browser&lt;/a&gt; that allows the creation of browser-based test scripts alongside protocol-based ones.&lt;/p&gt;
&lt;h4 id="sample-browser-based-test-script"&gt;Sample browser-based test script&lt;/h4&gt;
&lt;p&gt;The following is an example of a browser-based load testing script in k6 using xk6-browser on a dummy website. Instead of making an HTTP request, the script views the homepage, then looks for and clicks on a link to the product page.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;chromium&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;k6/x/browser&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;sleep&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;k6&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;default&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; () {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;chromium&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;launch&lt;/span&gt;({ &lt;span style="color:#a6e22e"&gt;headless&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;newPage&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 01. Go to the homepage
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#66d9ef"&gt;goto&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;https://mywebsite.com&amp;#39;&lt;/span&gt;, { &lt;span style="color:#a6e22e"&gt;waitUntil&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;networkidle&amp;#39;&lt;/span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;then&lt;/span&gt;(() =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;waitForSelector&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;p[class=&amp;#34;woocommerce-result-count&amp;#34;]&amp;#34;]&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;screenshot&lt;/span&gt;({ &lt;span style="color:#a6e22e"&gt;path&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;screenshots/01_homepage.png&amp;#39;&lt;/span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;sleep&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 02. View products
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;element&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;$&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;a[class=&amp;#34;woocommerce-LoopProduct-link woocommerce-loop-product__link&amp;#34;]&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;element&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;click&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;waitForSelector&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;button[name=&amp;#34;add-to-cart&amp;#34;]&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;screenshot&lt;/span&gt;({ &lt;span style="color:#a6e22e"&gt;path&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;screenshots/02_view-product.png&amp;#39;&lt;/span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;sleep&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#66d9ef"&gt;finally&lt;/span&gt;(() =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;close&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;close&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="tips-for-writing-browser-level-scripts"&gt;Tips for writing browser-level scripts&lt;/h4&gt;
&lt;p&gt;The following steps can help you get started with a browser-level test script.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Script user actions, not requests.&lt;/strong&gt; Determine what a user might do for a particular task, and script interactions with elements on the browser level. For example, script what buttons the user clicks on.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Identify unique selectors.&lt;/strong&gt; Once you have identified which page elements a user interacts with, use the Element Inspector for DevTools in your browser to find a unique, static, and simple way to identify each element. The script needs selectors to find the right element to interact with.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use elements to verify responses.&lt;/strong&gt; After every action, use &lt;a href="https://k6.io/docs/javascript-api/xk6-browser/api/locator/"&gt;locators&lt;/a&gt; to search for elements on the page that you would expect to find. This verification helps ensure that the script has reached the expected page.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Take screenshots for every action while debugging.&lt;/strong&gt; One of the advantages of browser-based testing is the ability to take screenshots. After every user interaction the script simulates, use &lt;a href="https://k6.io/docs/javascript-api/xk6-browser/api/page/"&gt;page.screenshot&lt;/a&gt; to save a visual image of what the script encountered for later troubleshooting.&lt;/p&gt;
&lt;h3 id="hybrid-load-testing"&gt;Hybrid load testing&lt;/h3&gt;
&lt;p&gt;Hybrid load testing is a combination of protocol-based and browser-based load testing. While you can use two tools or two scripts to execute different types of load tests (one protocol-based and one browser-based), having both types of tests executed by the same script and the same tool is ideal. Aggregating results between different tools can be difficult at best and inconsistent at worst.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/hybrid-testing.png" alt="Hybrid of frontend and backend performance testing" title="In hybrid load testing, both the frontend and backend are tested" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;A best practice in hybrid load testing is to generate most of the load using the protocol-level test, and then to run a smaller number of the browser-level testing scripts. This approach:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;reduces the number of load generators needed, since protocol-level testing requires fewer machines to generate the same load&lt;/li&gt;
&lt;li&gt;measures backend and frontend performance in the same test execution&lt;/li&gt;
&lt;li&gt;provides a single source of aggregated output at the end&lt;/li&gt;
&lt;li&gt;reduces complexity in the creation and maintenance of scripts&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="scripting-considerations"&gt;Scripting considerations&lt;/h2&gt;
&lt;p&gt;When you script a test for a website, consider these recommendations.&lt;/p&gt;
&lt;h3 id="consider-factors-that-affect-script-realism"&gt;Consider factors that affect script realism&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Record your user journey.&lt;/strong&gt; Using the browser recorder can facilitate initial test script creation by capturing all the embedded resources on webpages. Check out the &lt;a href="https://k6.io/docs/test-authoring/recording-a-session"&gt;Session Recording guide&lt;/a&gt; to learn more about how to auto-generate your load test from a user session.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Correlate data.&lt;/strong&gt; Recordings often don&amp;rsquo;t take into account dynamic values that are generated anew each time a request is made. Go through the recorded requests and determine whether you need to &lt;a href="https://k6.io/docs/examples/correlation-and-dynamic-data/"&gt;extract values from previous responses&lt;/a&gt; and use parameters in subsequent requests. This practice ensures your VUs behave more like real users would.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Include or exclude static resources.&lt;/strong&gt; Determine whether you should include or exclude static resources on pages such as images, JavaScript, etc. Consider including them if you want to measure overall user experience. Consider excluding them if you are using a Content Delivery Network (CDN) that is under a separate Service Level Agreement (SLA).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Exclude third-party requests.&lt;/strong&gt; Don&amp;rsquo;t load test servers that you don&amp;rsquo;t own. Many applications make calls to third-party providers for authentication, social sharing, and marketing analytics. Disable these requests unless you have permission to include them in your tests.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use concurrent requests.&lt;/strong&gt; To mimic the way modern browsers download some requests in parallel, use &lt;a href="https://k6.io/docs/javascript-api/k6-http/batch/"&gt;batching&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Determine cache and cookie behaviour.&lt;/strong&gt; k6 automatically resets cookies between iterations, but you can also &lt;a href="https://k6.io/docs/using-k6/k6-options/reference/#no-cookies-reset"&gt;change this behavior&lt;/a&gt; if maintaining cookies would be more realistic.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use dynamic think time and pacing.&lt;/strong&gt; Consider adding varying &lt;a href="https://k6.io/docs/javascript-api/k6/sleep/"&gt;delays&lt;/a&gt; so you don&amp;rsquo;t artificially stagger a script with completely uniform delays.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use test data.&lt;/strong&gt; Real users typically don&amp;rsquo;t search for or submit the same data repeatedly. Consider adding a &lt;a href="https://k6.io/docs/examples/data-parameterization/"&gt;test data file&lt;/a&gt; for the script to iterate through.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Model test parameters and load profile after production.&lt;/strong&gt; In k6, you can use &lt;a href="https://k6.io/docs/using-k6/k6-options/how-to"&gt;test options&lt;/a&gt; to determine the exact shape and profile of your load test script. Select the appropriate &lt;a href="https://k6.io/docs/using-k6/scenarios/executors/"&gt;executors&lt;/a&gt; for the job.&lt;/p&gt;
&lt;h3 id="create-a-reusable-framework"&gt;Create a reusable framework&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Use tags and groups.&lt;/strong&gt; Organizing requests by &lt;a href="https://k6.io/docs/using-k6/tags-and-groups/"&gt;tagging and grouping them&lt;/a&gt; helps you consolidate like metrics and makes your test scripts more understandable by others.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use scenarios.&lt;/strong&gt; When combining protocol-based and browser-based tests, use &lt;a href="https://k6.io/docs/using-k6/scenarios/"&gt;scenarios&lt;/a&gt; to independently control their test parameters and &lt;a href="https://k6.io/docs/using-k6/scenarios/executors/"&gt;executors&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Modularize scripts.&lt;/strong&gt; Use &lt;a href="https://k6.io/docs/using-k6/modules/"&gt;modules&lt;/a&gt; to separate and organize functions for protocol-level testing and browser-level testing, and then use a test runner script to execute them. This approach means different scripts can be versioned and changed without affecting each other.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Integrate your tests into your CI pipeline.&lt;/strong&gt; Adopting a &amp;ldquo;tests as code&amp;rdquo; approach enables you to tie your load tests more closely into your project&amp;rsquo;s existing CI/CD processes, helping you get the most value out of every test.&lt;/p&gt;
&lt;h3 id="test-with-thresholds-in-mind"&gt;Test with thresholds in mind&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Create thresholds for both types of testing.&lt;/strong&gt; Some browser-level and protocol-level metrics cannot be combined because they don&amp;rsquo;t measure the same thing. Set &lt;a href="https://k6.io/docs/using-k6/thresholds/"&gt;thresholds&lt;/a&gt; for relevant metrics from both the browser-level script and the protocol-level one.&lt;/p&gt;
&lt;h3 id="when-possible-use-hybrid-load-testing"&gt;When possible, use hybrid load testing&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Use protocol-based scripts to generate majority of the load.&lt;/strong&gt; When writing the test scenario, use the protocol-based requests to simulate most of the traffic and use fewer VUs for the browser-based requests. Relying on the protocol-level traffic helps keep resource utilization on load generators down.&lt;/p&gt;
&lt;h2 id="execution-considerations"&gt;Execution considerations&lt;/h2&gt;
&lt;p&gt;When you run tests, consider the test environment and the load generator location.&lt;/p&gt;
&lt;h3 id="run-your-tests-in-the-appropriate-environment"&gt;Run your tests in the appropriate environment&lt;/h3&gt;
&lt;p&gt;Testing in pre-production environments and in production environments both add value.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Testing in pre-production environments&lt;/strong&gt; (staging, test, system integration testing, user acceptance testing, and production replica environments) enables you to identify performance defects early, which can save a lot of time and effort (and reputation) later on. Running in test environments also means you can often afford to be more aggressive with your tests. However, it&amp;rsquo;s also more critical to get your load profiles right, and the test results you get may not necessarily apply to production.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Testing in production&lt;/strong&gt; yields the most accurate results, but it&amp;rsquo;s also more risky. Often, testing production is the only feasible alternative. You can reduce the risk of impact to real customers while testing in production by using lower levels of load when running load tests during peak hours, schedule tests for off-peak hours, choosing load test types that are less risky, using techniques like synthetic monitoring that generate less traffic, using real user monitoring tools to get snapshots of user performance at load, and ensuring that your observability stack is working at peak efficiency.&lt;/p&gt;
&lt;h3 id="run-tests-where-your-customers-are"&gt;Run tests where your customers are&lt;/h3&gt;
&lt;p&gt;The location of the load generator(s), where the traffic is coming &lt;em&gt;from&lt;/em&gt;, can also have an impact on your test results. The question is: where are your end users located?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;On-premises load testing&lt;/strong&gt; can be ideal when testing early on in the development a website, or when there are machines that can be repurposed as load generators. However, testing entirely from within a corporate network may also yield false positives, in that response times reported are significantly lower than if the same application servers were accessed from across the country.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Load testing on the cloud&lt;/strong&gt; is an essential part of the testing strategy for many public-facing websites. Using load generators on the cloud gives you access to test in different states and geographical countries, creating a mix of load generators proportional to your users&amp;rsquo; locations. Cloud load generators are easier to provision and cheaper to maintain in the long run than on-premise ones. Load testing on the cloud can help you include the effects of network latency in your tests and yield results that are more realistic.&lt;/p&gt;
&lt;h2 id="recommendations"&gt;Recommendations&lt;/h2&gt;
&lt;p&gt;Here are some recommendations to help you plan, script, and execute your load tests for websites.&lt;/p&gt;
&lt;p&gt;If you want to test the last-mile user experience of your website:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;focus on &lt;strong&gt;frontend performance&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;write &lt;strong&gt;browser-based test scripts&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;and consider doing more realistic &lt;strong&gt;end-to-end&lt;/strong&gt; tests of the user flow.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you want to test the underlying infrastructure of your website:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;focus on &lt;strong&gt;backend performance&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;write &lt;strong&gt;protocol-based test scripts&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;and consider starting with &lt;strong&gt;component testing&lt;/strong&gt; and then gradually increasing the scope.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If your website is meant for internal or has limited access:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;on-premise load generators&lt;/strong&gt; located within the network that most of your users access the website from.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If your website is external and public-facing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;cloud load generators&lt;/strong&gt; in the load zones where your users reside.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Test in &lt;strong&gt;pre-production environments&lt;/strong&gt; when you can, but also consider &lt;strong&gt;testing in production&lt;/strong&gt; in a limited capacity.&lt;/p&gt;
&lt;p&gt;Load testing websites can be complex due to the number of viable testing approaches available, the scope for performance testing, and the potential effects of releasing undertested code. By following the recommendations we&amp;rsquo;ve put forward here, you can tailor your testing more closely to your objectives.&lt;/p&gt;</description></item><item><title>Distributed Load Testing Using Kubernetes With k6</title><link>https://nicolevanderhoeven.com/blog/20221118-koh72-distributed-load-testing-using-kubernetes-with-k6/</link><pubDate>Sun, 18 Dec 2022 15:54:07 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20221118-koh72-distributed-load-testing-using-kubernetes-with-k6/</guid><description>&lt;p&gt;My colleague Paul Balogh and I demonstrate how to run distributed load testing using Kubernetes with k6 and k6 operator. k6 can already run up to 40,000 virtual users from a single load generator, but if you want to scale that up further, you can use the Kubernetes operator to create a k6 custom resource within your cluster.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/5d5zxsGz8L4?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Observability Trends and Future Best Practices (k6 Office Hours #59)</title><link>https://nicolevanderhoeven.com/blog/20220812-koh59-observability-trends-and-future-best-practices/</link><pubDate>Fri, 12 Aug 2022 16:19:13 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220812-koh59-observability-trends-and-future-best-practices/</guid><description>&lt;p&gt;What are some observability trends and best practices in 2022 and going forward? Technical Program Manager Daniel González Lopes joins Developer Advocates Nicole van der Hoeven and Paul Balogh to chat about trending concepts and new areas of exploration in the field of observability. We&amp;rsquo;re going to talk about distributed tracing, continuous profiling, eBPF monitoring, and more!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/4NPCzt5eF9w?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How I Learn in Obsidian - Keeping up with tech trends</title><link>https://nicolevanderhoeven.com/blog/20220812-how-i-learn-in-obsidian/</link><pubDate>Fri, 12 Aug 2022 16:17:11 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220812-how-i-learn-in-obsidian/</guid><description>&lt;p&gt;Here&amp;rsquo;s how I learn in Obsidian by processing articles I&amp;rsquo;ve read into consolidated notes that help me understand technical concepts. I also show how I improve my learning by incorporating visual elements using Obsidian Excalidraw, Excalibrain, and Advanced Slides.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/6kzsCBKCl94?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Workload Modeling for Performance Testing (k6 Office Hours #57)</title><link>https://nicolevanderhoeven.com/blog/20220722-koh57-workload-modeling-for-performance-testing/</link><pubDate>Fri, 22 Jul 2022 17:00:05 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220722-koh57-workload-modeling-for-performance-testing/</guid><description>&lt;p&gt;What exactly is workload modeling for performance testing, and why is it so important? In this video, Leandro Melendez and I talk about the shape of your load profile, why increasing the number of users may not be enough, and how you can make your load tests more realistic.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/mWqlZAyRXr0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Creating k6 Scripts With the Browser Recorder and IDE</title><link>https://nicolevanderhoeven.com/blog/20220721-creating-k6-scripts-with-the-browser-recorder-and-ide/</link><pubDate>Thu, 21 Jul 2022 14:33:05 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220721-creating-k6-scripts-with-the-browser-recorder-and-ide/</guid><description>&lt;p&gt;In this video, I talk about creating k6 scripts with the browser recorder and by using your favorite IDE. Scripts in k6 can be created through the Test Builder on the k6 Cloud, but sometimes you just want to hit record instead of starting from scratch. Also in this video is a rundown on the basics of using the k6 CLI and some important commands for running tests locally and on the cloud&amp;ndash; right from your command line.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/jEfrw5x2Cbk?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to Be a Gish - API, browser, and chaos testing in one script (ExpoQA 2022)</title><link>https://nicolevanderhoeven.com/blog/20220601-how-to-be-a-gish-expoqa/</link><pubDate>Wed, 01 Jun 2022 14:06:49 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220601-how-to-be-a-gish-expoqa/</guid><description>&lt;p&gt;For the ExpoQA 2022 conference in Madrid, Spain, I presented a talk about how to be a gish. In this talk, I covered the following topics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;what a gish is, and how it applies to the field of testing&lt;/li&gt;
&lt;li&gt;how testing is a multidisciplinary field, and why generalists triumph over specialists in the face of uncertainty&lt;/li&gt;
&lt;li&gt;how the tool we choose to do our testing informs the type of testing and the type of results we get&lt;/li&gt;
&lt;li&gt;a hands-on example of how to do API load testing, browser automation, and chaos engineering in one script using a tool like &lt;a href="https://k6.io/"&gt;k6&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There was no recording of the conference talk, but here is a video of me going through my presentation beforehand:&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/aq0XSNcXDb0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;You can find the slides &lt;a href="https://slides.nicolevanderhoeven.com/2022-how-to-be-a-gish/#/"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And here are some photos from the event!&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/expoqa-3.jpeg" alt="Me speaking at ExpoQA 2022 in Madrid, Spain" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/expoqa-1.jpeg" alt="Me speaking at ExpoQA 2022 in Madrid, Spain" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/expoqa-4.jpeg" alt="Me speaking at ExpoQA 2022 in Madrid, Spain" loading="lazy" decoding="async"&gt;
&lt;/p&gt;</description></item><item><title>What Is Grafana Mimir? (k6 Office Hours #53)</title><link>https://nicolevanderhoeven.com/blog/20220506-koh53-what-is-grafana-mimir/</link><pubDate>Fri, 06 May 2022 17:00:28 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220506-koh53-what-is-grafana-mimir/</guid><description>&lt;p&gt;Maintainer Marco Pracucci talks about the new Grafana project, Mimir, a next-generation time-series database for Prometheus. He joins Developer Advocates Nicole van der Hoeven and Paul Balogh to talk about what Mimir is, why it was needed, and how he helped scale it using k6.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/2P1UViYf1mQ?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>API load testing using k6, with Tom Miseur (k6 Office Hours #52)</title><link>https://nicolevanderhoeven.com/blog/20220429-koh52-api-load-testing-using-k6/</link><pubDate>Fri, 29 Apr 2022 17:00:26 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220429-koh52-api-load-testing-using-k6/</guid><description>&lt;p&gt;In this second part of demonstrating the dogfooding we do at k6, I talk to Tom Miseur, Technical Specialist, who shows how he wrote API load testing scripts with k6 to test k6 Cloud&amp;ndash; and what his results were after his testing.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/D8Ax-ONLJLo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>End-to-end browser testing using xk6-browser, with Thomas Wikman (k6 Office Hours #51)</title><link>https://nicolevanderhoeven.com/blog/20220422-koh-51-end-to-end-browser-testing-with-k6/</link><pubDate>Fri, 22 Apr 2022 17:00:12 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220422-koh-51-end-to-end-browser-testing-with-k6/</guid><description>&lt;p&gt;Have you ever wondered how to test a platform built for testing other products? Our frontend developer, Thomas Wikman, joins us on k6 Office Hours to talk about his experience being a user of one of our tools - xk6-browser - and how he uses it to test the entire k6 Cloud frontend.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/UtMJfasNjSY?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Qué es k6</title><link>https://nicolevanderhoeven.com/blog/20220421-que-es-k6/</link><pubDate>Thu, 21 Apr 2022 16:00:51 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220421-que-es-k6/</guid><description>&lt;p&gt;En este video hablo con mi colega de trabajo, &lt;a href="https://twitter.com/dgzlopes"&gt;Daniel Gonzáles Lopez&lt;/a&gt;, sobre qué es k6 y cómo usarlo para hacer pruebas de carga.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/GQlin3QXSrU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to Run a Load Test With the k6 Cloud Test Builder</title><link>https://nicolevanderhoeven.com/blog/20220412-how-to-run-a-load-test-with-the-k6-cloud-test-builder/</link><pubDate>Tue, 12 Apr 2022 17:00:48 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220412-how-to-run-a-load-test-with-the-k6-cloud-test-builder/</guid><description>&lt;p&gt;In this video, I demonstrate how to create and run a load test from scratch without coding, using k6 Cloud&amp;rsquo;s Test Builder. k6 Cloud is a load testing platform as a service, and you can run 50 &lt;a href="https://app.k6.io/account/register"&gt;free load tests on the cloud here&lt;/a&gt;.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/3ZFGyp-gHoA?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Load testing results in the k6 Cloud App for Grafana, with Edgar Fisher (k6 Office Hours #49)</title><link>https://nicolevanderhoeven.com/blog/20220408-koh-49-load-testing-results-in-k6-cloud-app/</link><pubDate>Fri, 08 Apr 2022 18:00:18 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220408-koh-49-load-testing-results-in-k6-cloud-app/</guid><description>&lt;p&gt;There are many ways to get k6 load testing results into Grafana, but our frontend software engineer, Edgar Fisher, talks to us about the easiest way of them all: the new k6 Cloud App for Grafana.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/bt6civUmHUU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>TestOps Ask Me Anything on Devops Toolkit</title><link>https://nicolevanderhoeven.com/blog/20220407-testops-ama-on-devops-toolkit/</link><pubDate>Thu, 07 Apr 2022 18:00:30 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220407-testops-ama-on-devops-toolkit/</guid><description>&lt;p&gt;I joined my friend Viktor Farcic on his channel, DevOps Toolkit, to do an Ask Me Anything on the topic of TestOps.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/IRAa81s3WQQ?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;We ended up talking a lot about &lt;a href="https://k6.io"&gt;k6.io&lt;/a&gt;, different &lt;a href="https://grafana.com"&gt;Grafana Labs&lt;/a&gt; open-source projects, and what performance testing has to do with DevOps and Site Reliability Engineering.&lt;/p&gt;</description></item><item><title>Building Reliable Systems With k6 (k6 Office Hours #48)</title><link>https://nicolevanderhoeven.com/blog/20220401-koh48-building-reliable-systems-with-k6/</link><pubDate>Fri, 01 Apr 2022 10:02:29 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220401-koh48-building-reliable-systems-with-k6/</guid><description>&lt;p&gt;In this week&amp;rsquo;s k6 Office Hours, my colleague Pandurovic, an engineering manager/backend lead at k6, joined &lt;a href="https://twitter.com/javaducky"&gt;Paul Balogh&lt;/a&gt; and me to talk about how k6 works on the backend, and how the backend team is working to make it even more reliable.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Eex7KHNaxeU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to Analyze Load Testing Results with k6 (k6 Office Hours #47</title><link>https://nicolevanderhoeven.com/blog/20220325-koh47-how-to-analyze-load-testing-results-with-k6/</link><pubDate>Fri, 25 Mar 2022 18:00:56 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220325-koh47-how-to-analyze-load-testing-results-with-k6/</guid><description>&lt;p&gt;In this k6 Office Hours, Paul Balogh and I discuss the different ways to turn k6 metrics into graphs for analyzing performance testing results.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/IW7I_vWV93A?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to Process Notes in Obsidian // Readwise Official Obsidian plugin</title><link>https://nicolevanderhoeven.com/blog/20220323-how-to-process-notes-in-obsidian-with-readwise/</link><pubDate>Wed, 23 Mar 2022 16:00:28 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220323-how-to-process-notes-in-obsidian-with-readwise/</guid><description>&lt;p&gt;How do you process notes in Obsidian? I demonstrate how to use the Readwise Official Obsidian plugin to go from raw content to notes in a Zettelkasten-like Obsidian vault. &lt;a href="https://readwise.io/nicole"&gt;Sign up for Readwise using my link&lt;/a&gt; and get double the trial period.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Rw1L5sxlnuU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Note: This post contains an affiliate link for &lt;a href="https://readwise.io/nicole"&gt;Readwise&lt;/a&gt;. Clicking on that link will give you a two-month trial of Readwise, double the usual amount, and they give me a small percentage if you sign up for a plan. Check out &lt;a href="https://nicolevanderhoeven.com/ethics/"&gt;My Ethics Statement&lt;/a&gt; to see my standards for promotions.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Obsidian Dataview, building a second brain, and more about me // Q&amp;A Livestream</title><link>https://nicolevanderhoeven.com/blog/20220319-obsidian-dataview-livestream/</link><pubDate>Sat, 19 Mar 2022 17:42:54 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220319-obsidian-dataview-livestream/</guid><description>&lt;p&gt;In celebration of reaching 1000 subscribers &lt;a href="https://youtube.com/nicolevanderhoeven"&gt;on my personal channel&lt;/a&gt;, I did a live Q&amp;amp;A where I demonstrated how to use Obsidian Dataview, my personal philosophy about building a second brain, and how I stay organized.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/6pGdU4e3A6s?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to Make Kubernetes Clusters Production Ready using Crossplane, with Viktor Farcic (k6 Office Hours #46)</title><link>https://nicolevanderhoeven.com/blog/20220318-koh46-how-to-make-kubernetes-clusters-production-ready-with-crossplane/</link><pubDate>Fri, 18 Mar 2022 17:30:45 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220318-koh46-how-to-make-kubernetes-clusters-production-ready-with-crossplane/</guid><description>&lt;p&gt;In this video, Viktor Farcic, Paul Balogh and I talk about how to make Kubernetes clusters production-ready. Viktor is a Developer Advocate from &lt;a href="https://www.upbound.io/"&gt;Upbound&lt;/a&gt;, and he demonstrates a solution that ties together &lt;a href="https://crossplane.io"&gt;Crossplane&lt;/a&gt;, &lt;a href="https://grafana.com"&gt;Grafana&lt;/a&gt;, &lt;a href="https://prometheus.io"&gt;Prometheus&lt;/a&gt;, and &lt;a href="https://grafana.com/oss/loki/"&gt;Loki&lt;/a&gt; to deploy and manage clusters in production.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/cPVrCNhHo7Q?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Load Testing for DevOps with Victor Farcic (k6 Office Hours #45)</title><link>https://nicolevanderhoeven.com/blog/20220311-koh45-load-testing-for-devops/</link><pubDate>Fri, 11 Mar 2022 11:12:52 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220311-koh45-load-testing-for-devops/</guid><description>&lt;p&gt;How can you use load testing for DevOps? What kind of performance testing can or should be included in CI/CD pipelines? Viktor Farcic from Upbound and DevOps Toolkit join Nicole van der Hoeven and Paul Balogh to discuss how he sees k6 fitting into the daily duties of a DevOps engineer.&lt;/p&gt;
&lt;p&gt;{{ youtube xUlNdsr6y_E }}&lt;/p&gt;</description></item><item><title>Postman for load testing using k6, with Tim Haselaars (k6 Office Hours #43)</title><link>https://nicolevanderhoeven.com/blog/20220225-koh43-postman-for-load-testing-using-k6/</link><pubDate>Fri, 25 Feb 2022 18:00:11 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220225-koh43-postman-for-load-testing-using-k6/</guid><description>&lt;p&gt;&lt;a href="https://www.postman.com/"&gt;Postman&lt;/a&gt; is a near-ubiquitous tool for anyone doing API testing, and many teams use collections to create and organize complicated test suites. However, there&amp;rsquo;s one thing that Postman isn&amp;rsquo;t good at: load testing. That&amp;rsquo;s where k6 comes in.&lt;/p&gt;
&lt;p&gt;In this video, &lt;a href="https://twitter.com/timhaselaars"&gt;Tim Haselaars&lt;/a&gt; joined k6 Office Hours to talk to &lt;a href="https://twitter.com/javaducky"&gt;Paul Balogh&lt;/a&gt; and me about how to use Postman collections to run load tests using k6.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Be66Db4wHLA?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="transcript"&gt;Transcript&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Hello everyone and welcome to another k6 Office Hours. I am Nicole van der Hoeven and today I have two guests. One of them may already be familiar to you, Paul Balogh.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Hey everyone.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And our special guest is Tim Haselaars. Tim, would you like to introduce yourself?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Okay, hi, nice to meet you Nicole and Paul. I am Tim Haselaars. I&amp;rsquo;m living in Belgium. I&amp;rsquo;m a product manager, and I work at the marketing automation company called Selligent. I have a passion for APIs. I love music, I&amp;rsquo;m a DJ as well in my spare time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oh, nice.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And if I still have some spare time left, I like to contribute to a number of open source projects, which the Postman-to-k6 is one of the projects I&amp;rsquo;ve been working on together with the k6 team in the past. So that&amp;rsquo;s a bit of why I&amp;rsquo;m here today. So nice to meet you both.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, that&amp;rsquo;s a pretty big if though, if you have time, you&amp;rsquo;re a DJ.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It&amp;rsquo;s a hobby thing, but I&amp;rsquo;m really proud of it actually, because I&amp;rsquo;ve been playing a lot, and there&amp;rsquo;s one festival in Europe, Tomorrowland, I&amp;rsquo;ve been playing it each year for the past 10 years.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oh, wow.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So it&amp;rsquo;s a small stage, but I&amp;rsquo;m really proud of it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nice.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Well, that is awesome. You should be proud of that. I think that kind of makes sense, because product management is such a multidisciplinary role as well. Like, it&amp;rsquo;s not all technical, and it&amp;rsquo;s not all people skills. It&amp;rsquo;s a mixture of both, and a lot of other things.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, that&amp;rsquo;s also what keeps it interesting, at least for me, what keeps it interesting, actually, so yeah.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So what do you typically do in your current job, and what does it have to do with k6?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Okay, in my current job, I&amp;rsquo;m a product manager, so we have a digital platform, marketing automation platform and I&amp;rsquo;m spearheading the API renewal program. So we had a number of APIs in our company which customers use to connect and exchange data with marketing data, and we&amp;rsquo;re renewing that, and performance is critical, because we have a number of really big customers in Europe, or , the Dutch luxury brand, and we talk about huge volume, so our APIs has to be scalable, and performant, and we use k6 to guarantee that we keep them up to standard, actually. So that&amp;rsquo;s what we do. And my role there is to make sure the teams, I help with the API design, and I check with the teams, and I document stuff together with the teams, we try to do that. So what I&amp;rsquo;m going to talk about is also my experience with k6 and the way we use it at the company a bit more.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Awesome.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cool, so how did you first start, what made you start to use k6? Did you try other things before that?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yes. In a previous job, a couple of years ago, I was working at a hosting company, and they were doing a, there was an anniversary of the national lottery, it&amp;rsquo;s like the lottery company, so it had,, they expected a lot of visitors to the website, and we wanted to make sure the hosting was up to par, and it was able to handle the volumes. And I tried to test it, performance test it, load test it, and I used Jmeter, and the experience was, I struggled a lot with it. And I started browsing for another solution, and then I hit, I found k6. text was really nice. You could really quickly start nice documentation, and that&amp;rsquo;s how I rolled into k6. And then I shifted jobs, and at the current job, I said we have to use k6, because it&amp;rsquo;s so much easier than using JMeter. You can script it, you can automate it, and that&amp;rsquo;s it, yeah. I used it once, and never looked back.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So nice, with the automation, did you put hook that in your CI/CD pipeline as well?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yes we do. I can, I have a diagram. Like, I&amp;rsquo;m really proud of it. Maybe I&amp;rsquo;m a bit, how do you say, biased by it, but I&amp;rsquo;m really proud of what we&amp;rsquo;ve achieved with the automation aspect actually. And we came from a far away, a far place, but now, we have a nice automated flow, actually.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;That&amp;rsquo;s awesome.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Which I hope I can showcase a bit later on in the talk.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, I&amp;rsquo;d love to see it. And do you use k6 Cloud or k6 OSS?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We had used Cloud in the past, I think right now, my team are mostly using the OSS version of it. I don&amp;rsquo;t know why. I have to check with them, actually, but I think we had a number of dashboards set up, and they were a bit detailed to what we need, or what I needed at least, and that&amp;rsquo;s why I think we stick with, for now we stick with the OSS version of k6.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Okay, awesome. So I guess people might be wondering, seeing the title of this video, what Postman has to do with either Selligent or k6.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, actually that&amp;rsquo;s a story I want to tell, how did we ended up with k6, and the whole story. So what typically happens if you start developing an API is you build your API, and then you want to test it, you want to play around with it. You want to experiment with it. And the first thing that you do as a non-technical user like, I take Postman. Postman is an application where you can model your request in a nice tool, and then you can just fire them. You don&amp;rsquo;t have to a curl script, or you don&amp;rsquo;t have to use any CI tools for making API calls. So that was the logical step. So we build an API, I want to experiment, play around with it, so we ended up using Postman for it. But maintaining Postman is not so easy when you go for automation flows. And then when you want to take a step further, if you want to do performance tests, that&amp;rsquo;s another a thing. And yeah, that&amp;rsquo;s why I think we went from what we did to Postman just the next, as a first phase. But sooner, the more end points we have, the more we wanted to test and the more we wanted to play around with it, the bigger everything became. So that&amp;rsquo;s why, yeah, we wanted to make it an automation level and make it a bit more streamlined so that the manual work would go down a lot.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sounds like you have a fan out in the viewers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah. I like to make things visual, because it helps me visualize my thoughts and everything. So yeah.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve used Postman before. I think it&amp;rsquo;s almost ubiquitous now for anyone who&amp;rsquo;s doing any sort of API testing. I think at some point people would&amp;rsquo;ve used Postman just because it is very easy to get started, but I do, I have also run across some of the issues that you describe when you&amp;rsquo;re scaling up, when you have a very complex test suite or you want to have one, it is, I think I personally still like the scripting approach of being able to have the full, you know, being able to have condition loops and that sort of thing. There&amp;rsquo;s still a lot more flexibility when, when you&amp;rsquo;re just dealing with pure code. But I know that I think it was, I mean, relatively recently when I started using Postman, it was just firing off requests, and it was like a single user kind of thing, but what are the features available for performance testing for Postman, you alluded to it, them, and you said that maybe they&amp;rsquo;re not, they weren&amp;rsquo;t exactly what you were looking for.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No, no. Maybe I should quickly show a bit how I&amp;ndash;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, sure.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Work with it if that&amp;rsquo;s okay for you. Okay, I&amp;rsquo;m gonna showcase my, so well, just as a reference, I created fake endpoint and I was set up a Postman collection. So what you do typically in Postman is you have an API that you define. In our case, I created a k6 office hour CRM API, just plain and simple where you can see, yeah, you could see some context you potentially want to interview in the future, and you model them. So you have your endpoint, you just put them in. You say, it&amp;rsquo;s a get post, put, whatever you need, and then you can just fire it and it&amp;rsquo;s response. And so this is an actual API request happening behind the scenes. That&amp;rsquo;s really nice because as a non-technical user, you don&amp;rsquo;t have to have any technical expertise. You just enter the endpoint percent and you&amp;rsquo;re up and running. But it also has some nice features if you want to make complex things, like you said, Nicole, if you want to use variables, because you might want to experiment with your API endpoints in different environments, so you can use variables. That&amp;rsquo;s what they use with the curly brackets here. So it&amp;rsquo;s a base URL. So I can shift around so if I want to switch, I have potentially two environments. I have a production one and a dev one. I can easily switch between them and then the variables will also switch along. That&amp;rsquo;s a really nice thing to do with Postman. The next thing, what I really like about Postman is that you can use it to create cruds and you can create flows with it. So it&amp;rsquo;s really straightforward. So if you say, I want to create one item and then I want to use the item in my detailed call in my, so I have all leads, create a lead and I want to get the leads, so this is the end point, you could just define it as a variable. You could say, I want to, that this lead ID can be used to fetch the right lead ID. So if you create one, that&amp;rsquo;s the body, I do a post request. And what happens is you get a new ID back, which is unique because I just created a new contact in our CRM application. And you can use scripting in Postman to say, ah, there is a data response, and I&amp;rsquo;m gonna store that response in my lead ID variable. So it allows some scripting within a GUI which is really nice, and it also allows you to define tests. Like I want to check what&amp;rsquo;s the response. It should be 200. You can define a Postman test. They use a bit of assertion, kind of syntax for that. So what started out as something really straightforward, I wanted to just test and play around with it, experiment of the endpoints. It became much more. And we started building like a full suite out of Postman, in Postman itself, a test suite. And that&amp;rsquo;s really cool because as a non-technical user, you could just share this collection with anybody on the team and they could just run the same request and play around with it. You can even pass it on to partners or colleagues or customers, when they say, when they want to use your API, you can just say, ah, you can use a Postman collection to play around with it. And another nice thing about Postman is that you can run scenarios, like I said, and you can run them at scale. So right now I&amp;rsquo;m doing get leads, creating a lead. Then I&amp;rsquo;m gonna fetch the lead that I just created. So I created Elon Musk as a user. I can update that one as well. So I can put a body and touch and I can even delete it. So if I would run this in a cycle, I would test actually the whole flow of a typical crud operation. You can fetch one, create one, edit one, delete one, and then it&amp;rsquo;s back to normal again. And so lemme talk about, yeah, sorry.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Sorry, I just wanted to, sorry to interrupt, but would it be possible to try and zoom here in this one to see if you can make it just a little bit bigger?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] Okay, something like that?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Yes. Thank you. Sorry.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] No, no, no worries. So what you can do Postman, if we talk about test automation, you can just say, I want to run all these, these API requests in the sequence, like they&amp;rsquo;re organized here, and you can just run them. So if you run them, you see you put in some test, this one is a success, success, creation successful. And so actually testing if your API&amp;rsquo;s responding as you expected, but you cannot test it at scale or at high volume. The only thing you could do in Postman is if I press run, I could define a number of iterations. So if I would say, I want to do 10 iterations, I&amp;rsquo;m just gonna run them now, so you can see, you can see it just creates blocks. but while I&amp;rsquo;m talking, it took to run all these 10, five times 10 requests, it took me, let&amp;rsquo;s say one minute to run. So we cannot really test at scale if, that&amp;rsquo;s not the use case of Postman. The use case of Postman is to experiment with request, do some testing on some validation of the response and the inputs are okay and that&amp;rsquo;s about it. So I needed something more if you want to do that scale. So while I discovered k6, k6 has this nice scripting language, you could define&amp;ndash;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Tim before you, sorry. Before you move on, we do have a question. Chaitra asks, can you share this collection please, just to get along with Postman.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] Okay.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Is there a way that you could share, make that public or something?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can, I haven&amp;rsquo;t tried it, but I guess if I click share and I could, can I create a JSON link? Maybe could JSON link, update the link, maybe like that? I haven&amp;rsquo;t tried this actually before either so.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Awesome, we&amp;rsquo;re learning in public.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Paul] Exactly. No pressure, no pressure.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Yeah.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] Oh, should I put it in the comments, or how would I do that?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Yeah, sure. That would be great.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Paul] Yeah, otherwise I was gonna say we could probably put something together too for after, you know, the presentation if someone wants to access that, if there&amp;rsquo;s no issue with that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Okay, I&amp;rsquo;ll put that in the comments.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] So I was asked as well from the k6 team to update our blog post about Postman and k6. So what I&amp;rsquo;m gonna do after this session is going to review the blog post that they have already on the website and then update it with maybe some content that I&amp;rsquo;m talking about in this show here.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Great.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] And we also got a comment from Jim Munro who says Postman is definitely not designed for load testing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] No, no.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] And that&amp;rsquo;s what it seemed like. So it seemed like you could only do iterations. Is that right? You can&amp;rsquo;t set, you can&amp;rsquo;t have more threads or users.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] No, that&amp;rsquo;s it. So the only thing you can do is you can run a sequence and you can run it in a number of iterations, but you can, you can&amp;rsquo;t define how many users, you can&amp;rsquo;t define how long iteration, you can define sleep, but that&amp;rsquo;s difficult. So Postman is great for what it is. It&amp;rsquo;s great for testing some of your contracts of your API, is great for experimenting with your API, and really kickstart using your API, but if you want to do volume, to test the volume at scale, I wouldn&amp;rsquo;t recommend Postman at all. But that&amp;rsquo;s also a bit the problem, because you already spent a lot of time making a nice collection, preparing it, grooming it, updating all the time. If you then want to go to k6, you would have to rewrite everything. So if you, this is how k6 syntax looks so you can define your iterations. You know this better than me actually. And you can just use a get request. And you can script your request. You can also check it. So that&amp;rsquo;s the same as you would do in the Postman where you test your response. You could check if it&amp;rsquo;s a 200. But if you have a complex scripts, you can, they become really large to maintain and to keep them up to date. And that&amp;rsquo;s what I struggled with because it felt like I&amp;rsquo;m reinventing the wheel. So I made a diagram out of it just to explain it. So if you have an API and you have to update it, you would have to really update your collection and say, every time something changes an endpoint was added or a property was changed, you needed to update, go into the Postman collection, manually correct everything, extend it, and yeah, keep it up to date. But if you would go to k6, you have twice the work, actually. You have your API that&amp;rsquo;s changing. So you need to update your collection. You need to update your k6 scripts. So if you have five endpoints, that&amp;rsquo;s doable. But if you have 20 endpoints for one API, that&amp;rsquo;s a lot of work to keep them in sync, because this is a moving target, but it forces you to keep in sync to other moving targets because you want to be able to experiment and test them, contract, and you also want to test them at scale with the load. And I was looking really for a way, like how can I leverage this nicely prepared Postman collection and use for k6 scripts? And that&amp;rsquo;s what I, when I ended up with this scenario where you have your API, I update my post collection, I want to generate a k6 script. And I was looking around like, how can I do that? And I found on the k6 website, I found some blog items on, on how that they provided a Postman to k6 converter. And that really triggered me and I started playing around with it. And I really, really liked it. So it gives me all the flexibility of modeling everything in Postman, preparing the whole flow. So if I want to run it in sequence, I could do that. But then it also converted it into a k6 script where I had no maintenance on it, and that was really nice. And when I found the Postman k6 package, like a year ago or something, the purpose of that was to kickstart your k6 experience. And I said, but you can do much more with it. You could even fully automate it with some parameters because the first time I converted my collection, it had like 20 endpoints. I still needed to do add some minor things, I needed to add some k6 specific stuff to it, like how many iterations do I want to do, is there certain parameters I want to add that are not by default converted over. So I said, okay, what can I do to make it even better? And I don&amp;rsquo;t have to touch the k6 script anymore. So the first time that you converted it, I had to modify it still. So each time that I would do this kind of a behavior, the API changes, I need to update my Postman collection and I needed to update my k6 script. I want to, my ideal world would be, I don&amp;rsquo;t have to touch the k6 script at all. I just convert it and I was able to run it in one go. And I can show you how it works, because it&amp;rsquo;s really straightforward in the end.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If it&amp;rsquo;s okay, you can export your collection&amp;ndash;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Yeah, sure.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] So if you do export, you can just say export and you download a JSON file and you can do the same thing with your own environment. So if you want to have your test environment and you want to also convert them you can because you can also export these from Postman. And what you end up with, I&amp;rsquo;m gonna close this one, you end up with two JSON files. So as you can see, it&amp;rsquo;s the k6 office hours. It has some syntax in it, like the test scripts are there, the endpoints are there, the way you connect to them. So all the request information is in this configuration, in the environment file. You can find all your variables that you have defined. So let me just now showcase it. Sorry, I&amp;rsquo;m gonna, this one. So if you run the Postman-to-k6 converter, it expects actually two things. You define an input, my Postman collection, and you define an output. So if I would run this, just closely watch what happens there, it does some things behind the scenes, and once it&amp;rsquo;s finished, you would get, actually, if things go well, let&amp;rsquo;s see if it&amp;rsquo;s there, you would get this. Yeah, that that&amp;rsquo;s the goal of CLI. It should be fast. You get the k6 script. I&amp;rsquo;m gonna go over that later on, and you get this library folder. The library folder, what it is is because the converter, Postman uses number of functions, some methods that are not mapping exactly towards k6. So once this package, it adds some additional functionality that Postman uses. Like it uses low dash and some encryption, stuff like that, and it just adds the libraries there. So if you would do this manually, you would also have to include the libraries, but it does it for you. It includes all the libraries. And it&amp;rsquo;s actually a wrap around the, let&amp;rsquo;s go for the SHIM quickly. If it&amp;rsquo;s not clear what I&amp;rsquo;m trying to explain, stop me, Nicole.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Yeah, but we can also answer this question from Carlos Ramirez. You can also integrate, well, not a question, a comment. You can also integrate your process using the Postman API key to request information about your collection and environment. And he also adds, oh, no, sorry, this is from Chaitra Nanjesh, this is interesting, because we use k6 in Tesco, says load test, and I think we can try this to see if it works for us. So people are already liking what you&amp;rsquo;re sharing Tim.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] Yeah, that&amp;rsquo;s the goal, That&amp;rsquo;s also why I liked it actually&amp;ndash;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Do you also do what Carlos was suggesting?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] Yes, and I even go a step further, but that&amp;rsquo;s, I&amp;rsquo;m gonna come back to that later. I&amp;rsquo;m gonna showcase how we do the Full Monty in the end, actually. I&amp;rsquo;m building up.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Awesome. Sorry, people are excited.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] Yeah, I&amp;rsquo;m also excited, so I hope that I&amp;rsquo;m coming across properly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] You&amp;rsquo;re doing great, don&amp;rsquo;t worry.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] Okay. Just for reference, you have to think of this Postman-to-k6 thing as it&amp;rsquo;s wrapping Postman functions and k6 functions and combining them in one place. So it&amp;rsquo;s abstracting away the k6 part and it matches with the Postman stuff. So that&amp;rsquo;s what it does behind the scenes. So if you see, if you do an execute request, which is an, it&amp;rsquo;s a function actually, behind the scenes, it just does the HTTP dot request, which is a k6 function. So it wraps a lot of things together, and I think if I would go to execute test, you would also see it uses the k6 check function. Just for reference, this is the wrapping part. This is all not so relevant. You don&amp;rsquo;t have to care about it. What&amp;rsquo;s relevant is what&amp;rsquo;s being generated for you. So it says on top, it&amp;rsquo;s an autogenerated file here. It does some imports. It imports also k6 related items and it sets default options. By default, it says maximum redirects. And then it does some strange things which are not k6 related, but that&amp;rsquo;s typically what the package does. That&amp;rsquo;s the wrap that you see. It defines a collection with a base URL, and then you will see that my group is there, I have my request get all leads. It showcases the URL. It showcases that it does a test here. So everything that you had defined in your Postman collection, sorry&amp;hellip; Get all tests and you could see the test here. It&amp;rsquo;s translated into a k6 kind of syntax and it&amp;rsquo;s ready to be used. And you see all the requests on here, all ready to be used. It even matches a response codes that you can match to a variable in Postman. You could do anything. The body is there that I inserted that you can create. So if I were now just say k6, sorry, k6 run k6 scripts. Oh, dunno know why this is happening? Give it a second to start up. There you go.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Cool.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] So I haven&amp;rsquo;t touched anything, I just took my Postman collection, converted it with the converter that we built a while ago together with k6 and then you can see the tests there. So I created a number of tests. Postman expects to, the response is expected to be 200. I get all the data. My average is my group duration because you also have a group there. So if you have 20 endpoints, you will test 20 endpoints, but I don&amp;rsquo;t need to write any k6. So I only do my maintenance for, my maintenance only happens in here. I only have to maintain my Postman collection and my k6 gets generated out of them. So that&amp;rsquo;s really nice thing here. Yeah, that&amp;rsquo;s the library that we&amp;rsquo;re using. No, that&amp;rsquo;s not, that&amp;rsquo;s not my library actually. I think it&amp;rsquo;s moved to&amp;ndash;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Paul] Uh-oh.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Hope this is the right one.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Paul] Yeah, we gotta update our show notes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Yeah, we do. Oh, with the API deck one. Sorry about that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] No worries. I think I made a pool request a while ago, so.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Ah, I see. Okay, I will update the description.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] But I, just to continue.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Can you also post, Tim, the link?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] Yeah, I&amp;rsquo;ll post it. Of course.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Thanks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] But it&amp;rsquo;s really cool. Maybe cool&amp;rsquo;s not the right word because the package supports a number of things so that you can even tweak the output even further. So by default, I just say, give me the Postman collection and generate a k6 and it would work. But if you want to automate this on a higher level, need to do work for automation, you wanted to tweak some things. Maybe I want to play around with some k6 parameters, or I wanted to do something else, or I want to exclude stuff, or I want to include my environment because, if you see here, there is no, there&amp;rsquo;s only my base url, but I have a lot of variables I want to use in my Postman collection that I already defined. I have login information. I have some Postman base URL. So you can take it even further because now you just get a script, but it&amp;rsquo;s just, the script is already addressed. So you can take it step further. So for example, if you would say, I want to increase the number of iterations, you could just say like this. You have this parameter, says iteration 10. I&amp;rsquo;m not going to convert it. There we go. And if you see my script now has options already set at 10. That&amp;rsquo;s nice. That&amp;rsquo;s handy because you want to automate this, of course. And you can even go, take a step further. I want to include my Postman environment variables. So I&amp;rsquo;m gonna, there&amp;rsquo;s also a parameter for that. So you can pass some environment variables. So you can even pass some global variables. This is typically Postman, but you can just take the ones that Postman provides, export them and use them. So if I now do this kind of thing, so this is my file with my Postman variables, like I showed. Let&amp;rsquo;s do this again. And here, you&amp;rsquo;ll see all my variables that were exposed in my environment are now available for my k6 script to be used in automation workflows. So that&amp;rsquo;s really nice, but I can even take it a step further. What if I have special k6 related parameters? I&amp;rsquo;m just gonna copy paste them here for the sake of the demo, but I might want to define my iterations or my maximum redirects because k6 offers a lot of parameter options. Like I want to use cookies. I want to use headers. The number of redirects. I want to set some text. I want to define a timeout. All these k6 related parameters, I want to make sure that my automation flow was able to process them because I want to run the script without touching it. So I want to be able to just say, take these parameters for this pipeline, these parameters are applicable for production. So you could switch environments. For example, what we do is we have different test scenarios defined. So if we go for a small test, we run it like this, we define stages and thresholds. Well, if we want to really do performance testing, we have different ones. So these options, we use them to pass them along to the pipeline. So I could do something again with the generation part.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Question from Sri. Is it one environment at a time only?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] Yes, because what you generate is what you inject the script. So it, you would then have to generate a second script, but that&amp;rsquo;s really easy to do because you would just say, I want to have, for example, just showcasing it here, I&amp;rsquo;m gonna take this script is for the second test stage. You just run it and then you get a second script next to it. So you don&amp;rsquo;t have to worry about it. You don&amp;rsquo;t think about one script. You just fork it as much as you need with different configuration options defined that you would use.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Yeah, and Sri, I wanted to also add here that with k6, you can have, you can test more than one environment at a time. What Tim is showing here is that for, because of the way that the that Postman treats these collections separately, every environment is separate. And so the converter also converts them to separate k6 scripts. However, once they&amp;rsquo;re in k6 script format, once it&amp;rsquo;s all JavaScript, you could use k6 executors and scenarios to run them simultaneously, if that&amp;rsquo;s what you&amp;rsquo;d prefer or anything else.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] So in this example, what I&amp;rsquo;m doing, I&amp;rsquo;m going to pass on my K6 parameters as a JSON file so that I can put them in a Git somewhere. And if I then just say, press go, you will see that it also just updates this option spot on the top. There we go. So you will see, I have defined it to be in this case five virtual users, 10 iterations, maximum redirects, and just adds it on top. So I can switch around in my pipeline without touching anything. I just prepare everything, and then it&amp;rsquo;s just a matter of defining which command I should to run and it just does it for me. So that&amp;rsquo;s really handy and it really makes automation a lot easier in that regard. And there&amp;rsquo;s one thing I really like. It&amp;rsquo;s a small thing, actually. Now it generates one big file. So everything is in this one big file, all the request, it&amp;rsquo;s doable if you have like me, for example, four requests or five requests. But if you have like 20 endpoint or 20 requests, it&amp;rsquo;s a huge file. And to handle that, you can just pass along one parameter. I&amp;rsquo;m not sure if it&amp;rsquo;s commonly used a lot, but I&amp;rsquo;m a big fan of it. It&amp;rsquo;s called a separate parameter. So what happens now? The options are there. The request configuration is there. But you just get this in your k6 script. I&amp;rsquo;m not sure which one, I&amp;rsquo;m gonna remove one because otherwise I might get confused. There we go. You get this, and this is actually, it splits all your requests in a separate folder like you would see them in Postman and each request would be separated from the rest. And that makes it really easy. If you want to test something specifically, if you would have one script, it would run everything. But now I can just comment out, I don&amp;rsquo;t want to do the create, I don&amp;rsquo;t want to do the update and delete. I only want to test to get all leads. You just say k6, k6 run k6 script. Give it a second to warm up. There you go. It will only test that request that I defined. So if your 20 endpoints, your k6 script has been generated for you will have 20 lines and all your requests will be nicely separated from each other. So you can even say, I want to tweak it a bit, or you have all flexibility then, while if you don&amp;rsquo;t use a separate parameter, it just generates one file with everything in it. Do I make sense still?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Yes you do. But there&amp;rsquo;s a comment here from one of our engineers who wrote that initial blog post that you may be updating, Mostafa said last time you wrote an article about it, it needed a few changes to make things work, so well done.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] Yeah. Yes, that was one of my first VRs that I did. I wanted to make separate flow over pretty much everything. And there&amp;rsquo;s one final thing I want to showcase for, with the k6 part, is now you have to really, like all these parameters, they become very long and difficult. You could also just define them as a JSON file and just pass them along. And now you can just define the one file, put the main Git, and then you could just say, I want, this is the output, my environment. You can even define that it uses a handle summary, or you can add request tagging on top of it. And if you do it like that, you get, you just have to do one parameter, one command, actually. So if I do it like this, you see, it just says, this is my input file. I&amp;rsquo;ve defined an options file, which I referred to. And if I then just do it, it would take all these parameters that I&amp;rsquo;ve defined and you would get, again, everything nicely generated for you. All the requests are there and it even added the handle summary thing on top of that, which is something&amp;ndash;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Oh nice.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] So everything is there. And so this is the automation flow that&amp;rsquo;s really powerful because otherwise you would have to add, if you want to have a summary, you have to add a modified file. But now I just define one configuration file, I define my parameters, I define whatever I need. Just run it, and my script, I don&amp;rsquo;t need to touch it. I can just say, okay, k6 run k6 script. And you would see that it generates, yeah, it generates a test. It does, I think five or 10 iterations. There we go. And it doesn&amp;rsquo;t open anymore. It generates the JSON file. If I close my, quickly here, you would see a summary report is here. So it just, yeah, there is no manual work anymore to run k6, just keep your equipment collection up to date.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Paul] And you&amp;rsquo;re helping folks out with your example here.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] Yeah, okay, great. Okay, that&amp;rsquo;s in summary, the things that I want to showcase about the converter. There are some nice things added since the last releases from the k6 team. So I added some, requested and changed some things, and I&amp;rsquo;m really happy with it. It works flawless at the moment in our organization actually. So I&amp;rsquo;m really happy with it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Yeah, it seems really, I think I tried this initially, like when Mostafa was saying, there are a few things that you, you had to get done, but this seems way slicker, and it seems like you&amp;rsquo;ve really focused on making it automatic so that don&amp;rsquo;t, there is no manual intervention, which totally makes sense in a CI/CD pipeline.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] Yes, correct. And I wanted to put my effort on the Postman and the management of the Postman collection, because that was a tool where we were all working on and maintaining it. And I wanted to keep the workload on k6 as low as possible. And I think we succeeded it quite well on that regard. There are some things that are not available out of the box. Like you cannot do the send request. You cannot set next request. But what I did add was, what I&amp;rsquo;m also really proud of, the dynamic functions from Postman. You could just add any, pretty much any generated stuff. Let&amp;rsquo;s see if it shows, if it works like that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] There&amp;rsquo;s also some nice comments for you. There&amp;rsquo;s Gertjan De Wilde, who says, Go Tim. There&amp;rsquo;s Pepe Cano as well from k6 chiming in with his support. James is saying nice to see this getting the love it deserves, much better experience. And Charly is saying, Very useful tool, congratulations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] Thank you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Lots of love in the comments for you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Paul] Definitely.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] Okay. But honesty, we took it a even a level further, but maybe I should, maybe there are, if there are other questions we should talk about or not, I&amp;rsquo;m not sure.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] I&amp;rsquo;m interested in this. So what were you saying, the dynamic part that you added parameters?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] Let&amp;rsquo;s see.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] I mean, you also don&amp;rsquo;t have to demonstrate everything. Can we just like acknowledge the fact that Tim who doesn&amp;rsquo;t even work for k6 or Postman volunteered to do like a live demo about this. So that&amp;rsquo;s awesome. Don&amp;rsquo;t feel like you have to show us everything. You can just talk about it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, Postman really provides this nice, what they call dynamic variables. And so it&amp;rsquo;s, this is a screenshot of it. So if you use curly brackets, it&amp;rsquo;s random, and then you can say, I want the full name, I want the bank account or anything that uses Faker behind the scenes, and you can make dummy data out of it. So that&amp;rsquo;s really handy if you want to really make, yeah, realistic data without having to use for loops or anything, just put in the variable. And that was not fully supported in Postman to k6. So we brought in that support as well to make sure that you could have the full functionality of the dynamic variables attached to that. So yeah, there are a number of things we did since the last release of it, and I think dynamic variables was in much demand at that moment. There you go. Yeah, and I&amp;rsquo;m really happy for Mostafa, I&amp;rsquo;m not sure how to pronounce it correctly, because I think he was one of the first ones who pointed out in his blog post about functionality. So thank you for pointing it out to me.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, now that I think about it, I should have asked Mostafa to be here too. Oh, I missed that opportunity. Sorry about that Mostafa. That&amp;rsquo;s so good about the dynamic variables, because that&amp;rsquo;s one of the things that you have to think about when you shift from just a purely automization mode, like automated testing mode to load testing is that you can&amp;rsquo;t, you then have to start thinking about the data that you&amp;rsquo;re sending too, because if you&amp;rsquo;re trying to get realistic response times it could trigger caching on the service side if you&amp;rsquo;re just requesting the same thing. So yeah, totally makes sense. k6 can already, you can already import faker with k6, so great, great job for putting that together.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, no, that&amp;rsquo;s very cool though, but yeah, it&amp;rsquo;s like, you can use Postman for your user, your UI, your, you know, your development environment and do all this stuff and then even goes through there and generates some random data. So, yeah, that&amp;rsquo;s cool. Very cool.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oh, go on.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;But maybe I&amp;rsquo;m gonna talk first before I want to show the final piece of what we did.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Well, just, just quickly, I just wanted to ask about the limitations of this approach that you see.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Not all functions of Postman are supported. So that&amp;rsquo;s the downside of it actually. But for the use is that that we are using it, we have everything covered. Like you have the, the dynamic variables, you have the environment variables, you can define k6 parameters. Yeah, there was nothing stopping us. I think if you want to do complex scenarios and you want to do if-else situations, there it&amp;rsquo;s not suited for. That&amp;rsquo;s the same problem you would have in Postman. It would be difficult to make these if-else conditions in Postman as well. So that&amp;rsquo;s, if you do simple tests, functional tests in Postman, you can really easily port them to k6 and then you have performance tests end points.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And in the spirit of the whole free and open software. I mean, do you have issues where like you&amp;rsquo;re looking for help? Is there any gaps that you&amp;rsquo;re still looking to fill?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There are some bugs I cannot reproduce at the moment, something with XML conversions, but right now it&amp;rsquo;s feels quite feature complete. I haven&amp;rsquo;t added that much, actually. The base was already there by the k6 team members who built the initial library. So I just added some sugar coating on top to make the automation flows much smoother and less manual work, or linked actually. But if people have great ideas, I think they should just make a PR and add it to the package.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, did you want to show us something else?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yes, I want to show how we ran a step further even, because yeah, if you update your API and then you have to update your Postman collection, it then generates a nice k6. But we also use openAPI as a documentation tool where we document and design our API. So every change that you do on your API, you need to add them to your API, and then you, so you still have to maintain not one output, the Postman, but you also have to update your documentation. And I want to flip that around. I want to make the API documentation leading, generate the Postman collection out of it and generate out of the Postman collection, a k6 suite. So that as a product manager, I don&amp;rsquo;t have to maintain all these documents anymore. I just maintain one thing, and that&amp;rsquo;s my openAPI and my team or our team then only just need to develop the application itself. And it&amp;rsquo;s called spec driven approach. It&amp;rsquo;s nothing new, but I&amp;rsquo;m a really big fan of it and I&amp;rsquo;m a really, yeah, we introduced it a year ago and it solved so much and it brought so much quality on the company level, in our documentation, in our test suites. So that&amp;rsquo;s something I want to share as well, because it&amp;rsquo;s so valuable once you get how it works and if the right tools and properties, you can really do it. And this is actually where we are right now. I can also demo how it works. So we have, I&amp;rsquo;m managing an openAPI documentation. We use the formatting and we validate it if it&amp;rsquo;s valid. And then we use a generated one. And from the generated one, we generate documentation. So public documentation, stop lights, just like whatever you call it, we generate a Postman collection that we can share with the customers and we run contract tests, we run soak tests and we run smoke tests all based on this openAPI documentation. So, and again, there&amp;rsquo;s no no contact or no changes involved. We just, we managed the spec on its own and it&amp;rsquo;s really, really something powerful and useful. And I can quickly show how it would work actually if you&amp;rsquo;re interested.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Yes, but before you do, a wild Mostafa appears.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Hello.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How awesome is that? Let&amp;rsquo;s just say hello to Mostafa, who just joined last minute since he was already in the comments anyway.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nice to meet you. And I&amp;rsquo;m grateful that you wrote the blog post so many, so many months or years ago, so thank you for that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, yeah, I really felt the need that we needed this article, so that&amp;rsquo;s why I wrote it in the first place. And then, yeah, I found a lot of issues that you solved, and thank you, it was a great job you did, and well done.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Thank you. And thank you for putting out the 90% of it. I said I only had to put in the sugar on the top of it and the cherry on the top.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No, no, no, no, that&amp;rsquo;s not true, that&amp;rsquo;s not true.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mostafa&amp;ndash;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In the first place just to clarify.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, Mostafa while you&amp;rsquo;re here can you quickly introduce who you are and why we&amp;rsquo;ve randomly invited you onto the stream?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Of course. Okay, so I am a backend developer at k6. I&amp;rsquo;m almost three years with k6, like it was called Load Impact before being renamed completely to k6, and now Grafana. I&amp;rsquo;ve been a developer advocate when the first like idea came into place that we want to have a developer advocacy program. And yeah, I&amp;rsquo;ve been a developer advocate for a year and then came back to back it. So I worked with lots of these tools and tried to help others because like, there were no other resources available. Like there was this read-me on the project and that was it. No mention of it anywhere. Only the hidden knowledge of everyone inside the company of how to use this tool, but nobody knew without outside the company. So tried to learn it from others, specifically, Pepe, thanks for that, from here. And I tried to write that blog post and try to share the knowledge. So that&amp;rsquo;s basically it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Great, so we also got a comment: Great with the diagram. Can you share this?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Of course I can. Yeah, I&amp;rsquo;ll do that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;All right, I guess that&amp;rsquo;s our cue to head back. Please continue, Tim.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oh, I&amp;rsquo;m not gonna, I&amp;rsquo;m just gonna showcase it, and then I hope everybody will really appreciate and see the power that it brings actually. So, okay, so maybe start with the beginning. I&amp;rsquo;m gonna close my screens a bit to clean it up. So I have this openAPI spec that I, it&amp;rsquo;s just a copy of what we just described. So this is how it looks, this is documentation using Docly. You can see it&amp;rsquo;s the k6 office hours CRM application. You can see the list in there. You can see the create, the get. So it&amp;rsquo;s just the definition of what the API would look like. This is the documentation part of it. So I&amp;rsquo;m using now two tools. I&amp;rsquo;m gonna use Portman as another package that I built together with API Deck and make an API Deck where we can convert the openAPI to Postman, and from the Postman, you can generate a k6 one. And that&amp;rsquo;s really nice because you only need two commands, one source file, and you have two outputs out of the box. So that&amp;rsquo;s really powerful. I find it powerful at least. So I&amp;rsquo;m gonna take my commands correctly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So If it&amp;rsquo;s okay, can you, I&amp;rsquo;m not, I&amp;rsquo;m not up to speed with Portman. So it creates a Postman collection already given openAPI, is something in openAPI specification?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;That&amp;rsquo;s awesome.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There was, Postman built a patch like Mostafa, k6 build a patch where you can convert from Postman to k6, and Postman build a Postman where you can convert from openAPI to Postman. And when I found out, I said, that&amp;rsquo;s amazing. You don&amp;rsquo;t have to maintain a Postman collection anymore, but it wasn&amp;rsquo;t, it was missing some functionality, and the major thing that I was missing, it was just creating the request than Postman, but not the tests. It was not handling the tests of it. It was not assigning variables. It was just taking the Postman request and converting them into openAPI requests, into Postman. So you still needed to maintain and modify them. And I said, it has to be, because an openAPI documentation or specification, it describes everything, the request type, the body, the properties, if you do it properly, you have all, everything in one go. And I said, why not use that to create a test suite, update your variables, do all the dynamic stuff you would expect it to come out of the box. And that&amp;rsquo;s why we created Portman. It started as a PR on that openAPI to Postman package, but then I met Nick from openAPI, from API Deck, sorry. And then we came together and we said, let&amp;rsquo;s collaborate, and let&amp;rsquo;s make a startup package out of it that you can plug in and use it to automate these kind of workflows. And it&amp;rsquo;s really, yeah, I&amp;rsquo;m biased again, but I really like it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No, it sounds awesome.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A question here. May I ask a question here? So have you seen the openAPI generator package that I&amp;rsquo;ve written?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yes, I saw that and that I had the same comments as I had initially. It generates a nice k6 script, but it it&amp;rsquo;s usually you still have to manually adapt a lot of things and correct it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, but sorry that I interrupted you. There&amp;rsquo;s this latest PR point? I think Michael, if I&amp;rsquo;m currently remembering his name, so Michael added a feature to, to be able to add certain extension to the, to your Swagger or openAPI collection so that it generates everything for you. And if you add examples to your API output, to your responses, then it can extract those examples and put it in your script so you don&amp;rsquo;t need to modify anything. So you can create basically the same thing you did for Postman, you can do it for the openAPI. So the new revision, the new PR and the new version that is released by Ophelia, the maintainer of the openAPI project helps you create a complete test from start to finish with no modification.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, I think that&amp;rsquo;s great, but we do two types, three types of tests. We will do contract tests, and then we use Newman for it. And we want to use k6 because Newman, it can do schema validation, it can do a lot, I think a lot more than k6 can right now. I think it&amp;rsquo;s also the goal for k6 to do all these contract validation. It can, I guess, but I treat them differently. I think the Newman Postman has more contract testing capabilities, while I think k6 is perfect for performance and load testing at scale, where you only focus on what&amp;rsquo;s the response, is it 200 or is it not a 200, at least that&amp;rsquo;s how I use it actually.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;That&amp;rsquo;s fair enough.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, what Portman does it converts openAPI to Postman. So I&amp;rsquo;m gonna showcase that quickly. So it just took the, this openAPI that&amp;rsquo;s here now, and then gives a while to spin it up. There we go. It&amp;rsquo;s converting it. And if things go well&amp;hellip; Let me check something happening here. Here it is. So here&amp;rsquo;s my Postman collection. It&amp;rsquo;s just generated it. It does everything for you. So it creates, recreate, so there wasn&amp;rsquo;t a collection there. It just recreated for you. And I hope things, it&amp;rsquo;s not showcasing it here. That&amp;rsquo;s bad, too bad. So it just generates and if I would import in Postman, let&amp;rsquo;s quickly do that&amp;hellip; Give me a second to find everything. There we go. So this is the k6 and it&amp;rsquo;s generated by Portman. There we go. If you see you have the same endpoints&amp;ndash;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Oh, nice.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] So the first thing it&amp;rsquo;s great because you don&amp;rsquo;t have to recreate your Postman collection. You just, you just run it from your openAPI specification and you get, as a result, you get your requests pre-tailed already, also your post exercise is ready. So you can see here, it inserts a body, everything, I don&amp;rsquo;t have to do anything. It just takes your openAPI and converts it to Postman. Plus it adds a lot of tests already. You see, it does contract testing by design. So it includes automatically 200 contact applications. So it just injects your contract test in there. And that&amp;rsquo;s really nice because I only need to maintain one document, my openAPI specification, as a result, I get all my requests in Postman, and I get all my tests in Postman without writing any code. I just need to maintain it in the openAPI documentation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wow this is really awesome, Tim.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So keep in mind that this was the flow before you had to create your Postman collection and add the tests, and then you could generate k6. Now we turn it around. Now we generate the Postman and request, and then we can use that to generate, okay, six scripts. And so we only need to maintain this part in, yeah, or you know, that&amp;rsquo;s the only thing I need to maintain as a product manager and the team, of course, they built the API and the service and everything, but I get this and I can focus only on this. And this is easy to manage because it&amp;rsquo;s a YAML, you can play around, you can add endpoints, you can remove endpoints and just run it. A minute later, I have a Postman collection to play with it and I can run it at scale with k6, doing the volume tests. What else can I showcase quickly here? Let me see if I can. I just&amp;ndash;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Some more nice comments here. Such an awesome flow, says Gertjan, and James says his mind is blown and, and I join him on that sentiment right now.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Mostafa] Exactly. That&amp;rsquo;s a full test suite, like from start to finish.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, and like example, schema validation. It comes out of the box. You don&amp;rsquo;t have to add it. It just does it for you. And the richer you make a documentation, the richer the test suite will become. And it also, Portman, be extended, you can also do variations. So now it just validates if it&amp;rsquo;s a 200, but you can also have it generate 404s, and then it will remove items from it. If it&amp;rsquo;s a required property, it&amp;rsquo;ll create a variation out of it. And then you can test I&amp;rsquo;d the 404s are not present. And so you get two test suites in one go, actually.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wow. That is, that&amp;rsquo;s so awesome. Maybe we can like, try and summarize this as we try to collectively recapture our blown minds. So I think that there are two different tools here, Postman and k6, which are really for different things. The Postman is really better for API testing, and as you mentioned, Tim ,contract testing, and k6 is better for load testing. And their features are pretty divergent after a certain point, but they do have a commonality, and it seems like that&amp;rsquo;s what you&amp;rsquo;ve really capitalized on. Mostafa and Tim both have worked on this. and you you&amp;rsquo;re trying to make, you&amp;rsquo;ve gotten us closer to this ideal of having just one set of test suites, and it doesn&amp;rsquo;t really matter whether it&amp;rsquo;s automation test suites or load test suites or, it can just be the one thing and you no longer have to maintain two separate ones. And that&amp;rsquo;s having like the amount of time that you need to set it up, but also running it. Because having to explain this to somebody else is also a huge deal when you&amp;rsquo;re not the only tester on your team.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nope, exactly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And the nice thing is as a product manager, I&amp;rsquo;m not technically, so but I can contribute to it. I can, I just need to maintain the openAPI specification and the whole team benefits from anything that I do. If we need to add a new endpoint, I can design it. Not even five minutes later, one minute later, I can just run it in a pipeline, see if it works, and that&amp;rsquo;s a bit, the cycle of spec driven development. You put your spec at the center, the spec at the center, and then you design it, simulate it, fill it, Then you build it, you test it. But the spec is a test driver here and then you can even run it on production and yeah, do the management aspect as well, because then you can monitor it as well based on your API specification. So that&amp;rsquo;s, as a product manager, I&amp;rsquo;m really proud that we pulled this off because that was one of the ambitions when we wanted a newer, or API program, like how can we use a manual workload, what can we automate, and yeah, I&amp;rsquo;m really happy because it&amp;rsquo;s all open source based. There is no other software involved. We just use k6. It has excellent dashboards to individualize reports. We use Postman to generate contract testing and manage it, play around with it. And we benefit from such large ecosystem , Swagger as documentation interface, where you can display or openAPI as well. So it&amp;rsquo;s almost full cycle or I don&amp;rsquo;t know what&amp;rsquo;s the term for it, but yeah, I really, I&amp;rsquo;m really happy with where we are right now. It&amp;rsquo;s a good place to be in an API landscape actually, especially from, yeah&amp;ndash;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You&amp;rsquo;ve taken it a step further, right? This is no longer just about test suites. It&amp;rsquo;s also because you are building on the openAPI specifications, it&amp;rsquo;s all connected even from not just the development part, but the design part. And Pepe actually has a question about this. He says, can you show us more about the process that updates the APIs? What does it do?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How do you mean? This flow, this one?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sorry, which one? Yes, I believe so.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The powerful thing about this can also be because if you have an openAPI specification, you can even generate clients or service side code from it so that in the end, your API service can also just be generated from an API specification. There is a really nice openAPI, there&amp;rsquo;s a really nice openAPI open source project, it&amp;rsquo;s called I think openAPI Generator, and then you can just run a C# library or an API for that. You just take your openAPI documentation and you run, you run it and you get as a result, you get C# code that you can run in production. And that&amp;rsquo;s also what we use in our company. You have some teams that just manage to build the openAPI specification and they use that to generate C# code and have APIs up and running in no time. I hope that this is the answering this question.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, Mostafa, Paul, anything you want to say to Tim.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, no questions but, yeah, that would come later, but I need to definitely pass this along, this video along to some people that I used to work with, because this will blow their minds as well. This is something that they definitely need.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Do everyone.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Great job, great job.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, great job, exactly. I&amp;rsquo;m literally speechless because I&amp;rsquo;ve worked with all these tools and I know all the&amp;ndash;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Clearly not literally.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Well, not the ones that Tim wrote, the ones that we had before. But anyhow, this is a great addition to this mix of open source software that was out there and that we used, and this is basically end-to-end testing. So based on a YAML file, which is an openAPI specification, you can generate tests for your API. You can generate load tests. You can generate, I don&amp;rsquo;t know, like literally everything.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It&amp;rsquo;s also documentation. You get documentation, nice looking documentation out the box, a playground with Postman and you get the numbers to back it up with even graphs from k6. I really like your dashboarding. So if you have a customer and they they&amp;rsquo;re asking about SLA, we just pull up some graphs from k6 and everybody&amp;rsquo;s happy with that. So we, the full ecosystem has really matured a lot over the last couple of years.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bravo.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, this is so freaking awesome. Thank you so much, Tim, for coming on. By the way, he&amp;rsquo;s not even working for k6. He&amp;rsquo;s just, and I think you said at one point, oh, I&amp;rsquo;m a product manager. I&amp;rsquo;m not technical. I beg to differ. This is pretty amazing things that you&amp;rsquo;ve put together. There&amp;rsquo;s a bunch of comments here too. James says he&amp;rsquo;s literally waiting for the livestream to end, so he can link to the video with a timestamp. Well, let&amp;rsquo;s just try and drag it on for him, shall we? Thanh says plus a thousand votes, and people are also saying thank you, and outstanding, almost the holy grail. So lots of fans in comments. Thank you so much, Tim, for joining us. I know we&amp;rsquo;re a bit over time. I&amp;rsquo;m kind of taken aback by how much value you just showed us. This is amazing, I think we need to have you back.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, I&amp;rsquo;m gonna write a blog post for k6 and one for API Deck where I&amp;rsquo;m going to get more into the details because yeah, it&amp;rsquo;s a show now, it&amp;rsquo;s a difficult to but I&amp;rsquo;m gonna try to write it up and then extend a bit on what, sorry.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mostafa.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mostafa, apologies, I&amp;rsquo;m really bad.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It&amp;rsquo;s fine, it&amp;rsquo;s fine, no worries.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, I think can be really powerful to share with the rest of the world that they can, yeah, maybe use some parts of it or not, but I benefit a lot from it. The whole team benefits a lot from it, actually. I can showcase, this is a pipeline we use, for example. So this is we do tests, then we run Postman and we do tests and if it&amp;rsquo;s 100%, it gets deployed. So it&amp;rsquo;s not just a gimmick, me showcasing it. This is really happening in our company. So we use it to build it. We use it to have nice dashboard with k6 attached to that. So yeah, I&amp;rsquo;m grateful that you put it out there for us to benefit from it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Thank you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;That&amp;rsquo;s so great, thank you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, I&amp;ndash;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go on, Mostafa..&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Review the article that you want to write.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Okay, I&amp;rsquo;ll keep Pepe in the loop and then you&amp;rsquo;ll reach out.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Of course, of course.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Great, thank you. Thank you as well, Paul and Mostafa, for coming on, Mostafa, even though, sorry, I should have invited you even earlier. Thank you everybody for watching. Thanks everyone in the chat. Have a great weekend, everybody.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Absolutely.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Thank you for having me.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, thank you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, all right, see you all.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bye.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>How to design a workload model in k6, with the k6 Developer Advocates (k6 Office Hours #42)</title><link>https://nicolevanderhoeven.com/blog/20220218-koh42-how-to-design-a-workload-model-in-k6/</link><pubDate>Fri, 18 Feb 2022 18:20:21 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220218-koh42-how-to-design-a-workload-model-in-k6/</guid><description>&lt;p&gt;On this week&amp;rsquo;s Office Hours, &lt;a href="https://twitter.com/javaducky"&gt;Paul Balogh&lt;/a&gt; and &lt;a href="https://twitter.com/srperf"&gt;Leandro Melendez&lt;/a&gt; join me to talk about how to design workload models in k6 load testing scripts using scenarios and executors.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/3AJLSH0Ifm4?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="transcript"&gt;Transcript&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Hello everyone, and welcome to another k6 office hours. I am Nicole van der Hoeven, and for the first time, all three of us developer advocates are in one stream. Could you please introduce yourselves?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oh, who&amp;rsquo;s going first?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I guess you are.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;All right, age before beauty, as they say. Okay, well, hey, I&amp;rsquo;m Paul Balogh, the newest DevRel here at k6, nice to meet you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And on my end Leandro Melendez, also known as a Senor Performo, very happy to contribute here and bringing, usually it&amp;rsquo;s knowledge, but this time I&amp;rsquo;m gonna be a little bit on the learning side, which is super exciting.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We learn together.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oh yeah.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, I mean, I don&amp;rsquo;t think you can really have one without the other. I think it&amp;rsquo;s super valuable to also just ask questions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And Nicole, I&amp;rsquo;m a little disappointed that you don&amp;rsquo;t have a fake mustache to support Leandro and I.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah. That is not something that I just have lying around, unfortunately.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We may have to fix that. I was commenting the equivalent here in Mexico is the unibrow.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I could potentially draw something on my face, maybe, I could try that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Is that the Frida Kahlo?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oh yeah.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So, Leandro and Paul are relatively new to k6. I think you both have been here for less than a month.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Just a month here.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oh, just a month now, that&amp;rsquo;s awesome.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Three.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;But this is the first time, I&amp;rsquo;ve been here with you with each of you separately, but this is the first time that all three of us are here. It is pretty cool, welcome.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Exciting, hopefully it&amp;rsquo;s not overload for everybody watching.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah. One thing that I wanted to get out of the way is that we have a very awesome community, we have several community champions, but one of them, NaveenKumar, just posted a couple of videos on how to use checks and thresholds in k6. So I&amp;rsquo;m going to put that in the comments, as well, because I thought that they were pretty awesome videos. NaveenKumar has a YouTube channel where he goes through a bunch of different tools, including k6, but also like JMeter and Gatling, and he always does a good job, so check those out. Oops, I actually didn&amp;rsquo;t post his videos, I think I posted the documentation for what we were talking about, so that&amp;rsquo;s a little premature. Sorry about that, let me put the actual links this time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Well, this is a live podcast.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, obviously. Sorry, you get what you get. So if that hadn&amp;rsquo;t already tipped you off, what we actually want to about today are scenarios and executors in k6. You may have been confused by the thumbnail because it was like, I realized afterwards, that it was the three of us, our photos, and then the words executors in k6.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Here come the executors, the three of us.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I guess that&amp;rsquo;s our new name or something.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You know, if you invert the k6 logo, it almost looks like a guillotine, so maybe we are the executors.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oh, okay.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I had not noticed that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;That&amp;rsquo;s a little morbid.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oh, you know, hey, I do what I can.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You&amp;rsquo;re going like play Beatles songs backwards and all that type of stuff, man. I&amp;rsquo;m sure it was not on purpose.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It looks like we&amp;rsquo;ve lost access to LinkedIn for some reason, but, oh well, this has happened before. Thank you, Mark, for saying we&amp;rsquo;re killer performance engineers, love the pun. So the reason that I wanted to talk about this was that, I don&amp;rsquo;t know if you also have got the same, Leandro, Leandro and I were both in the Automation Guild 2022. We both had a talk there and there are a lot of common questions that come up with regards to load testing. And a lot of it has to do with the results, specifically when, I&amp;rsquo;m not sure if you can actually hear the wind in my background.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Is that you, oh wow.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Are you okay?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m okay, but apparently there&amp;rsquo;s a storm that&amp;rsquo;s in Northern Europe.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I was gonna say, hopefully you&amp;rsquo;ll still be in Kansas, right?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I know. It&amp;rsquo;s like 140 kilometer per hour winds.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Don&amp;rsquo;t end up in Kansas.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;But can I be the straw man, at least, in this Oz thing?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sure.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I always liked him.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I guess I&amp;rsquo;m Dorothy. Or the wizard.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I ask Toto, please.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve got Toto around here somewhere, let her in.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So one question that I was getting a lot, or I saw other people talking about variations of it, was the situation where you might have already run your load test and seen all check marks and everything passed, and the response times were within the expected results, and yet when the application goes live, suddenly there&amp;rsquo;s all these errors, and performance issues, and maybe production incidents that you never saw in any of your tests. And the question is, how can that be when you&amp;rsquo;ve done your testing and you didn&amp;rsquo;t find any of that and you only see it in production?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yes, of course I experienced that several times, but many things come to mind on, in what environment did you test? What happened in this environment? If you test in production, hopefully &amp;lsquo;cause we are modern performance engineers that are not afraid of testing in production. Settings, changes, what was the workload? I mean, I don&amp;rsquo;t know, the list is pretty long.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, there&amp;rsquo;s a lot that, that could, that&amp;rsquo;s why that question is hard to answer because there&amp;rsquo;s no one answer. It&amp;rsquo;s like, oh and that happens, always check this. And that&amp;rsquo;s also because it could be that there&amp;rsquo;s something different with the environment. Like maybe it&amp;rsquo;s you didn&amp;rsquo;t test the same version of the code even, or maybe you were testing in not a production-like environment in terms of size, or test data, or something like that. But another reason that I think is easier because we testers normally control it is on the side of the script. It could be that you weren&amp;rsquo;t testing the things that you actually wanted to test. And a big part of that, I think, is workload modeling.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;That&amp;rsquo;s one that I also wanted to comment, &amp;lsquo;cause that has been a pain in different occasions. On one hand, watch model, &amp;lsquo;cause from what you&amp;rsquo;re saying, there were these projects where in the end we were told, hey, this is a workload, this is a utilization that we are expecting to have in production or that we actually have in production, we want you to test for this. And it was nothing like that. We were told, yeah, it&amp;rsquo;s a thousand clicks per day, but you wanna test an emergency center when there&amp;rsquo;s a tornado. How is that true, how is that relevant, or vice versa? For some reason, our scripts are just simulating a thousand clicks per day where it&amp;rsquo;s 10,000 billions, gazillions, what would&amp;rsquo;ve been the right thing. Of course your performance test is gonna be awesome if you underdid it. And the other side of the risk, everyone running and, like, the system is dying, what is happening? Oh, we&amp;rsquo;re pressing it too hard, sorry, our bad.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, that&amp;rsquo;s true, could go both ways.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;But definitely you always have to worry about configuration drift anyway. Differences in your environments, unless you&amp;rsquo;re using something like a terraform or something, infrastructure is code where you can make sure that your environments are equal. So if you do your load testing and performance testing in a lower environment or isolated environment that it gets some of that, that it is truly configured the same.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, even when the environments are exactly identical, though, let&amp;rsquo;s just say that it&amp;rsquo;s possible to say that, yeah, there are still situations where if your load tests weren&amp;rsquo;t simulating realistic enough load, then you can&amp;rsquo;t really, you may not be able to apply those results to production either.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And one thing, as I said earlier, on one hand, the problem to getting those realistic numbers, at times, the team doesn&amp;rsquo;t even know, they have no idea what are you asking for. All they know is we want to be able to handle 10 users in the system. I&amp;rsquo;m kind of simplifying it, usually it&amp;rsquo;s 10 billion users or something like that, right. Okay, 10 billion users, what does that translate into in terms of utilization? And they go like utiliti-what? And that&amp;rsquo;s the first struggle, right. Supposing that you get the right numbers that you know exactly how much to stress each thing, &amp;lsquo;cause there there&amp;rsquo;s another differentiator, right. We get this action a thousand times, okay, but to get to that action at times or on some systems that are the same, you have to do others many more times, less times, and they are just telling you about this one. What is the proportion, how much to stress the other one that the other one does need not that many times? So that&amp;rsquo;s one discussion. If you get the numbers right then to landing it into the script and your scenarios, also, it&amp;rsquo;s a very interesting situation, headache-bringing situation at times.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I think part of the problem is that a lot of times, when we think about load testing, there are only a few parameters that we think about immediately. One them is the number of virtual users. Another one is the test duration. And sometimes you might get like a request per second, like you were saying, Leandro, but those three don&amp;rsquo;t really describe the shape of a load. It&amp;rsquo;s kind of like trying to encapsulate test results into an average figure, like when you get the geometric mean of something, it&amp;rsquo;s not a great way to express the distribution. You know, if you say that the average response time is three seconds, that doesn&amp;rsquo;t mean that you don&amp;rsquo;t have really high response times. Like you could still have a handful of requests that are at 15 seconds, but maybe the rest of them are a hundred milliseconds. It doesn&amp;rsquo;t really&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There is context.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Accurately describe the whole context, the big picture of the load. And in the same way, things like the number of virtual users, and duration, and requests per second also don&amp;rsquo;t show the entire picture.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, wen you&amp;rsquo;re describing it that way, it makes me think when you are asked to describe someone, oh, has beautiful glasses. I mean, I was talking about Paul, sorry, Nicole.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oh, sorry.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No, no, I like your glasses, too. But you need a full picture, right? There are so many elements that a scenario or a workload model includes, so many variations, details that, yeah, as you were saying, I need 10 million users in the system doing what, how often, how long, how many of them are doing which ones? And many of those things, you have to get into the weeds to truly understand and design &amp;lsquo;cause this is another one, you will want different workloads for different type of load scenarios. You should not, I was gonna say you cannot, but you can try, but it&amp;rsquo;s not recommended at all to try to kill too many birds with a single stone. You may be able to get two, but more than that gets complicated, gets crazy. So you have to create a work model for that specific risk situation, that scenario that you want to test for. Just one at a time gets challenging, getting all those components, all those items and things that you need to be careful putting together to model and simulate something that resembles realistically that risk scenario, that risk circumstance that you want to test for.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And here you go again with that killer mentality there, killing multiple birds with one stone. And now Mark&amp;rsquo;s making comments here that actually for killers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Okay, okay, let&amp;rsquo;s say you may be looking for a needle into multiple haystacks, no killing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There we go.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I was thinking about what you were saying about the hypothetical scenario of a thousand requests over 24 hours. There&amp;rsquo;s still so many ways to interpret that, right? Because it could be, one interpretation could be, take a thousand requests divided by 24 hours and that&amp;rsquo;s the amount of load that you want to test with a one-hour load test. It could be like that, but if it&amp;rsquo;s emergency services, there are certain times of the day when emergencies are more likely. It could be seasonal, as well, like the incidents of emergencies of ambulances that are sent out increases over the holidays for inexplicable reasons. That kind of thing does give more context than just a thousand over 24 hours. I mean, if you just look at a period of 24 hours, those thousand could have been simulated, could have happened in one hour for all you know.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Step in a little far from the ambulance example, don&amp;rsquo;t wanna go more on the killer topic. Let&amp;rsquo;s think of a restaurant, if they say, this Golden Arches restaurant, we sell a thousand burgers per day. Okay. Most probably you are selling 80% of that at lunchtime and the rest of the hours we don&amp;rsquo;t care about. So those different behaviors during that period of time is what we should focus on, or care for, or have better information. Well, in the morning you get more, what&amp;rsquo;s the name of the thing, hash Browns, no burgers. Even if you are the same restaurant, which one do you want to simulate? What is the utilization at different periods in time during the day? &amp;lsquo;Cause yeah, probably no one, not that many people get a milkshake in the morning, but most of them getting in the night. So some of those variations, you want to make sure that you are doing the right mix, not only how many at a single number per long period of time, what happens each hour of the day, which ones do you care for. As a restaurant, I would say I don&amp;rsquo;t wanna simulate a load test of, I don&amp;rsquo;t know, after lunchtime where everyone is gone and we are super quiet. I don&amp;rsquo;t care load test-wise, right. But lunch time, breakfast time, I don&amp;rsquo;t know, 7:00 AM in a gym, I want to test those type of things of what people are doing and focus on, get a good work load model for what is happening at those times, right.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So I thought, Mark has a couple comments here. I think also the number of vusers or threads compared to the target arrival rate or expected response time for me is the health of the workload generation. And he follows up with, also synchronizing or rendezvous vuser requests is underused in my opinion. Do you agree, Leandro.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Well, it&amp;rsquo;s in my personal experience, there have been a few times, at least on the render view or synchronizing part, there are not that many times where I had to leverage those functionalities. I think it kind of depends on the projects that you work on. One that comes to mind, and I really love this example for workload modeling in general, is I worked at a gaming company, Australia&amp;rsquo;s largest gaming company, and the project that I worked on was for the Melbourne Cup. So they sold tickets for the Melbourne Cup. And if you don&amp;rsquo;t know, and probably you don&amp;rsquo;t unless you&amp;rsquo;re Australian, but the Melbourne Cup is a horse race. It is like a two-minute horse race that is for some reason incredibly popular in Australia, in my state, in Victoria, &amp;lsquo;cause I lived in Melbourne, we actually got a public holiday for it. So, it&amp;rsquo;s that big. And for some companies, for a lot of these betting companies, the revenue from that one race could be up to 80% of the entire year&amp;rsquo;s revenue. So it is that big.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Just in that two minutes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, and that&amp;rsquo;s the thing. Betting is open until the race starts. And yet when you look at the workload model for that, it really, the load spikes, the betting spikes just in the few seconds before the race. And that&amp;rsquo;s for a number of reasons, people might not have had the chance to bet earlier in the week because they were working or something. And if you have a public holiday, then you do have the time to just be there watching. And also there are, depending on the types of bet that you placed, there could be a difference in odds. So they&amp;rsquo;re trying to get the last possible information that they can before they have to make a decision about which horse to back. And that&amp;rsquo;s a good case for a rendezvous because there is a clear cutoff and sometimes you see the reverse, like for example, in a university portal or one of these shopping sales, where at midnight all the sales go live. And so you get people maybe refreshing that page all up to that point and then, bam, all of a sudden they start checking out things. And that would be, I think, a good time to use rendezvous.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No, and in a quick example, you got me thinking, as well, video gaming, when you are on these multiplayer games, most probably everyone watching this are familiar, campaigns, online campaigns, certainly there are so many things happening, there are people playing other things, but a campaign is gonna start at this moment, this schedule. I think there a rendezvous would be a very good use of those type of things. Sadly, in my experience, some of those situations were solved with a spike scenario run out here with an average day in production, so overlapping scenarios. But that&amp;rsquo;s interesting &amp;lsquo;cause, as well, it depends on how do you want to tackle that problem. We are going to have a normal day and suddenly something&amp;rsquo;s gonna happen. How do we simulate it? How do we model that workload? What tools do we use? That&amp;rsquo;s a very good point, and again, with performance testing and load testing, there&amp;rsquo;s no one size fit all or the way to do everything. No, it depends, and you can get two very similar loads, simulations, workloads with different approaches, with different things. And that&amp;rsquo;s one that I also wanted to mention, like when modeling, it&amp;rsquo;s something that when you wanna try to get, there are two elements that I like a lot and I struggle a lot of times, when you are modeling your workloads, you have to somewhat randomize the actions. A big thing that we used to leverage in the load runner days was randomized think time in between steps. But eventually you have to say, okay, it&amp;rsquo;s randomized, it&amp;rsquo;s happening, like real people is using the system, but in the end I want just this process, just this virtual user to iterate a thousand times in an hour. Oh, but I have random times in between, okay let&amp;rsquo;s, that modeling, as well, I can tell got so interesting. And even like mathematic, not too complex, but mathematic functions like, okay, over time we have this deviation, if everything goes in the higher random wait time, we may get up here, we may get down there, so on average we&amp;rsquo;ll be simulating this. It&amp;rsquo;s all so challenging.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, those delays are definitely part of the workload model. In k6, we call them sleep. In JMeter, they&amp;rsquo;re timers. LoadRunner is think time. There are a lot of different terms for it, but basically a delay is some sort of planned sleep in your script that is meant to simulate a real user maybe taking time to think about what they&amp;rsquo;re going to do next, or read the text on the screen, or type out something in a form. And it actually can have a pretty significant impact on your load tests. First of all, if you don&amp;rsquo;t have any think time at all, then you need to be careful that you&amp;rsquo;re not maxing out your CPU and memory utilization on your load generator because that situation where you&amp;rsquo;re just very quickly firing off requests may not be entirely realistic. And I think that if you have think time that&amp;rsquo;s always the same time, like this is what you were talking about, having dynamic ones, if you always use the same value for your think time, you might see the staggering in your results, but that&amp;rsquo;s due to how your test is set up and not at all to do with how your application is responding. And then if you use dynamic think time, like you said, it can make it harder to plan because it&amp;rsquo;s more difficult to know exactly how many iterations your test is going to complete. So there&amp;rsquo;s always trade-offs, right. There&amp;rsquo;s no one way that&amp;rsquo;s always the best way.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And it depends, as well, on what are you actually trying to simulate. As you mentioned, there are times where we put think times that want to simulate a real person using the system. There are some others where you just don&amp;rsquo;t want these events to happen at the same time. To give you an example would be like if your script was a soldier marching one, two, one, two, and you&amp;rsquo;re adding soldiers at the same pace, one, two, eventually they all will be doing the same step at the very same time. If you are simulating a military parade or something like that, that&amp;rsquo;s awesome. You have the test. On that time, you may want that to happen or, or work it out with some rendezvous continuously happening. But if not, if you just want to simulate a regular march or people passing in the subway, they are not like one, two, one, it would be very interesting to see, but that&amp;rsquo;s not how real people walk in the every day. There are situations for everything, and it&amp;rsquo;s challenging at times, as you say, not only wait in between steps, but waiting after you complete a cycle and you want to start another one. There, you may also want some randomization or not to be that static so that your generally load simulations do not have to be that robotic, even if they are done by robots or virtual users. So there are several trade-offs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I have an extension to your metaphor, I think you&amp;rsquo;ll like, Leandro, what if instead, this is a way that your script might change depending on the business processes and the context of the industry. So what if instead of trying to simulate a military, what you&amp;rsquo;re actually trying to do is simulate Fremen running across the open sand, trying to not have patterns in their steps to avoid attracting Shai-Hulud, the great worm. If you don&amp;rsquo;t know the reference, I&amp;rsquo;m sorry. But in that case you do not want anything constant. You want something more dynamic, something that isn&amp;rsquo;t easily noticeable, that won&amp;rsquo;t skew the results as much. Oh, we have a question from ChipsAho. I don&amp;rsquo;t know if it&amp;rsquo;s just the Filipino thing, but there&amp;rsquo;s actually a good packet of cookies that&amp;rsquo;s called Chips Ahoy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ahoy, love them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you are faced with budget constraints, how would you prioritize the workload model to use? That&amp;rsquo;s really good. And they follow up with, as performance engineers, I know sometimes our curiosity tends to get the best of us, trying to see how the system behaves in different circumstances.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Well, answering to, oh yeah, ChipsAho, is from Ahoy, very good cookies, put &amp;rsquo;em in the microwave eight seconds and you&amp;rsquo;ll love &amp;rsquo;em. So it depends a lot, I would say, and your budget constraints, what are you testing would be my question. What risks does your application will face, or what are the most common reasons? Again, there&amp;rsquo;s no silver bullet or single test that will clear all your performance risks ever again that you may have under loads. What loads were you? What things may harm your system? Those are the ones that you need to focus and prioritize based on that risk. If you already tested one, you know that it&amp;rsquo;ll survive, next test, maybe go to the next one and down the ladder, the risk ladder. But first it depends on your system. What is it going to subject to? What are the processes? And the risks may be different a spring ago from today. You may be releasing a new process that is super critical, super dangerous, will be touching databases or doing important or even dangerous queries. This time, you may want to focus on that one. There&amp;rsquo;s no one test to rule them all, one workload scenario, so it depends.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I think there are a few things that I would think about first. What is, like Leandro said, what&amp;rsquo;s the biggest risk? Meaning if there&amp;rsquo;s something where if you don&amp;rsquo;t load test this component there might be security implications, test that. Anything that&amp;rsquo;s critical, like payment or something that might affect compliance regulations for whatever industry it is, meaning like how you handle individuals&amp;rsquo; data, potentially identifiable data, that would be worth load testing. And also anything that&amp;rsquo;s very public, so maybe something like you&amp;rsquo;re about us page is nowhere near as public as your homepage. It can deal your company very significant damage, but hard to quantify damage, in terms of reputation, if your entire homepage is down, rather than if your about us page is down. So that could be a situation where something is not really mission critical or important to the business functionality, but it still would deal a lot of damage. So that&amp;rsquo;s a lot of reputation risk, I guess. A question here not about executors, but we can quickly talk about that. Do we get any performance HTML report in browser k6 load testing? Not yet &amp;lsquo;cause this person specified browser. So I don&amp;rsquo;t think that we have that yet for browser, but there are a few extensions. There&amp;rsquo;s the xk6 dashboard one by Ivan Skiba. And there&amp;rsquo;s also xk6, what is it called, xk6 HTML report or something like that. Go have a look at the session that I just had, the show that I just had with Paul last week, actually, where we talked about this very thing. They&amp;rsquo;re both extensions and they&amp;rsquo;re both awesome. They give like a, the Ivan Skiba one, I think, is the one that you did, Paul, right?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, and actually I was gonna show that a little bit later here.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Okay, all right, well let me know when you want to.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Stay tuned, yeah.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We might as well jump into that, &amp;lsquo;cause I definitely want to show some things about how to actually implement these workload models in k6. So one way that you can do that is by using scenarios. So I have, let&amp;rsquo;s just start with this one. So I have one script here, it is a protocol level script. And I&amp;rsquo;m just putting it in a separate JavaScript file just so this is a little cleaner to look at, so that we can focus on the scenario. In k6, we have something called scenarios that are ways to set things that run independently of each other. So you can have it be consecutive, or run one before the other, or you can have them run simultaneously. So this one just has, this example that I&amp;rsquo;ve got up now is just one scenario and it has an executor. So let&amp;rsquo;s talk a little bit about executors because this is something that&amp;rsquo;s specific to k6. So let&amp;rsquo;s look here. An executor is basically a way to change the way that the load looks. There are a bunch in k6 and I&amp;rsquo;m actually going to, I already, &amp;lsquo;cause I get this question a lot, I&amp;rsquo;m going to put this in the chat because I have this cheat sheet for how to go about thinking, deciding which one to use. So I&amp;rsquo;m going to post it in the chat and we, I think that the rule of thumb is if you want to just try one, you can, or you want a simple one, it&amp;rsquo;s probably ramping-vus that you want. And that&amp;rsquo;s because this is the default one and a lot of load testing tools where you set the number of virtual users and duration and then sometimes you might have stages. This is also what k6 defaults to. So let&amp;rsquo;s have a look. This is what that looks like. As you can see, I have ramping-vus set here, and this is a way to change the load depending on the number of virtual users. I also have these stages here. The first one is kind of like, I was trying to simulate a ramp up. So from when the test starts, this will start with zero virtual users. I&amp;rsquo;ve got that set here. And then it&amp;rsquo;ll gradually ramp up to 10 over five minutes. This is shorter because I think I was trying to, this was from a demo, so I was trying to make it something that we&amp;rsquo;d actually get results from, but this could be, you know, 30 minutes, if you wanted, depending on your test. And then this is kind of what we call steady state, where the number of virtual users doesn&amp;rsquo;t fluctuate. It&amp;rsquo;s just holding steady for this period of time, in this case 10 minutes. And this last one where it goes from 10 virtual users to zero is reflective of a ramp down. Paul, did you want to share your screen &amp;lsquo;cause I know you said you had some things in cloud to show us.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I did, yes. And then unfortunately I wasn&amp;rsquo;t able to share for my script, there&amp;rsquo;s something going on with my system here. But let me go ahead and share my browser, which is working. So yeah.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Awesome.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So this is a script that I had done and what I did was, as I was trying to go through and then figure out all these different executors, I wanted to see the pattern that each of these executors applies. So now here, let me, maybe it&amp;rsquo;s better if I start down here. So this is the actual script that I executed. So if you look here, you&amp;rsquo;ll see that in these scenarios and hopefully, let me see if I can.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Yeah, I was just going to ask.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Paul] A little bit more legible, there we go. I&amp;rsquo;m not the only one that may have old eyes and just can&amp;rsquo;t see. So I loaded up the options so that I would have all these different scenarios. &amp;lsquo;Cause I wanted to see every one of these executors and I wanted to be able to see what kind of pattern that they applied. And originally you&amp;rsquo;ll see that some of these numbers are a little bit different, but these are all the very specific things that each one requires. So in this case, the shared iteration scenario, and again, I&amp;rsquo;m not gonna be the expert on what each of these different executors provides, but they&amp;rsquo;re in the docs. So yeah, we can go through there. I&amp;rsquo;m gonna be working on these docs, as well, in the next couple weeks and try to clean these up a little bit more, maybe make &amp;rsquo;em a little bit more, I don&amp;rsquo;t know, state it a little bit differently or to help my understanding anyway. But yeah, so I loaded this up, so I have each one of the different executors set up. So here&amp;rsquo;s the ramping, so similar to what Nicole was talking about with the different durations. So here over a ten-second period, I had it ramp up to, I think, from zero to 10 vus. And then for 10 seconds I would have it keep going at a level 10, so it would be a flat top. And then the last 10 seconds would be ramping down to zero. All these other ones here, too. So, I put every one of these in there so that way then we could go ahead and compare them and, whoa, let me, all right. So each one of these is kind of denoted here and I guess I can&amp;rsquo;t, I wish I could isolate these and then what&amp;rsquo;s really, I guess, the most important here is the purple line and hopefully you&amp;rsquo;re not, no one&amp;rsquo;s really color blind or missing the color differences here. But yeah, so the purple line is the actual number of the request coming through. And then this blue line, or the aqua, is the actual response time for the service. We&amp;rsquo;ll just kind of focus on the purple line that&amp;rsquo;s what these executors are really affecting more so. And then the gray line, this shaded area is actually the virtual users. So you&amp;rsquo;ll see that here it started at zero, and then it ramped up for a period of time, and then it started kind of flattening, and then it would ramp down. Now this is for the accumulation of all the different executors. Unfortunately, and this might be something I might put in as an issue to possibly add or an enhancement is that each one of these lines here is a scenario. So this actually has the shape from that particular executor. So it&amp;rsquo;d be nice to show the vus in here, as well, but you can kind of infer it based on the activity, the request. So again, that&amp;rsquo;s the purple line again. And so here, you see this executor actually ran pretty quickly to get to the number of requests. I was trying to keep them about the same because I wanted to do, like, a progress bar race. So when I was running this locally, I could see the different areas in which was actually completing the same number of requests faster and all that. But yeah, so this was kind of my playing around and, again, this is on the cloud product. So this is an add feature. But now with talking about the HTML reporting, this is what I actually did here. So let me go ahead and I&amp;rsquo;m gonna go ahead and run this script again. Now unfortunately, you&amp;rsquo;re not gonna be able to see the actual execution as I run it locally, but let&amp;rsquo;s see.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Paul, we got a question about the k6 cloud results that you were showing. Could you create a shareable link so that people can also have a look at it?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Paul] Well, let&amp;rsquo;s see. How can I do that?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] You can go to the three dots in the upper right. Yep, and then share test results.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Paul] All right.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] We can just copy and paste that into the chat.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Paul] Cool.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Leandro] And then they are out into the world.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Paul] Out into the world, yeah. Awesome, cool. See, today I learned again.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Yeah. Awesome. I&amp;rsquo;m so glad you did this, though, because I wanted to, but I didn&amp;rsquo;t get around to doing it. So I&amp;rsquo;m really glad you did.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Paul] Yeah, and then I wanted to actually have them separate so I could kind of show each one&amp;rsquo;s pattern again. That&amp;rsquo;s the thing that I was really trying to get to, and I&amp;rsquo;ll probably put together a blog post, so keep an eye out for that, where I&amp;rsquo;ll kind of go through that, and describe, and show patterns that are created by the executors. And then that is as I learn more. Again, so this is, this dashboard that I&amp;rsquo;m showing here, this is actually an extension. So I did compile this into the k6 binary, custom with this output. And this is available here. This is this xk6 dashboard, and this is also included in our registry on the site, so you&amp;rsquo;ll be able to find this as well. Pretty easy to do this, the xk6, to create the extension and build it. But anyway, we can always give help. Anyway, I&amp;rsquo;m gonna go ahead in this other window, and I&amp;rsquo;m gonna go ahead and start this test running. So now as we see here, and I shouldn&amp;rsquo;t have to refresh, but let&amp;rsquo;s see, go ahead and refresh here. All right. So now this test is running in the background. And then we should start seeing the output. There we go. Now, there is a delay. So behind the scenes, this is actually using, it&amp;rsquo;s creating Prometheus-based metrics and then it&amp;rsquo;s serving that up in a little web server locally. So it&amp;rsquo;s really cool. So I haven&amp;rsquo;t been able to play around with it nearly as much as I need to, but anyway, but this is something, it&amp;rsquo;s a nice little tool to be able to use if you don&amp;rsquo;t want just the plain text display in your console. But yeah, so this test is actually already completed. Now, it&amp;rsquo;s actually still running in a way, though, because we have this externally controlled executor where now from another terminal I could sit there and I could say, okay, yeah, now I wanna ramp up the vus to 10 or that type of a thing, just via rest API. But unfortunately, due to technical difficulties, I can&amp;rsquo;t show you that, but I will definitely put that in the blog post when I start putting that together. Anyway, this is one of those cool little tools with this extension that you can kind of, I don&amp;rsquo;t know, really get some cool results. But yeah, that was the big thing. Here&amp;rsquo;s for the external access, this is the rest API where I could sit there and call that custom executor and say pause testing or even to ramp up the number of vus. Still figuring this out a little bit. It&amp;rsquo;s a little, I don&amp;rsquo;t know, it needs some play around with it a little bit to get a good understanding of it. But yeah, I wanted to show that, again, you can do this stuff, have the graphics there. Now, the HTML report that Nicole was talking about, that&amp;rsquo;s something where, yeah, you could save that off, and again, it doesn&amp;rsquo;t have the graphics, I don&amp;rsquo;t think, if I remember correctly, but it does have it where you could then save that off.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It&amp;rsquo;s not real time either. But it is more like a report.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, yeah. That&amp;rsquo;s it, let me go ahead and stop that test. Oh yeah. So again, I will put together something so that way then if anybody wants these details and obviously you can use that link, so it&amp;rsquo;s now shareable, so I will make sure to not delete it .&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Great. I do want to share something, Paul, if you&amp;rsquo;re okay.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, absolutely.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Great. So I also wanted to talk about the fact that we can do it, you can put together a scenario using different executors, but another thing that you could do is have each scenario be a completely different test. One could be a load test. Another could be a chaos engineering test, for instance. Like this is one that I had where this get Pokemon is an HTTP request that just hits the API. And this is intended to be more of a load test, but then you could have a chaos scenario and you can say that at a certain point, you fire off this thing that then terminates one of the pods in Kubernetes, according to certain conditions. This is using the xk6-chaos extension. But in this way, you can see that these are not just load-testing scenarios. These are just testing scenarios and they&amp;rsquo;re different types of testing that you could use. Another type other than chaos is browser testing now that we&amp;rsquo;ve got xk6 browser. So now you can do things where you have one scenario that&amp;rsquo;s doing some sort of protocol level test and the other one is doing a browser level test. And because those two are fundamentally different, you may want to be able to control them separately. You probably won&amp;rsquo;t be wanting to generate majority of the load with a browser level test, for instance, you probably wanna do that with your protocol level test, but you might want to piggyback off of the protocol test and run a few, like a handful, of browser users just to be able to get some front-end metrics. So, I think it&amp;rsquo;s kind of cool that you can do that. Another thing that you can do with scenarios and executors, well, it&amp;rsquo;s something with workload modeling anyway for k6, this is a script that I&amp;rsquo;ve got for percentages. Now, I think the use case for this, I mean, there are a lot of use cases, but what I actually think this could be used for is an e-commerce scenario where a typical scenario is to have like 100% of the virtual users go into your homepage, and then maybe 50% of them go and browse through the product pages, and then of that 50%, maybe only half of those actually added to the cart. So that is also something that isn&amp;rsquo;t directly related to scenarios and executors, but it does have something to do with the workload model of your test. So in this example, I&amp;rsquo;m setting a random number between one and 100, and then depending on that, I have this combination, in this case, I&amp;rsquo;m setting different clients for it. So let&amp;rsquo;s say that there&amp;rsquo;s a really big client that we want to use 50% of the time, you could use that, and then pass that on to some request that you&amp;rsquo;re sending. And in this way, you&amp;rsquo;re already making something that&amp;rsquo;s more realistic than just get a client, just get details for a client. Well, which client is that because maybe that&amp;rsquo;s being cached? Maybe you do want it to be cached, you&amp;rsquo;d have to see what you want, what you&amp;rsquo;re trying to achieve with that particular test, but it all has an impact on your testing results.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, and if I may add for learning some of these functionalities, it makes, and I think I started a comment how the situations, how the ramp-ups work, how when we want to model these targets in the old days, as I said, getting these, okay, my user takes this amount of time of execution, it has this amount of random timers, and it&amp;rsquo;s a pain at times when your process starts to degrade a little bit of performance, and because of that, they don&amp;rsquo;t go as fast as you need them to, as you want to generate, because you did the calculations based on optimal response times, right. So some of these controls will be very useful depending on the scenario that you are wanting to focus and not to do all that type of crazy math that we had to do. I remember with the load runner days, it was like, okay, but if the response time starts to deviate a little bit, this we need to, there&amp;rsquo;s so much that on this situation with some of these options, k6 can mutate may be the wrong word, but adapt to what you&amp;rsquo;re trying to do, right, and keep doing the loads and doing those processes that you are aimed for. There are some others that you are like, if the system starts to go slow, the users will slow down and that&amp;rsquo;s right, that&amp;rsquo;s okay, that&amp;rsquo;s normal, but on others it&amp;rsquo;s like, no, I absolutely want that the users keep coming, keeps hearing the system, even if the system is slowing or many other things that can start to happen. These controls truly make our lives easier. in so many of those situations like crazy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We have a question from SJ who says, is there a pacing config in k6 or maybe a throughput controller equivalent? So let&amp;rsquo;s talk about pacing, Pacing and load testing terms is related to think time in that it does impose some sort of timing on the requests, but while a think time is more like a direct sleep on a thread, pacing is more like the space between each iteration and there are different ways to achieve this. k6 doesn&amp;rsquo;t have something that is exactly pacing. But for instance, the way that JMeter would do this is by using the throughput controller, which is what I think SJ is alluding to. And so instead of specifying the time between each iteration, JMeter does it by allowing you to set a target request per second, some sort of throughput. And we do have that. Let me just share my screen again. So this is the executors that we have. And I think this constant arrival rate would be the best for that. Because if we look at the example here, you can set a rate here, a requests per second, that is your target. What k6 does is it sends a request or it does one iteration, sees how many requests were sent, and then adjusts the next one, waits a certain time so that before it does the next iteration to adjust to that. So if it already did, you know, 200 requests per second the first iteration, then maybe it&amp;rsquo;ll just do the same thing for the second iteration. And it will dynamically change throughout the test. So maybe at the beginning of the test, response times are faster because not all the users have ramped up yet. In that case, the pacing might be slower because there&amp;rsquo;s no delay on the server side. And so the script is easily hitting the 200 requests per second, but you&amp;rsquo;ll find that later on throughout the test, you may experience higher response times, and in that case, the pacing will be quicker. So that number will be lower so that it still reaches the 200 requests per second.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, it&amp;rsquo;s part of what I was mentioning that easiness of. JMeter, I remember before they didn&amp;rsquo;t have that plugin for the throughput, what was the name, I just forgot about it. At the very first times that we started to use&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Throughput controller.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Throughput controller, thank you. We didn&amp;rsquo;t have those type of controllers, ways to managing them. And again, bringing the load runner days, I don&amp;rsquo;t remember many useful devices to go through this. And on this case, when you have a scenario that at times when we were designing this workflow, this scenario, we would know, okay, I know that per user, I want that in an hour these many iterations happen. So if you want that, you can use the per vu iterations executor that will help you to quickly configure and manage that, you do have the iterations per user, and maybe you have 10 users, 20 users, you don&amp;rsquo;t care about the number of users. Then you select the shared iterations. I just need this throughput to happen this number of times in this period of time, maybe next time I will have more virtual users, maybe next time I will have less. So you have more control on the end game, to call it in a way, that you&amp;rsquo;re looking for, rather than, and I cannot say this enough, it was a struggle to try to control, and simulate, and reach those goals that you were trying to get in your simulation, and there are so many reasons, as I said, the wait times in between steps were randomized before, as Nicole says, you have the pacing times in between each cycle, and it was so many, like three factors, main factors, I would say, wait time, pacing time, and processing time, each step would add up to that time that there are so many variables that were somewhat random that you could not control. So here you would have some assistance, some help on hitting those goals that you&amp;rsquo;re trying to simulate and having it realistic or on the goal that you&amp;rsquo;re trying to reach, right. It&amp;rsquo;s that difference, I don&amp;rsquo;t know if anyone has gym experience or has ever visited one of those things, but they will tell you, hey, I want to work leg today. Okay, do five repetitions three times. That&amp;rsquo;s if you wanna think of that, how long do you take and do each sit up to go, to give an example, that will be your think time, your wait time in between steps. Okay, you need some rest time before you do the next one. That&amp;rsquo;s the pacing. So for the ones that are not so familiar with those terms, just wanted to throw out that silly example.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It&amp;rsquo;s one of those things I&amp;rsquo;d like to, I don&amp;rsquo;t know, I keep thinking of playing around with, you know, if you look at say HTTP audit logs or something like that, they have a timestamp on there as far as when everything came in. Well, if you take that and use that as the basis to basically replay your activity, I don&amp;rsquo;t know, that&amp;rsquo;s one of the things that I keep thinking about, that would be cool to do, or to have, you know, all your activity going into Kafka, and then being able to repeatedly replay the exact same, perfect storm scenario without having the randomness injected in there. I don&amp;rsquo;t know, I&amp;rsquo;m probably going off on a tangent, but that immediately made me think of that, though. It&amp;rsquo;s like this is one of those things where it&amp;rsquo;s like I always kinda wanna play around with this idea.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I think that there&amp;rsquo;s a time for that. I think there&amp;rsquo;s a use case for it, but there are also some disadvantages, I think. that people should be aware of. If it&amp;rsquo;s information from a production environment, there are potentially security concerns there for using a user&amp;rsquo;s data to test or a user&amp;rsquo;s account to test. And what happens if that actually gets replayed on their account, which it could be, it, it might not be. Sometimes it doesn&amp;rsquo;t work, sometimes sending the same request, even if it&amp;rsquo;s exactly the same, won&amp;rsquo;t work. I think that that&amp;rsquo;s, I think, more experimental, I guess, when you don&amp;rsquo;t really know what you&amp;rsquo;re looking for and you&amp;rsquo;re trying to narrow it down, but I also think that once you&amp;rsquo;ve narrowed it down, it&amp;rsquo;s probably easier and cleaner to script it up so that you can consistently reproduce that scenario. And you can also use test data. Also, you&amp;rsquo;d be able to kind of break it down, you&amp;rsquo;d control all the variables, so you know with certainty that when there&amp;rsquo;s only one thing that changed and it was a negative result, then you know that that was the cause of it. But yeah, I think that there&amp;rsquo;s a valid reason to use that, as well.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, there&amp;rsquo;s definitely data sanitization that you gotta be concerned about unless we&amp;rsquo;re replaying activity on Leandro&amp;rsquo;s credit card, then it&amp;rsquo;s okay.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No, please don&amp;rsquo;t. Oops, there are 10,000 charges per hour in your credit card. What?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Load testing your credit card. Navin Kumar, whose videos I was just plugging at the start of this has a question.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Very good question.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Can we intentionally include sleep time in the response time? Now, Mihail, who&amp;rsquo;s one of our developers, if I say something wrong, tell me in the comments, but I believe that there isn&amp;rsquo;t a way, that there&amp;rsquo;s no k6 specific function to do this or option. What I&amp;rsquo;m thinking of is you could create a custom metric because you can create really a bunch of different metrics, counters, and timers, and gauges, and whatever in k6. So you could definitely do that and have that reported and you could set the timing manually, as well. Another thing that I&amp;rsquo;m thinking of is if I had to do this, I&amp;rsquo;d probably just use the xk6 browser extension, because that&amp;rsquo;s already going to include everything, the actual render time. &amp;lsquo;Cause now we&amp;rsquo;re getting, if you&amp;rsquo;re including the sleep time or the think time, this is more like getting into the front-end performance side of things and I think it might just be easier to do that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;That was gonna be kind of a question that I wanted to do, too, Naveen. Like why do you want to include the sleep time programmatically that you are generating in your script? I mean, as you say, Nicole, the front end is important to know those render times, those wasted moments in the response or back-and-forth communication, but what are you trying to use it for? It would be very interesting if you can share it. I&amp;rsquo;m curious what&amp;rsquo;s the use. Oh, okay, you were just being creative.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, I think that, yeah, probably if you want to just see front-end experience, I do think it would be more useful if in this case, if you&amp;rsquo;re including it in the response time, then maybe have a constant sleep, actually, because then it&amp;rsquo;s consistent because you don&amp;rsquo;t want the sleep to be influencing your results.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I did use something like that a long time ago, but precisely to model this workload to calculate. I generally recommend do a small-ish version of the load test that you want to do, let it run for a while so that you can massage those values of how much random time to sleep here, how much random pacing you have here, and how is the response time affected so that you can balance it out. That could be an interesting use, real-life example, but that&amp;rsquo;s a good question, as well.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I mean, injecting a network latency and things like that is always a nice thing for backend services. I mean, with microservices, because one single API call on the front end could be going through 10 different microservices ultimately. And to be able to test something where if halfway through those calls if you have a network hiccup where one of the services is not accessible, but it&amp;rsquo;s, anyway, but it&amp;rsquo;s all one of those things where it&amp;rsquo;s like this feels a little bit more on the chaos engineering aspect of things, you know, how is your application going to behave when something goes wrong? If all of a sudden your network grinds to a halt where it&amp;rsquo;s going really slow, is your application handling that scenario appropriately?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Okay, and on that note, we are actually a little bit over on time already, that went by really quickly. Thank you both for coming and for sharing your thoughts on these topics and also for demoing the k6 cloud stuff that you already had, Paul. Yeah, you are welcome back anytime and I hope we do this again. And for everybody,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I thought that was the last one.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oh, well, sorry to disappoint you. You&amp;rsquo;re stuck now, like you&amp;rsquo;ve signed the contract, that was it. You didn&amp;rsquo;t read the fine print. Must come to office hours every Friday.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This would be the last time that you would want me on here.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Well, for those of you who are watching, thank you for watching. Thank you for all the awesome questions we got this week and have a good weekend. And if you are in a place where it&amp;rsquo;s very stormy, good luck, hope we all survive it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Stay safe.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bye everyone, have a good weekend.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Take care everyone, adios.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Getting started with using k6 extensions, with Paul Balogh (k6 Office Hours #41)</title><link>https://nicolevanderhoeven.com/blog/20220211-koh41-getting-started-with-xk6/</link><pubDate>Fri, 11 Feb 2022 18:00:24 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220211-koh41-getting-started-with-xk6/</guid><description>&lt;p&gt;In this week&amp;rsquo;s k6 Office Hours, I was joined by my new colleague &lt;a href="https://twitter.com/javaducky"&gt;Paul Balogh&lt;/a&gt;, to talk about his experience in joining the k6 team and his first impressions of the xk6 extension system.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/d_xpsKz-pSA?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Using Executors and Stages in k6 with Théo Crevon (k6 Office Hours #40)</title><link>https://nicolevanderhoeven.com/blog/20220204-koh40-executors-and-stages-in-k6/</link><pubDate>Fri, 04 Feb 2022 20:01:12 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220204-koh40-executors-and-stages-in-k6/</guid><description>&lt;p&gt;Today, Théo Crevon, one of our newest Senior Software Engineers at k6, joined me and my colleague, Leandro Melendez, to talk about his experiences in joining k6, and why scheduling in a load testing tool is simultaneously difficult and important to get right.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/wj3KjJth1SU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Señor Performo's Week of Load Testing (k6 Office Hours #39)</title><link>https://nicolevanderhoeven.com/blog/20220128-koh39-leandros-week-of-load-testing/</link><pubDate>Fri, 28 Jan 2022 23:27:47 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220128-koh39-leandros-week-of-load-testing/</guid><description>&lt;p&gt;This week for k6 Office Hours, I talked to one of the newest members on our team, &lt;a href="https://srperf.com"&gt;Leandro Melendez, aka Señor Performo&lt;/a&gt;, about his experience in joining k6/Grafana Labs. We ended up talking about performance &amp;ldquo;deadly sins&amp;rdquo; and how the practice of performance engineering has changed in the last decade.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/bi-RuT9eZdA?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to Do What Kind of Testing When: Testing Types by Scope</title><link>https://nicolevanderhoeven.com/blog/20220122-how-to-do-what-kind-of-testing-when/</link><pubDate>Sat, 22 Jan 2022 16:42:49 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220122-how-to-do-what-kind-of-testing-when/</guid><description>&lt;p&gt;Correctly identifying &lt;em&gt;when&lt;/em&gt; you test could be just as important as &lt;em&gt;what&lt;/em&gt;. Below are types of testing according to scope.&lt;/p&gt;
&lt;h3 id="static-testing"&gt;Static testing&lt;/h3&gt;
&lt;p&gt;Static testing occurs when requirements are written. Question requirements and spell out what each one means.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Concerns:&lt;/em&gt; Setting up a system to track and link requirements to test cases, negotiating business needs with technical feasibility, clarifying scope.&lt;/p&gt;
&lt;h3 id="unit-testing"&gt;Unit testing&lt;/h3&gt;
&lt;p&gt;Unit testing occurs when coding begins. Practice Test-Driven Development by translating requirements into tests before writing the code.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Concerns:&lt;/em&gt; Treating test code like application code, getting developer buy-in, communicating technical implementation, performance, pair programming.&lt;/p&gt;
&lt;h3 id="system-testing"&gt;System testing&lt;/h3&gt;
&lt;p&gt;System testing occurs when a build is released. Employ black-box testing: step back from the code and assess the feature as a whole for consistency.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Concerns:&lt;/em&gt; Adherence to common design standards, equivalence partitioning, boundary value analysis, fighting scope creep, usability, creating test data.&lt;/p&gt;
&lt;h3 id="system-integration-testing-sit"&gt;System integration testing (SIT)&lt;/h3&gt;
&lt;p&gt;SIT occurs when integrating multiple components. Use white-box or grey-box testing to target the interactions and traffic between components.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Concerns:&lt;/em&gt; API testing, stubbing and mocking, identifying request paths throughout the system, performance benchmarking, observability and analysis.&lt;/p&gt;
&lt;h3 id="business-acceptance-testing-bat"&gt;Business acceptance testing (BAT)&lt;/h3&gt;
&lt;p&gt;BAT occurs when the code is assessed against overall business goals. Seek out SMEs who can help you verify expected outcomes.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Concerns:&lt;/em&gt; Adherence to business requirements and regulations, process testing, simplifying request flows, identifying potential customer pain points.&lt;/p&gt;
&lt;h3 id="user-acceptance-testing-uat"&gt;User acceptance testing (UAT)&lt;/h3&gt;
&lt;p&gt;User acceptance testing occurs before code is released to production. Map test cases to requirements and test real-world scenarios.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Concerns:&lt;/em&gt; Testing for superuser workflows, data cleansing, verifying real user behavior from historical logs, exploratory testing, end-to-end performance.&lt;/p&gt;
&lt;h3 id="regression-testing"&gt;Regression Testing&lt;/h3&gt;
&lt;p&gt;Regression testing occurs between builds. Supplement a robust automation test suite with nuanced manual test cases that address known problem areas.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Concerns:&lt;/em&gt; Setting up a CI/CD pipeline, deciding what to automate, consolidating test and development tools, tracking failures over time.&lt;/p&gt;
&lt;h3 id="question-everything"&gt;Question everything&lt;/h3&gt;
&lt;p&gt;Remember: &lt;strong&gt;testing is an attitude.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Canonical Observability with Simon Aronsson and Michele Mancioppi (k6 Office Hours #38)</title><link>https://nicolevanderhoeven.com/blog/20220121-koh38-canonical-observability/</link><pubDate>Fri, 21 Jan 2022 18:23:47 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220121-koh38-canonical-observability/</guid><description>&lt;p&gt;Today, my former colleague &lt;a href="https://simme.dev"&gt;Simon Aronsson&lt;/a&gt; brought his &lt;em&gt;new&lt;/em&gt; colleague, &lt;a href="https://twitter.com/mmanciop"&gt;Michele Mancioppi&lt;/a&gt;, to k6 Office Hours to talk about observability, and how they do it at &lt;a href="https://canonical.com"&gt;Canonical&lt;/a&gt;. It turned into a great conversation about trends in observability from the last decade, and how it relates to performance and reliability testing.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/SD5Y4QejEu4?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="transcript"&gt;Transcript&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Hello everyone, and welcome back to the first k6 Office Hours of the year. Happy 2022, I&amp;rsquo;m Nicole Vander Hoeven.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And I&amp;rsquo;m Simme, we&amp;rsquo;re back from the dead.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And I&amp;rsquo;m Michele.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Simme is back. Yes, so Simme unfortunately is only temporarily back, and he&amp;rsquo;s brought his new colleague. I mean, I&amp;rsquo;m kind of sad, but I&amp;rsquo;m happy to meet you Michele Manciopi.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Hello everyone.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Welcome. Simme why don&amp;rsquo;t you first tell everybody, how you betrayed us at k6.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sure, I&amp;rsquo;m so sorry for that, was a couple of months ago now. I think I quit at k6 in October, beginning of October something like that, to join Canonical and Michele, where we are trying to build a really awesome observability stack to know little part built on top of Grafana products.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, it has been a very interesting three months. It&amp;rsquo;s actually a pretty refreshing to be able to use high quality software and compose it in ways that are, you know, they just work through, cool.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So we already have a few people in the peanut gallery, there&amp;rsquo;s Simme and Michele and our newest colleague, I think senior performer, all saying hi to you Simme. so you&amp;rsquo;re very much missed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Congratulations to k6 for bringing Leandra.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Definitely, and by the way, Leandra will be on k6 Office Hours next week, he just accepted the invite. So when I&amp;rsquo;m letting him like relax, and do his bootcamp onboarding things, and his week of load testing this week. . Ooh Danielle is here as well. Michele, why don&amp;rsquo;t you talk about yourself, and what you do at Canonical?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Well, I am a product manager at Canonical, for observer BD team. I was brought in with the goal of making the entirety of the product line of Canonical observable. Canonical is chiefly known for Ubuntu, but we have like a meter other products and they all need to be observable because they all sit at different levels of critical pieces of the infrastructure. Before Canonical, I was the technical product manager at Instana, which has been what baby ham it&amp;rsquo;s a product that does very automated observability. It&amp;rsquo;s mostly proprietary, but it was a lot of fun trying to make observability the way it&amp;rsquo;s supposed to be. That is seamless. Very easy to roll out. Before that I was at SAP where I was the technical lead of the performance team for SAP cloud platform, where my job was mostly to figure out where things were slow and fix it. And then I realized that rather than helping one single developer at the time, would they be more productive in actually providing pretty decent tools to do that at scale so people could do it themselves, which then brought me down the path of figuring out it&amp;rsquo;s actually fun here to make an observability product than it is to using one. And then the CircleCI.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So Simme what was it about Canonical that won you over?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I actually think it was to no little part Michele won me over with his argumentation for&amp;ndash;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Okay. I&amp;rsquo;m taking him off the stream sorry. No, no, No.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;lsquo;Cause I got you everyone, bye.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No. We&amp;rsquo;re still all friends.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I do really miss the k6 family for sure. But yeah, it was just such a cool and exciting opportunity to be able to make this huge leap in observability with Canonical, for such a vastly used project or suite of tools and products. So that&amp;rsquo;s mainly one of them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m sorry. Can we stop to remark? That was the coolest cup I&amp;rsquo;ve seen in a long.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It is as if this is sponsored, this is a hydrate spark, it&amp;rsquo;s a smart water bottle. And it&amp;rsquo;s marketed like for people like me because it&amp;rsquo;s a water bottle, but it has Bluetooth and LED light. So, you know, obviously I had to buy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, just out of curiosity, what are the key values of the Bluetooth support?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oh, it tells me when I need to drink water. It&amp;rsquo;s very important stuff.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How do you monitor that A, the Bluetooth is working and how do you receive those notifications?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Well, it&amp;rsquo;s funny that you ask, there is an app for it. This is totally not sponsored. Okay. But there is an app for it. I was gonna say Simme that it seems like there was a slight change in your focus as well, because at k6, we&amp;rsquo;re more focused on the performance and reliability testing part of it. But definitely we&amp;rsquo;ve also dabbled in the observability space, especially with the acquisition of Grafana. So it seems like your new role is also more focused towards observability. Was that one of the considerations?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sure it is. And then that was definitely one of the considerations during my, what is it now? 12 or something years in tech, I&amp;rsquo;ve been doing way more observability and monitoring work than I&amp;rsquo;ve been doing performance testing. And so that definitely felt like coming home in a sense to me.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And I wanna ask you both this because you&amp;rsquo;ve both been in observability for awhile. How do you think observability and performance testing go together? Do you see them as separate disciplines entirely, there&amp;rsquo;s clearly some sort of overlap, right? Should companies be doing both, one or the other?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I definitely think there is a lot of overlap. One thing that I know that you and I have been pushing forward when we&amp;rsquo;ve been discussing this previously on the stream is that performance testing is great, but it usually only allows you to do a black box perspective testing, right? You&amp;rsquo;re able to measure the performance of your system, given certain interfaces or end points that you are able to observe the performance off and pairing that with observability tools, like for instance, loci or tempo, or Prometheus&amp;rsquo;s allows you to really drill back into the stack and figure out what is causing those problems. So I definitely think that it makes sense to combine the both to be able to observe the whole system and not just the edges of it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Do you agree with that Michele?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, very much, over go and say that actually, it&amp;rsquo;s very hard to draw a demarkation between the performance and of observability, especially since in the last few decades and the increasingly disproportionately larger role that internet and internet systems taking our lives. We have come to see, you know, slow as the new down, which means that not only the software needs to work but it needs to be fast. And if you observability is fundamentally the art of understanding, are there problems? I mean, so how bad was impacted and how badly, and that is both in terms of software, it is broken as software is luck. Many of the techniques that you would use in, for example, a QA system to check the scalability of your software is something that you can use at scale in production to make sure that you&amp;rsquo;re at least carrying that much load, as well as techniques for example, for performance testing, you often do a lot of black box monitoring. The techniques that you use to check if today in SIL on a mobile connection, your web store is reachable is very similar in terms of technologies and capabilities and as technical requirements. So the technology is there to use, to throw a lot of requests security to your software. So it&amp;rsquo;s fundamentally the performance tools are versatile like that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, I totally agree with that. I have always taken the stance that it&amp;rsquo;s definitely better when you have both of them because observability is great. But then in pre-production environments, it can be a little tricky &amp;lsquo;cause you don&amp;rsquo;t have real traffic and that&amp;rsquo;s where performance testing can come in handy and performance testing is great, but you don&amp;rsquo;t always want to run it in production. And also you, it&amp;rsquo;s not always a good idea to be reliant on the results of the performance testing tool. You know, sometimes it makes a lot more sense to be already using the same observability stack that you use in production. And I also want to call out that performance testing is often thought of as load testing, but that&amp;rsquo;s really just one kind of performance that is being measured there. And so what about a related topic to observability as monitoring? I know Michele, you have a lot to say on that topic.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oh my, can I rant?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yes. Go ahead. I&amp;rsquo;m familiar with your blog posts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ooh influence. I have a &amp;ndash;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I do research, you know.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I thought you came across it because, you know, super rabid spike. No, the, so I have been around the observability industry for awhile and I have a certain annoyance towards what the industry has done by rebranding perfectly good monitoring and application performance tools in terms of the hot new term up observability that you need to sell to sort of the software. The way I see it&amp;rsquo;s a much more formal, shall we say way. Observability is a property that you want your systems to have, monitoring is the way that we have to make most systems observable. However, something that I hope we will see in our lifetime, our software systems and such a level of quality and standardization in our profession of creating software systems. So that monitoring and observability becomes build team in the softwares we create. If you think about it all the for example, automatic distributed tracing and all the amazing innovations that have occurred over the past 15 years are effectively reckoning the lack of observability as a functional requirement of a piece of software. Monitoring is the art to collecting data.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, and I think that there&amp;rsquo;s also a connotation of monitoring being a bit more passive. Would you agree with that?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Not necessarily, no. At the end of it so there is, I really take the view that monitoring is a means to the end of observability. It is true that in the past few years, with new generations of tools, we have made leaps and bounds in both the capability of collecting useful telemetry with very little work in terms of toil to roll it out, without the proper tools are there and I used to work for one where you deploy an agent and it automatically discovers all around it. There is a lot of dark magic going on, but it works. And then it becomes very cheap to actually get to the holy grail of monitoring that is to have as little silos as possible. Telemetry wants to have friends. You want to see end to end systems how they relate to one another. Now, the moment that something that has changed recently in the industry is we have gotten better, not only at collecting telemetry, but analyzing it. When you compare monitoring tools that we started with right there the Nagios of the world. You&amp;rsquo;ll need it to know in advance what you were looking for. Now with broader collection of telemetry, for example, distributed tracing, a very powerful type of telemetry, very little underutilized in terms of the insights can provide you, you end up having a lot of data that is likely going to be useful, and you have much more freedom in how you analyze it, both in terms of discovering issues as they occur, as well as afterwards in terms of post-mortem.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I do have, however one, I agree with you completely Michele. I do however, think Nicole has a point in that if you look at the traditional monitoring tools that people used to use, like Nagios for instance, it was always this very weird situation where you put up SNMP traps or collected, you know, logs that were thrown at you in a very passive manner. But I would say that it turned monitoring itself has come to evolve into a state where it very much is an active practice in the same way as people would describe observability.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oh. So you are making a very interesting distinction of rather than receiving as a data sync telemetry that was emitted, but something else that you go and get it through RTI, things like deploying an agent that does stuff. That&amp;rsquo;s pretty interesting.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah. Or for instance, actually triggering a synthetic test that just prompts a common user flow and make sure that that still works. I mean, as compared to just admitting this passive telemetry data that just keeps rolling on, but maybe lacks the context as you put it on more advanced workflows where you&amp;rsquo;d correlate multiple sources of data or the multiple actions to derive your data that you want to.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It is true that in the past 15, 20 years, there has been an increase of active monitoring. I remember doing it back in the day with smoke tests that were of a crunch up every 15 minutes. I was so young. And now it&amp;rsquo;s that it&amp;rsquo;s kind of a baseline of observability. I mean, you need to want to catch everything, but if there is catastrophic failure, you will know hopefully before someone starts opening tickets or you&amp;rsquo;re upping your drops. Yeah.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah. I think Simme it was right when he was saying, what I was talking about was like the more traditional approach that it&amp;rsquo;s just something that&amp;rsquo;s there in the background whereas these days, the way that it should be done is a lot more proactive.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And also they focus on actually gathering telemetry to be able to detect failure modes rather than probing for a certain thing. It used to be much more focused on a single point that you would probe for data. And&amp;ndash;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It used to have simpler software too.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We sure did.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, that&amp;rsquo;s for sure. But I also wanted to say that there&amp;rsquo;s also been, there&amp;rsquo;s still some push based monitoring, but we&amp;rsquo;re also now seeing more poll based monitoring systems, more event driven ones. And I think this is all the evolution of monitoring and observability, right? Because these things did not exist not too long ago.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;To be fair, the one should, it is pretty true. We have much more pool and pool length. This is something that a permit use has pretty much popularized with the concept of scraping, but there are entire domains where we deploy a software that is still very much push based. For example, IOT, for very basic reasons of network visibility, it&amp;rsquo;s very hard to go and reach out into someone else&amp;rsquo;s rooftop and go get the data. So there is still the mechanics of push buffer and pulled it for example, gave us in the primitive ecosystem, push gateway mechanism.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Grafana agent that actually sits in between you and a cloud service or something else, and allows you to not punch holes in your firewall, but rather reach out and deliver data to something.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, it&amp;rsquo;s kind of like you mentioned that our applications in general are just getting more and more complex, it reminds me the push the trend from monolith to microservices and then now some people are also going back. It&amp;rsquo;s never really gone, right. And it&amp;rsquo;s really difficult to say, no, this is the new way, nobody else is doing or should do the other way. It&amp;rsquo;s not really like that. A lot of things in tech are cyclical.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When I actually spoke about our systems are getting more complex. I was thinking exactly of micro services because we made a trade as an industry for very, very simple, very small components. And then pushing all the complexity that you cannot make disappear under the carpet of service meshes, many containers, things that need to be versioned independently remain compatible, which is actually one of the main drivers why in the observability industry, we moved from the very traditional, I don&amp;rsquo;t like the word pillars, but the very traditional telemetry types of logs and metrics with the occasional sprinkling of profiling to rather extensive use of distributed tracing because all of a sudden the problem was less often in the single simpler components and much more often in between.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;But this is kind of a funny conversation to me &amp;lsquo;cause I don&amp;rsquo;t know if you remember, but 10 years ago we used to talk about microservices as well, but then we called it service-oriented architecture and it wasn&amp;rsquo;t the new cool thing. And then we decided that that was kind of cumbersome and powerful to work with. And we started to merge together our software, again, introduced monoliths.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;But in a service record architecture, we tended to have a very expensive, very large piece of machinery called the enterprise service bus that actually was providing to some extent that kind of visibility that today we need to have through tracing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And let&amp;rsquo;s also not discount the effect of the proliferation of cloud providers, because when you have your own data center and your audiences, maybe your internal company or something, maybe it is a good thing to go from one huge complex monolith to three simpler services. But when it&amp;rsquo;s not three, it&amp;rsquo;s like hundreds, maybe then you start needing like another layer to orchestrate and manage and all of the traffic between each of those components. It&amp;rsquo;s definitely not that clear cut to say which one is better.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I definitely think you&amp;rsquo;re bang on in that case, Nicole, &amp;lsquo;cause we&amp;rsquo;ve moved from maybe having a couple of software devs for a company that did some kind of HTML that website with some access database backend in the worst cases, right? We now have these huge teams of hundreds of developers that are all working on a compost system together. And having that as a monolith would in practice require us to either do these huge orchestrations of release trains that no one is able to do in a proficient fashion. Or we would have to have downtime all the time &amp;lsquo;cause we would need to redeploy everything every time we made a change. So in that sense, it really makes sense to split it up as we grow our teams and we grow our development efforts as well.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I have a rather, so coming from a very enterprise background I have a rather newest feel to be on the subject. And my take is that usually technological problems are not technological problems, there are people problems. One of the main motivators that was towards going to the extreme distribution of microservices. &amp;lsquo;Cause I tried to fight back against the Conway&amp;rsquo;s law. The fact that roughly the architecture of your system mirrored the architecture of your organization. So we said, look, we have all these teams, these pizza teams, it&amp;rsquo;s very hard to make them cooperate to create a well-behaved monolith. So let&amp;rsquo;s give each of them their independent infrastructure and talk over standardize protocols like most of the HTTP and some sort of RPC built on top of it. And that would provide for them a way to be productive independent of each other.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Exactly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As an industry, we dramatically underestimated the cost and complexity that comes from the need of coordination and compatibility and understanding among these teams, because now you no longer have one code base that you can run tests against. You have to have multiple ones that may interact surprisingly at Atlanta. These for example, has led to introduction of contract based testing, where teams contribute to each other interface tests. And there&amp;rsquo;s also the saying, which is something that is a harsh reality that every observable behavior of an application with a large enough user base, will become a dependency for somebody somewhere.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I think this is the whole premise of Conway&amp;rsquo;s law, right? The idea that our architect, the software architecture or the infrastructure that we put into place in a lot of ways starts to evolve depending on how our team is structured. And I think it&amp;rsquo;s both a technological and a human problem as well. When you talk about coordination between teams or between services, it&amp;rsquo;s really the same thing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah. We have made actually strides in how easy it is to make software inter operate with each other. If you go back, we started, we were talking about SOA. SOA came with a curse called SOAP. It was incredibly complicated, mindbogglingly hard to make run at scale. Today, we have a bunch of, so we are using HTP for other things. Sometimes I would think too many, we have good stuff like GRPC, like arrow, a lot of different protocols that can be very efficiently used to either make a synchronous message passing happen or synchronous invocations. We have a lot of tools that in the past year and half, I think we&amp;rsquo;ve got the big two trigger happy in deploying a lot of new tools in production. And I&amp;rsquo;m saying this with a background of someone that fundamentally had to support every single piece of technology that made input or output, for example, on Java. It would surprise you how many different HTTP clients for Java are I think in production, I lost count. There were 50, it&amp;rsquo;s insane. And I&amp;rsquo;m, for example, you raised your mark right with a very, very beautiful LED and Bluetooth. And it&amp;rsquo;s super cool. I feel&amp;ndash;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I was trying to share something that Simme was sharing there, but I can&amp;rsquo;t actually see it for some reason. Oh, there it is.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It&amp;rsquo;s okay.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;What&amp;rsquo;s this Simme?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I love to say, I like to bring out this picture whenever we talk about why observability is needed. &amp;lsquo;Cause while it&amp;rsquo;s a lot larger than most of us operate with, and it&amp;rsquo;s still very striking that they think this is supposed to be Netflix&amp;rsquo;s is a microservice architecture at some point, whether it is or not, I don&amp;rsquo;t really know, but it&amp;rsquo;s supposed to be and trying to&amp;ndash;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Can I be trashy? Can I be able to trashy?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Thank you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Architecture has an element of deliberation that they do not believe there&amp;rsquo;s an actual out of the system has, this is an emergent system is a lot of architectures that then meshed into something.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Definitely.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It&amp;rsquo;s remarkable that it works so well.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah. And one of the cool things there, I think is the fact that without observability where this big ball of yarn, it would be completely unfeasible to reason about anything this system is doing at scale. You wouldn&amp;rsquo;t be able to reason about the particular part, maybe that you are working on one of these small dots that we can&amp;rsquo;t even see because of all the lines. But to reason about what it does is as a whole would be completely unreasonable. But with tools like, for instance, distributed tracing, we&amp;rsquo;re suddenly able to follow end to end an action of a user or an agent within this system. That was all I wanted to think of that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I love distributed systems, distributed tracing in distributed systems, because it actually gives you the means of answering the most important question or you&amp;rsquo;re faced with an issue, who is affected and how badly? When you go on an enterprise setting and our people are often databases service, your application completely blowing up, could be a drop in the bucket of their system. They will not probably have the central entry you have to have a very different take on priorities unless you have agreed upon a slice on the silos and the failure that you are fundamentally up streaming through your users may not be their concern, but the moment you have the shooting tracing, that goes from the deepest database to the device in the face of your user, yet you have a very clear perception of how bad is something that is the one most important piece of information that you need in front of your face when the pager goes off again at 3:00 AM, you need to decide whether it&amp;rsquo;s time to go on to Batman, or if it can wait until the third coffee tomorrow morning.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I think that&amp;rsquo;s the real success of the &amp;ldquo;Squid Game&amp;rdquo; right? Because that image that you had up Simme, and just imagine that times 114 million users that are potentially using many of those systems, it&amp;rsquo;s amazing that it works at all at that scale, especially.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Something that always gives me those thoughtful moments of, oh my God, what are we doing as an industry? Is that a potentially simple issues have disproportionate impact on popular services to the life of many, many people. It goes from lack of entertainment. You&amp;rsquo;re there you want to see the latest, &amp;ldquo;Witcher&amp;rdquo; episode, cool stuff. You&amp;rsquo;re disappointed if the thing is on top, multiply that by a medium people that cannot get there, there are fix, Hey, you have a significant amount of life around that has gotten worse, but it goes also to something that is maybe much more limited, but much more tragic. For example, when I was working at SAP, one of our customers was, I cannot say the country, but it was the first aid response service of one of the countries. We were scared plus that something so important that either the platform, because downtime would have consistent consequences to real people, something that we have seen recently with the move to the cloud and the disproportionate role that for example, U.S system one has on everybody&amp;rsquo;s life today. We have seen how the risk is getting more and more concentrated into fewer and fewer, very large, very complex, very reliable, but critical pieces of infrastructure, in ways that I do not believe as a society we have had yet. And that is where it really humbles me as an engineer to think, well, this has to work, right?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah. We went through that in, I think in the last k6 Office Hours, I had somebody from oil funk, who is an emergency services provider in Austria, and it was cool, but also a little scary to find out that they are using k6 for, in part to also handle the traffic from the 112 emergency hotline. So it&amp;rsquo;s cool to see something that you&amp;rsquo;re working on, be used in such a critical industry, right. But at the same time, it&amp;rsquo;s also a little scary because it could actually be lives that are lost if you know, we don&amp;rsquo;t do our jobs well enough, it&amp;rsquo;s a little humbling to think of that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I guess the closest resemblance we&amp;rsquo;ve had to these critical infrastructures that everyone relies on would it be like the transatlantic Telegraph cable? I mean, that has like in, I think it&amp;rsquo;s currently 19 cables or something like that, that make up the transatlantic telephone cable. But I really any catastrophic failure there would really isolate us in terms of cross continental communication.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;But that is less likely to result in loss of life. Then, for example, your neighbor want service, not being able to follow you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For sure.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m sorry for having completely spoiled the mood. I think that as an industry, we need to go in deserve the role of engineers. If we built bridges the way we push software to production, in some cases, I don&amp;rsquo;t think anybody would cross a river without crossing themselves first.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;What&amp;rsquo;s interesting is in that spaghetti soup of microservices that you showed Simme, now we&amp;rsquo;re seeing that our observability stack is part of those. They are also contributing back to the system that we have to monitor. I don&amp;rsquo;t know if either of you saw the post-mortem by roadblocks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It was classic. I had ops to them. It&amp;rsquo;s a, we have all been there.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yes yes. Do you have to talk about it Michele?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I do, but I don&amp;rsquo;t think I would be able to be nearly as good as a Simme for this.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I just came to be honest. So I don&amp;rsquo;t have any detail commentary on that either.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It was the classic fallacy of oh jolly, oh golly. The same infrastructure that is powering my observability system was probably the system that went down.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;All right. All right. Yeah, that really is something that you&amp;rsquo;ll see a lot. I mean, for instance, say that you have a deployment of the classic Grafana suite somewhere, and you have that running in the same data cluster maybe, or at least the same cloud provider as you have your critical workloads and to make it even worse, you could go down to having it in the same geographic region, or even on the same cluster nodes or the same hardware that you&amp;rsquo;re using for the rest of your critical infrastructure. When something goes south there, in terms of your critical infrastructure, it is likely that that was all will also, as I think, where to kick would roadblock, spill over to your monitoring system. And if that happens, how are you gonna be able to tell that you&amp;rsquo;ve been hit?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This is the classic blast radius question. Everything has failure modes, actually, several of them, and the more abstractions we deploy, the more failure modes we introduce, for example, Simme and I are building an observability system based on Kubernetes natives. Our guidance is if you deployed, deployed to a different cluster on different hardware, because you should never put the monitoring system on the same infrastructure, close to the infrastructure stuff we monitor.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It&amp;rsquo;s not only that. We also usually recommend that if you deploy our monitoring system, deploy another monitoring system that makes sure that your monitoring system is up and set them up in a, what did they call it? That dead mans trigger?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The dead man switch is the idea that, for example, do you know in the movies when the hero goes in front of him and says, if you kill me, you will be exposed in two days time. That&amp;rsquo;s the classic deadness which is something that happens unless someone periodically goes there and tells him not to. In this case, in the case of monitoring is unless your system, your monitoring system is telling you that it&amp;rsquo;s fine, assume tragedy. It never goes to the level of a specific use cases, but first of all, you need, let me take a step back. The best monitoring system is the one that tells you whether it&amp;rsquo;s something to look at, right? You actually do not want to have dashboards, however, colorful and beautiful in front of your face all the time, unless it is for Ferguson purposes, you actually want to be able to focus on something else and jump into the action when stuff is hitting the fan. In order to do that, you must have the guarantee that is the easy model of notification. You will receive it because silence, you want to know that it means that it&amp;rsquo;s good. You don&amp;rsquo;t want to have to doubt if there is something going on that my sister should tell me but doesn&amp;rsquo;t, which is why you set up fundamentally a health check thing that says I&amp;rsquo;m thinking here and all it&amp;rsquo;s fine. That is the diagnose switch.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I found it so interesting to read through the post-mortem and props to them too, by the way, for releasing something so detailed, they were not afraid to, you know, say what they&amp;rsquo;d done wrong and what they were doing to address it. I thought it was really well-written, but I want to read one part of it, because I thought it was so good. They said, &amp;ldquo;There was a circular dependency between our telemetry systems and console, which meant that when console was unhealthy, we lacked the telemetry data that would have made it easier for us to figure out what was wrong. We&amp;rsquo;ve removed the circular independency, our telemetry systems no longer depend on the systems they&amp;rsquo;re configured to monitor.&amp;rdquo; I thought that was a great takeaway from that whole incident. And because they&amp;rsquo;ve shared it in the post-mortem, they&amp;rsquo;re not the only ones who can learn from it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Very generous of them to expose themselves that way and actually left the rest of the industry learn from their mistakes. And so hard work as you said, Michele, our love to the team at the roadblocks who probably need needed a bit of time out after that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;But there is also another component of a human component here. They did the right thing. They reestablished trust. They are telling us, we learned from our mistakes so that you can as well. In the scope of monitoring systems, trust is the ultimate currency because a monitoring system is literally a measurement system for the health of other systems. If you cannot trust your measurement system, what is the point of it?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And you usually only get one go with that as well. If you burn that trust, it&amp;rsquo;s gonna be very, very hard to build up again.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So this is something that touches me very personal because I used to work on a solution that was exquisitely powerful, but therefore also very complicated and complex. And the moment you have automation, someone somewhere sometimes is going to be broken by it. And reestablishing that trust was never easy and sometimes impossible depending on the scale of failure that you&amp;rsquo;re well-intended means of automatically monitoring something I should have brought to the customer. Something that we seldom say as an industry, when we try to sell a product to somebody else, is that everything has a cost. If you want to take away complexity from you to roll out very simple systems and set up that thing, reports stuff over there, and you want it to automatically, there&amp;rsquo;s a higher risk that the automation will cause an issue. Of course, that in many cases is a justified risk. You can roll out the monitoring gradually and the easier it is to roll out a monitoring system at scale, the more you reach the holy grail of monitoring, that is the network effect. The moment that you can start observing how issues in systems propagate, correlate, or are not correlated there is something very important.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So let&amp;rsquo;s talk a bit more about the characteristics of a good observability stack. We&amp;rsquo;ve already mentioned a few we&amp;rsquo;ve mentioned that, it should be independent as much as possible from the systems that they&amp;rsquo;re trying to monitor. We&amp;rsquo;ve also said that maybe we should also take into account the human side of things rather than just the technological. Maybe you should tailor the complexity of your observability stack to the size and experience and structure of your teams. What are some other things that you both could name in your ideal observability stack?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;One thing that I really like to highlight here is the ease of use or the economics of the system that you are using. I used to do a analogy to how EpiPens work for people with allergies. If you&amp;rsquo;re eating a peanut and you&amp;rsquo;re allergic to peanuts, you don&amp;rsquo;t want to have to assemble the cure for that, right. Or something that alleviates or takes you out of immediate danger. You need it to be simple, just as take it out, push it in your leg, and it&amp;rsquo;s done. You don&amp;rsquo;t have to think about it. The same goes for monitoring or observability systems as well I would say. If you have to, when you&amp;rsquo;re awakened by a notification in the middle of the night, and maybe you&amp;rsquo;re even hung over or worse, and you are supposed to fix something that is critical, and you have to start thinking about what to do, then your observability system has in my eyes, at least failed you, you need to be able to get a notification that says this is wrong, here&amp;rsquo;s the data that proves that, click here to get a closer look and just be presented with all the information you need to be able to make a decent decision on how to proceed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;One thing recently on that note that I&amp;rsquo;ve come across is how potentially easy it is for a new Blake me to set up a whole observability stack or at least monitoring, but he could definitely expand upon it is EBPF, because we&amp;rsquo;ve been talking about distribution of systems and also of observability related services, but there&amp;rsquo;s also a trend of going lower and lower level, right? And EBPF monitoring is monitoring at the kernel level, recently with some people from the k6 team, Artem Charlie, Kevin, Danielle, Lopez, shout out to those guys. We did this hackathon project actually for EBPF monitoring. And the whole reason that I got into it was because the promise was you install this binary, you drop it into your cluster on your local machine. And then it just kind of exposes magically all of these things that I normally would have had to set up like node exporters for, you know, it was we&amp;rsquo;re living in a golden age of monitoring and observability I think. The things that are possible, like I can&amp;rsquo;t even keep up anymore, be talking about ergonomics. I mean, what is more ergonomic than not having to do much of anything.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You are talking about the day one, the fact that it is so easy to set up apart from monitoring system is exactly what you need to be able to monitor at scale. It removes the thought. EBPF is a fantastic technology. We are fundamentally given a virtual machine to run inside the kernel to execute logic, that allows us to do in a centralized place. Things that in the past were almost impossible. For example, the first thing I ever did with a team of vinyl in Stanhope with EBPF was actually to detect how a process that, that was impossible in user land. But with EBPF, it was actually pretty simple. We literally spent more time making sure that the techniques would work across all the operating systems that we need to support and to figure out how to find out that. EBPF the, I see two big potentials for that, for things that are not possible already today with sufficient tips. The first one is to give us a distributed tracing tool that largely independent from their own time. Now there are technology limitations there. It&amp;rsquo;s hard to find out how to trace context. I&amp;rsquo;m sure that someone somewhere out there is figuring it out as we speak, probably, that we reduce to some extent the toil that is necessary to support the federal fire hose of new technologies, libraries, and stuff like that is put in production every day. But the second one that excites me even more because the shoot the tracing is largely already possible is actually to have cheap enough in terms of overhead and consistent enough across run times production profiling. People look at distributed tracing as a way of figuring out what is slow. And it works remarkably well as long as the bottleneck is in between processes, the moment you want to drill down, why this requests into the insight, this process was taking too long. You see what you&amp;rsquo;re tracing is not so suited anymore. You end up looking at the leaf instead of the forest, because there is so many more requests going on through the system, that unless you have a lot of spans that are very, very detailed and fundamentally to trace threat level profiling, you are not going to which costs a huge amount of overhead. You are not going to have the information needed to find out, okay, good stock in the Dow library again. However, the moment that you have things, basically you have to find out where the CPU, memory or location, memory usage and wait time hotspots are in your application. You actually have the first places to work at to improve the overall system. It&amp;rsquo;s not gonna tell you why that request was going badly, but the moment you saw the hotspot, you are virtually guaranteed that many requests are going to get better. And then you can measure them again in terms of input output, observability tracing. Now people out there are going to say, Michele, what the hell are we talking about? Today we have a lot of amazing technologies to the production profile and they are true because for example, they are right because for example, if you look at the Java virtual machine with, for example, the Java flight recorder, you have excellent facilities with super low overhead to figure out what is your Java or cuddling or cradle program doing true. But they&amp;rsquo;re very specific to the particular run time and to a particular programming language. And when you start comparing what wait time, for example, looks like in Golang as respected over to machine with code routines, instead of, I dunno, loom threads, project loom, and all the rest of the stuff, you end up actually having telemetry that seems to say the same things, but in reality has a different semantic. And that is a challenge in our systems that have more and more grown polyglot. When we had the, our happy little monolith fault, it was one language. Now this year the systems are implementation of many different languages that behaves differently, and yet they are operated in some cases by roughly the same people, for example, necessarily teams, right? Having fluency in terms of performance across several languages is a significant challenge. Now, if we actually get through EBPF production profiling, for example, the folks behind parka and also the folks we have big pixie, there&amp;rsquo;s an amazing job there. If we manage to have something that will give us close enough, precise enough production, profiling information across whatever we may wanna throw into a container that is going to be a generational change in terms of making complex systems run better at scale.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;That&amp;rsquo;s something that we&amp;rsquo;re interested in at k6 as well. I mean, I&amp;rsquo;m a performance Sesser so the first thing I think of as the network side of it, there are a lot of network metrics that could be gathered at that level. And the reality now is that without EBPF, you&amp;rsquo;re in this position where each new service has needs some other exporter that you need to install. And like there&amp;rsquo;s so many plugins to plugins and many different combinations of things, when really they might all be using HTTP. Like, why don&amp;rsquo;t we have something that just detects, maybe not, it won&amp;rsquo;t be everything right. It&amp;rsquo;s never EBPF has never going to completely be able to, or, well, I shouldn&amp;rsquo;t say never because you know, that could change very quickly, but I don&amp;rsquo;t see it as being the end all be all solution. But if it can provide some of the more common metrics, that&amp;rsquo;s already a step in the right direction. Talk about usability and ergonomics right?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And also provide a safe assessable baseline across a lot of different technologies working together.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah. For sure. What other things do you think would you have in your ideal observability stack?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You asked me?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Either of you?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go ahead Michele, I don&amp;rsquo;t have a lot of ideas on that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Well, actually, if you go on the, okay, can I make us most shield for a link? If you go on google, WWW.ubuntu.com/whatisobservability/whatisobservability. There you see a kind of overview of the things that I find most meaningful, monitoring different types of systems. Second, I&amp;rsquo;m gonna give here that your own.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;They can share my screen record.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I assume you want this one?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Awesome.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yes. So this page is fundamentally a work of love of Simme and I, about the way we see observe a PVT. And the diagram that you see on screen is a, of course, simplified and very generic can your manage me if I lie, but it is a thirst overview of the kind of telemetry that you use at different levels in your infrastructure in order to monitor things. This is important for filamentary two reasons. One, is to provide guidance for people that may be new to observability in terms of which things to focus first, when you look at the telemetry types that are used on the right hand side, you will see that metrics and logs are of course universal. That&amp;rsquo;s what we started with. They are very good. Every software that deserves to run somewhere is capable of emitting clogs. Most of them can emit metrics and more and more, thanks to primitives that is really proud. There are the metrics sometimes serious thing to the forefront of enterprise systems. It didn&amp;rsquo;t used to be that. Then you start seeing that profiling gets, for example, the moment you move above the virtualization hardware, and you start talking about processes and applications, profiling them makes perfect sense.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sorry Michele for cutting you off. But I think you might need to need to explain the icons.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;That is correct.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;That&amp;rsquo;s really. We don&amp;rsquo;t have that context.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ah, they don&amp;rsquo;t explain themselves. Maybe then you use amino the icons.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So the chart that you see on the left hand side is metrics, mentors, time series fundamental. That&amp;rsquo;s what we use to monitor things. There&amp;rsquo;s a lot. Then the table with the reds and greens and yellows followed by text that locks, the old, that bar chart is actually supposed to be flamed charts and that&amp;rsquo;s profiling showing hotspots. The strange thing with all those horizontal bars that is distributed tracing, that is the best way I can come up with to visualize spans. Spans is the basic data structure in distributed tracing. It describes an action taken by system to process a request. For example, you would have a span for the receiver of an HTTP request. The span is opened is created when your HTTP server is receiving the request, it&amp;rsquo;s going to be closed, but it simply is doing amazing things to get to the image in a screen&amp;ndash;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Most of this you&amp;rsquo;ve probably seen in your browser, was what I was about to say, like something similar when you browse on webpage, you&amp;rsquo;d get this span alike view of how the different correlate.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It&amp;rsquo;s similar, but there is a key difference. One of the key concepts of distributed tracing as coming from dapper, which is fundamentally the progenitor of all modern distributed systems is the parent-child relation between spans, which is the closest you can get to cow&amp;rsquo;s reality. We are, for example, when your application is receiving an HTTP request and is issuing your query to Mongo to retrieve some data, you will have a parent&amp;rsquo;s span for the receiver of the HP request. And the child&amp;rsquo;s span that says, I spoke to Mongo, took me this longer. And this query, I got so many data back that is the parent-child relation. And it fundamentally, you would not have spoken to Mongo if not for the incoming request. Now things get Merck here when we talk about a synchronous messaging, because the beauty and simplicity of the trees of spans that you have in synchronous systems, kind of get lost with a messaging the moment that you have batch consumers. You&amp;rsquo;ll have many requests that result in a whole bunch of messaging being queued up in your messaging queue. And one application consuming messages originated in different traces all at once, fundamentally creating a merge, but I digress. I&amp;rsquo;m sorry. So we were talking about&amp;hellip; I just get so excited about this future tree.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No, it&amp;rsquo;s great. I know that you said that you have a hard stop and I&amp;rsquo;d like to get you off a little bit early for your meeting Michele, but why don&amp;rsquo;t you talk about what Canonical has to do with observability at all?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Well, can I call does a lot of things, including a very beloved operating system together with an amazing community of volunteers, Ubuntu, we are responsible for a huge amount of software. We have offerings for Kubernetes, for OpenStack, for SAF, for a lot of systems that people use to run their applications and data centers. And it is the mission of Simme and I to make sure that those systems come with excellent monitoring capabilities, that you can monitor them with open source software, whether or not you want to use the monitoring system that Canonical provides you. At the end of the day, what we&amp;rsquo;re doing is in variable source fashion. We want to make sure that all the appliances that you can get from Canonical, the SAF, the OpenStack, the Kubernetes is, there are the cube flows and all the machine learning. They are, you can monitor them with best-in-class open source monitoring tools like videos, like getting logs out of SIS log, the security traces with open telemetry, where it makes sense. And that is the part of the work of Simme and I, that is about stepping up the game in terms of making software provided by Canonical observable in a way that you can use, for example, with your existing monitoring system, we really believe every single word we say, when we say the metric, once France, it&amp;rsquo;s all about having radio systems be monitored together. Now, if you do not happen to have a radio monitoring system, wherever monitoring the rest, we can give you one, but if you have a monitoring system and you&amp;rsquo;re comfortable with it, you by all rights should be able to monitor whatever piece of software you get from Canonical with it. And this is what to do.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;That&amp;rsquo;s awesome. I wish we had more time to talk about this, but maybe we can have you both in some future episode, I feel like there&amp;rsquo;s so many things that I wanted to dig deeper into, but thank you both for coming.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Thank you so much.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I am so happy. Simme I&amp;rsquo;m so happy to have you back on again. I&amp;rsquo;ve always enjoyed doing these with you, so it&amp;rsquo;s a little bit weird that you&amp;rsquo;re now on as a guest, but I&amp;rsquo;m happy that you&amp;rsquo;re also bringing things that you&amp;rsquo;ve learned at Canonical back to us. And Michele welcome. I&amp;rsquo;d love to have you&amp;ndash;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Thank you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Back again for sure with or without Simme.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Anytime. But Simme is finer yeah.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;All right. Thank you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sure. Sure. Thank you everybody for watching and I guess we&amp;rsquo;ll see you next week. Bye everyone.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bye, have a wonderful day.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>An Overview of Software Testing</title><link>https://nicolevanderhoeven.com/blog/20220119-an-overview-of-software-testing/</link><pubDate>Wed, 19 Jan 2022 17:10:11 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220119-an-overview-of-software-testing/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/huiptd8Y2I0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="transcript"&gt;Transcript&lt;/h2&gt;
&lt;p&gt;NICOLE: What is the difference between good software and bad software? Is it features or user interface or marketing? In my totally biased opinion, what actually makes a difference is how well the software was tested. But software testing encompasses a lot of different areas and it doesn&amp;rsquo;t even always have to be someone with a word tester in their job title that does the testing. So whether you&amp;rsquo;re looking to get started in the industry, or just trying to cross skill, here&amp;rsquo;s an overview of the main types of software testing.&lt;/p&gt;
&lt;p&gt;Is it just me, or does your desk get that clutter too after a week of work?&lt;/p&gt;
&lt;p&gt;Anyway, software testing is the process of validating whether an application works as intended, but there&amp;rsquo;s a lot of vagueness in that statement. One of the broadest ways to categorize testing types though, is whether it&amp;rsquo;s functional or operational.&lt;/p&gt;
&lt;p&gt;Functional testing is more about application features. Is there a form to capture user email addresses? Is there a button next to it that submits those addresses? Once the button is clicked, where do the user details go? Do they go to the database? Are they stored correctly? Those are the sort of ways in which functional testers think. Operational testing traditionally called non-functional testing, is a way of verifying software quality and aspects that extend beyond the features of the application.&lt;/p&gt;
&lt;p&gt;Operational testing sometimes involves concerns that are more subjective or qualitative. So it can be a little bit more difficult to test, because those things only arise in certain conditions. I&amp;rsquo;m saying operational testing here, instead of non-functional testing, because I was talking to Paul Bruce who made an excellent video just on this topic. He talks about why the term nonfunctional requirement is really a bit of a misnomer.&lt;/p&gt;
&lt;p&gt;PAUL: It relegates all these other things, security, performance, installation, deployment, accessibility. It relegates them to a nice to have, so it should be functional versus operational.&lt;/p&gt;
&lt;p&gt;NICOLE: So I&amp;rsquo;m using his term operational testing instead.&lt;/p&gt;
&lt;p&gt;Here are the different forms of operational or non-functional testing.&lt;/p&gt;
&lt;p&gt;First there&amp;rsquo;s accessibility testing. It is involved with verifying that end users can consume or navigate content. Usually through assistive devices like screen readers. While most forms of testing begin with a statistically normal user in mind, accessibility testing seeks out outliers in terms of location, linguistic background and disability.&lt;/p&gt;
&lt;p&gt;Usability testing is designing with user experience in mind, specifically concerning the placement of on-screen elements and the intuitiveness of the process flow of an application.&lt;/p&gt;
&lt;p&gt;Localization testing is a way of making sure that applications are usable in the local context, in the sense of being colloquially appropriate for users in different countries and from different cultures.&lt;/p&gt;
&lt;p&gt;Security testing verifies that a system has no flaws that could be exploited, to gain access to confidential information or features that would not otherwise be accessed by expected means.&lt;/p&gt;
&lt;p&gt;So that was me talking from my home in the Netherlands, but this week I am in Portugal. The remote working life, am I right?&lt;/p&gt;
&lt;p&gt;But anyway, performance testing is my favorite topic and my favorite type of testing because that&amp;rsquo;s the one that I&amp;rsquo;ve had the most experience with. Performance testing is more qualitative. So it&amp;rsquo;s more about how well the application works. And there are two main types of performance testing and that&amp;rsquo;s front-end performance, and back-end performance testing.&lt;/p&gt;
&lt;p&gt;Front-end performance testing seeks to verify the user experience at the interface level. So that&amp;rsquo;s everything that the end user sees on their local machine.&lt;/p&gt;
&lt;p&gt;There are different approaches to front-end performance testing, and the first of them is performance profiling. Performance profiling involves running your application through a series of automated checks. And there are a lot of sites for this, where you just put in your URL, if it&amp;rsquo;s a web app, and you get a score in the end. That tells you how performance your application is, the most popular example for this and also the easiest to get started with, is DevTools because that&amp;rsquo;s already in Chrome and Firefox based browsers. But you can also go to sites like Webpagetest, or GTMetrix, YSlow, which is a plugin, or you can use Google Lighthouse, which is now included with Chrome Dev Tools.&lt;/p&gt;
&lt;p&gt;The next approach to front-end performance testing is called RUM or Real User Monitoring. So the difference is that with performance profiling, that&amp;rsquo;s often done manually, and as a one-off thing, like maybe at the beginning of a test or during, but Real User Monitoring is not usually done within testing environments. As the name suggests, these tools measure the experience of real users. So they have to be run in production. Examples of tools in this space are; New Relic&amp;rsquo;s RUM, Elastic has a RUM as well, there&amp;rsquo;s Catchpoint, SpeedCurve Uptrends and many more.&lt;/p&gt;
&lt;p&gt;And the third approach to measuring front-end performance is by using some sort of browser-based automation tool. So typically this has been something like Selenium, but that&amp;rsquo;s falling out of favor in terms of more modern solutions like Playwright, Puppeteer, Cypress and so on.&lt;/p&gt;
&lt;p&gt;So front-end performance is about everything that the user sees on their end, but back-end performance testing is about everything that they don&amp;rsquo;t see. It&amp;rsquo;s about the network. It&amp;rsquo;s about latency, the application servers, the way the infrastructure is set up and all of those things that are a little bit more difficult to look into, but can also have severe bottlenecks. Back-end performance testing seeks to verify aspects of an application such as scalability, elasticity, availability, reliability and responsiveness.&lt;/p&gt;
&lt;p&gt;Scalability is the application&amp;rsquo;s ability to respond to changes in demand. This could mean scaling up, which means increasing the resources available to a server, but it could also mean scaling out, meaning increasing the number of servers that are available to handle the application load.&lt;/p&gt;
&lt;p&gt;Elasticity is a related topic to scalability, except where scalability is all about scaling up or out. Elasticity also emphasize a scaling down or in, and that&amp;rsquo;s because having these services or servers available on the Cloud that are dynamically adjusting can also be quite expensive. So elasticity makes sure that the infrastructure that&amp;rsquo;s available or the resources available are always appropriate for the size of the demand. So when demand increases, elasticity also checks whether the application decreases it servers or resources in response to that.&lt;/p&gt;
&lt;p&gt;Availability is how long the application stays up, despite changing circumstances in production. So this is typically measured by uptime. Availability can also be tested using disaster recovery procedures, and you&amp;rsquo;re not just testing the application itself, but also the processes around it. So are there enough people that are on call so that they would be able to come in and troubleshoot when there&amp;rsquo;s a production incident? All of those things are included in application availability.&lt;/p&gt;
&lt;p&gt;Reliability checks to see how your application behaves in response to unexpected errors. Reliability basically takes it as a given that your application is going to fail somehow, sometime, maybe you don&amp;rsquo;t know exactly when that will be or how it will fail, but it&amp;rsquo;s going to happen. So a big part of reliability and site reliability engineering is trying to expose your application to those failures beforehand so that you can build confidence about how it will behave when those things actually happen in production.&lt;/p&gt;
&lt;p&gt;And the last aspect to back-end performance testing is responsiveness. And this is usually equated with load testing. Load testing is more of a technique for testing though. And really load tests can be used to test not just responsiveness, but also reliability or availability or scalability, basically any of the &amp;ldquo;ilities&amp;rdquo; in this part of back-end performance testing.&lt;/p&gt;
&lt;p&gt;Protocol-based load testing verifies the backend performance of an application, not by simulating real users accessing the application, but by simulating the underlying requests that go back and forth between the client or the user and the application servers. One of the benefits of protocol-based load testing is that it takes up fewer resources on the side of the load generator, and therefore is less expensive to run. Some popular protocol-based load testing tools are k6, JMeter, Gatling LoadRunner, NeoLoad, and Silk Performer.&lt;/p&gt;
&lt;p&gt;Browser-based load testing verifies the application by simulating real users accessing it. So it also has the benefit of including these front-end performance metrics. Browser-based testing can also be called browser-driven or UI-based testing. Some popular tools for browser-based load testing are Playwright, Puppeteer, Flood Element and as of a few weeks ago, k6.&lt;/p&gt;
&lt;p&gt;Then there&amp;rsquo;s hybrid load testing, which takes the best of protocol and browser-based load testing tools by combining them in one test. Now this can present some challenges, especially if you&amp;rsquo;re using different tools for the browser-based script, than you&amp;rsquo;re using for the protocol-based script. The ideal is to use your protocol based load testing tool, to simulate majority of the load to cut down on costs for the execution and scaling out of your load test. And then you run a handful of users using your browser based load testing tool. So you still get some metrics for front-end performance while that load is being applied by the protocol based tool.&lt;/p&gt;
&lt;p&gt;Testing software can be really daunting because there are many aspects of an application that you can test. But that&amp;rsquo;s because there&amp;rsquo;s also many aspects of an application that can fail. And that&amp;rsquo;s why all roads lead to testing and why the success of an app hinges on how well it&amp;rsquo;s been tested.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;d like to zero in, on load testing in particular, check out this video that I made on what load testing is. Thanks for watching. And like they say, here in Portugal, Obrigada!&lt;/p&gt;</description></item><item><title>How to Use Executors in k6: Adapting Load Test Workload Models to Production</title><link>https://nicolevanderhoeven.com/blog/20220118-how-to-use-executors-in-k6-adapting-load-test-workload-models-to-production/</link><pubDate>Tue, 18 Jan 2022 22:45:52 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220118-how-to-use-executors-in-k6-adapting-load-test-workload-models-to-production/</guid><description>&lt;p&gt;Executors in k6 are like traffic cops.&lt;/p&gt;
&lt;p&gt;They define the shape and volume of traffic that your k6 load testing script follows during test execution. Executors can also drastically affect your results if you don&amp;rsquo;t get them right.&lt;/p&gt;
&lt;p&gt;Here are all the executor options in k6 and when you should use each one:&lt;/p&gt;
&lt;h2 id="k6-executors"&gt;k6 executors&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;shared-iterations&lt;/em&gt;&lt;/strong&gt;: Fix the number of total iterations for the entire test. Use when you want to create precisely X rows of test data during a prep run.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;per-vu-iterations&lt;/em&gt;&lt;/strong&gt;: Fix the number of iterations each virtual user (VU) does. Use when you want each VU to use exactly X rows of test data.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;constant-vus&lt;/em&gt;&lt;/strong&gt;: Fix the number of VUs and duration, but allow the number of iterations to vary. Use for straightforward tests or shakeout tests.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;ramping-vus&lt;/em&gt;&lt;/strong&gt;: Set stages, each with a number of VUs and a duration, and let the number of iterations vary. Use for easiest comparison with other load testing tools and for custom load profiles.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;constant-arrival-rate&lt;/em&gt;&lt;/strong&gt;: Fix the number of requests per second (rps) and duration, and allow the number of VUs and iterations to vary. Use when you have a simple load profile with a request throughput requirement (rps).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;ramping-arrival rate&lt;/em&gt;&lt;/strong&gt;: Like &lt;strong&gt;&lt;em&gt;constant-arrival-rate&lt;/em&gt;&lt;/strong&gt;, but with stages. For each stage, fix the number of rps and duration. Use for spike tests, multiphase load profiles with distinct requirements, and Game Day simulations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;externally-controlled&lt;/em&gt;&lt;/strong&gt;: Fix max VUs and time, and allow everything else to be changed at runtime. Use for disaster recovery, breakpoint, or stress tests where you want ultimate flexibility in adapting your test to real-time results.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="still-unsure"&gt;Still unsure?&lt;/h2&gt;
&lt;p&gt;Use &lt;strong&gt;&lt;em&gt;ramping-vus&lt;/em&gt;&lt;/strong&gt;. It&amp;rsquo;s probably what you&amp;rsquo;re used to from other tools.&lt;/p&gt;
&lt;p&gt;Ready to move up? Use &lt;strong&gt;&lt;em&gt;ramping-arrival-rate&lt;/em&gt;&lt;/strong&gt;. Rps is a better (but still not perfect) measure of throughput for comparison than just the number of VUs.&lt;/p&gt;
&lt;h2 id="when-in-doubt-look-at-production"&gt;When in doubt, look at production.&lt;/h2&gt;
&lt;p&gt;Making sure your test looks and acts like real traffic yields the best results!&lt;/p&gt;
&lt;p&gt;For more details, check out &lt;a href="https://k6.io/docs/using-k6/scenarios/#executors"&gt;the k6 documentation&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Testing tool cheat sheet for load testers who don't just care about numbers</title><link>https://nicolevanderhoeven.com/blog/20220117-testing-tool-cheat-sheet-for-load-testers-who-dont-just-care-about-numbers/</link><pubDate>Mon, 17 Jan 2022 16:30:07 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220117-testing-tool-cheat-sheet-for-load-testers-who-dont-just-care-about-numbers/</guid><description>&lt;p&gt;It&amp;rsquo;s not enough to decide &lt;em&gt;how much&lt;/em&gt; load you want to generate. You also have to know &lt;em&gt;how&lt;/em&gt; you&amp;rsquo;re generating it.&lt;/p&gt;
&lt;p&gt;Your approach affects what part of your application is tested, the results returned, and the budget you&amp;rsquo;ll need to run your test.&lt;/p&gt;
&lt;p&gt;Here are three main categories of load testing tools:&lt;/p&gt;
&lt;h2 id="protocol-based-load-testing-tools"&gt;Protocol-based load testing tools:&lt;/h2&gt;
&lt;p&gt;These tools simulate the underlying messages sent back and forth between an application and a client.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Choose a protocol-based tool if&lt;/em&gt;: you want to generate massive load, you want to load test before components are integrated, you want to test APIs, or you are budget-conscious.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Best in class tools&lt;/em&gt;: Gatling, JMeter, k6, Locust, Neoload&lt;/p&gt;
&lt;h2 id="browser-based-load-testing-tools"&gt;Browser-based load testing tools:&lt;/h2&gt;
&lt;p&gt;These tools automate real user interactions with an interface.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Choose a browser-based tool if:&lt;/em&gt; you want to measure end-to-end performance, you want to reuse your browser automation scripts, you want front-end performance metrics, or you have a higher budget.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Best in class tools:&lt;/em&gt; Cypress, Flood Element, k6, Playwright, Puppeteer&lt;/p&gt;
&lt;h2 id="hybrid-load-testing-tools"&gt;Hybrid load testing tools:&lt;/h2&gt;
&lt;p&gt;This approach is a mixture of the previous two. You can do this in a few ways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use a protocol tool to generate the majority of the load, and a browser tool for a handful of virtual users &lt;em&gt;(best functionality, highest effort/cost)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Use a browser-based tool for all load &lt;em&gt;(expensive, simplest)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Find a tool that can do both &lt;em&gt;(ideal solution, few options)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="whatever-you-choose-compare-like-with-like"&gt;Whatever you choose, compare like with like.&lt;/h2&gt;
&lt;p&gt;Happy testing!&lt;/p&gt;</description></item><item><title>Six Performance Testing Hats</title><link>https://nicolevanderhoeven.com/blog/20220114-six-performance-testing-hats/</link><pubDate>Fri, 14 Jan 2022 16:30:34 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220114-six-performance-testing-hats/</guid><description>&lt;p&gt;I was reading &lt;a href="https://amzn.to/3tvLYM9"&gt;Six Thinking Hats&lt;/a&gt; by Edward de Bono when I realized that the premise could be applied to performance testing:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/six-performance-testing-hats.png" alt="The Six Performance Testing Hats" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Each hat represents a different way of thinking, which can be useful when working through issues. Sometimes, wearing only one hat can cause us to fixate on incorrect assumptions, and &amp;ldquo;putting on another hat&amp;rdquo; can help shake things up and get to actually fixing what went wrong.&lt;/p&gt;</description></item><item><title>What Tabletop Games Teach Us About Application Perfomance</title><link>https://nicolevanderhoeven.com/blog/20220112-what-tabletop-games-teach-us-about-application-perfomance/</link><pubDate>Wed, 12 Jan 2022 16:30:29 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220112-what-tabletop-games-teach-us-about-application-perfomance/</guid><description>&lt;p&gt;Tabletop games and application performance have more in common than you might think.&lt;/p&gt;
&lt;p&gt;See, it&amp;rsquo;s all about optimization. Both involve juggling several variables: some that you can control, and some that you can&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what I&amp;rsquo;ve learned about application performance from playing tabletop games.&lt;/p&gt;
&lt;h2 id="1-get-more-workers"&gt;#1: Get more workers&lt;/h2&gt;
&lt;p&gt;In worker placement games, you should always spend your first worker to train more workers.&lt;/p&gt;
&lt;p&gt;Similarly, one of the most basic ways to increase concurrency is multithreading: using more than one thread at a time. (See: Golang) This applies to testing tools as much as to systems. The 1 Thread: 1 Virtual User paradigm is flawed.&lt;/p&gt;
&lt;h2 id="2-spend-time-on-getting-your-engine-going"&gt;#2: Spend time on getting your engine going&lt;/h2&gt;
&lt;p&gt;Get your big combos in place before you tap to attack.&lt;/p&gt;
&lt;p&gt;Things like setting up automation frameworks or CI/CD pipelines DO set you back in the beginning, but they are worth their mana cost in the long run.&lt;/p&gt;
&lt;h2 id="3draft-with-others-in-mind"&gt;#3: Draft with others in mind&lt;/h2&gt;
&lt;p&gt;The trick to drafting is knowing what you&amp;rsquo;re leaving for others as much as what you&amp;rsquo;re taking for yourself.&lt;/p&gt;
&lt;p&gt;The short game is getting your team to do the testing. The long game is getting everyone in the company involved in testing.&lt;/p&gt;
&lt;h2 id="4-hope-for-a-nat-20-plan-for-a-nat-1"&gt;#4: Hope for a nat 20, plan for a nat 1&lt;/h2&gt;
&lt;p&gt;Sometimes proficiency, expertise, and a luckstone just aren&amp;rsquo;t enough.&lt;/p&gt;
&lt;p&gt;Instead of wondering &lt;em&gt;whether&lt;/em&gt; an app will fail, take for granted that it will, and start planning for it. Keep that Action Surge in your back pocket.&lt;/p&gt;
&lt;h2 id="5-sometimes-you-just-have-to-trade-for-sheep"&gt;#5: Sometimes, you just have to trade for sheep&lt;/h2&gt;
&lt;p&gt;The 2:1 port is valuable, but not always the best option.&lt;/p&gt;
&lt;p&gt;Learn what you can, but accept that you can&amp;rsquo;t learn it all. Reach out to others with compatible skillsets and ask the &amp;ldquo;stupid&amp;rdquo; questions that nobody else wants to ask.&lt;/p&gt;
&lt;h2 id="testing-is-a-team-sport-and-everyone-gets-a-chance-to-play"&gt;Testing is a team sport, and everyone gets a chance to play.&lt;/h2&gt;
&lt;p&gt;Happy gaming!&lt;/p&gt;</description></item><item><title>5 Ways to Use Obsidian as a Software Engineer</title><link>https://nicolevanderhoeven.com/blog/20220109-5-ways-to-use-obsidian-as-a-software-engineer/</link><pubDate>Sun, 09 Jan 2022 19:20:49 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220109-5-ways-to-use-obsidian-as-a-software-engineer/</guid><description>&lt;p&gt;Yesterday, I wrote about why I think taking notes is the surprising foundation of a tester&amp;rsquo;s career.&lt;/p&gt;
&lt;p&gt;But it&amp;rsquo;s not just testers. Every software engineer is a knowledge worker, and that means we get paid for what we know. Using a Personal Knowledge Management (PKM) system such as &lt;a href="http://Obsidian.md"&gt;Obsidian.md&lt;/a&gt; helps us keep up with the constant barrage of new ideas in tech.&lt;/p&gt;
&lt;p&gt;Here are 5 things I use Obsidian for.&lt;/p&gt;
&lt;h2 id="1-my-very-own-stack-overflow"&gt;#1: My very own Stack Overflow&lt;/h2&gt;
&lt;p&gt;If you code, you&amp;rsquo;ve used Stack Overflow.&lt;/p&gt;
&lt;p&gt;What if you had your &lt;strong&gt;own&lt;/strong&gt; Stack Overflow, one that contained cheat sheets of every language you&amp;rsquo;ve ever tried to hack something up in, including only commands relevant to your job? This is exactly &lt;a href="https://notes.nicolevanderhoeven.com/Python"&gt;what I&amp;rsquo;ve done for Python&lt;/a&gt; recently, and it&amp;rsquo;s helping me solidify my knowledge.&lt;/p&gt;
&lt;h2 id="2-tools-database"&gt;#2: Tools database&lt;/h2&gt;
&lt;p&gt;There&amp;rsquo;s a tool for everything.&lt;/p&gt;
&lt;p&gt;To keep them straight, I have a page for every load testing tool I try, with tutorials for how to get started, an assessment of its features, and observations I had while attempting to learn it. &lt;a href="https://notes.nicolevanderhoeven.com/k6+(tool)"&gt;Here&amp;rsquo;s what I have for the load testing tool k6&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Bonus: I also use &lt;a href="https://github.com/blacksmithgu/obsidian-dataview"&gt;the Dataview plugin&lt;/a&gt; to query tools that fit my criteria.&lt;/p&gt;
&lt;h2 id="3-an-agile-workspace"&gt;#3: An Agile workspace&lt;/h2&gt;
&lt;p&gt;If Agile is good enough for my professional work, it&amp;rsquo;s good enough for my personal work.&lt;/p&gt;
&lt;p&gt;I use the &lt;a href="https://github.com/mgmeyers/obsidian-kanban"&gt;Kanban plugin&lt;/a&gt; to keep track of projects, create weekly and monthly review/retro templates, and work iteratively using &lt;a href="https://github.com/bjsi/incremental-writing"&gt;the Incremental Writing plugin&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="4-a-public-learning-log"&gt;#4: A public learning log&lt;/h2&gt;
&lt;p&gt;Learning in public is the fastest way to improve.&lt;/p&gt;
&lt;p&gt;When I&amp;rsquo;m trying to figure something out, I document my attempts. With Obsidian Publish, I can quickly push this log out to my domain and share them with colleagues to get a quick review so that they can easily follow my train of thought and tell me where I went wrong.&lt;/p&gt;
&lt;h2 id="5-a-digital-garden-of-software-ideas"&gt;#5: A digital garden of software ideas&lt;/h2&gt;
&lt;p&gt;Build libraries, not feeds.&lt;/p&gt;
&lt;p&gt;I use Obsidian to save things I read/watch/listen to but also to save space for ideas I&amp;rsquo;ve learned to germinate. I publish notes before they&amp;rsquo;re fully fleshed out, with the goal of growing everything over time.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://notes.nicolevanderhoeven.com"&gt;Today, I have 4,567 notes&lt;/a&gt;, all about things that matter to me.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Every engineer should have a PKM system.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Take Notes, Not Tools</title><link>https://nicolevanderhoeven.com/blog/20220108-take-notes-not-tools/</link><pubDate>Sat, 08 Jan 2022 17:00:44 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220108-take-notes-not-tools/</guid><description>&lt;p&gt;When I first got into testing, I thought that testing was about learning different tools and frameworks.&lt;/p&gt;
&lt;p&gt;I learned how to use Neoload, then LoadRunner, then JMeter, and then SeleniumSilkPerformerVisualStudioGatlingPuppeteerPlaywrightk6 in short succession. I took courses on JavaScript, on C, on Java. I ticked off tools like a grocery list.&lt;/p&gt;
&lt;p&gt;It didn&amp;rsquo;t take me long to realize that I still wasn&amp;rsquo;t a good tester.&lt;/p&gt;
&lt;h2 id="taking-notes-not-tools-is-what-makes-a-good-tester"&gt;Taking notes, not tools, is what makes a good tester.&lt;/h2&gt;
&lt;p&gt;When you think about it, a lot of things a tester does revolves around taking good notes.&lt;/p&gt;
&lt;p&gt;Requirements are just notes on what the business wants to achieve. Test scenarios are notes on situations that the team wants to simulate. Test cases are notes on how a user would use an application. Defects are notes on issues.&lt;/p&gt;
&lt;p&gt;The quality of a tester&amp;rsquo;s notes dictates the quality of their work.&lt;/p&gt;
&lt;h3 id="listen-to-people-not-tool-tutorials"&gt;&lt;strong&gt;Listen to people, not tool tutorials&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Take notes on what users do.&lt;/strong&gt; Talk to the business. Pore through Google Analytics logs. Piece together a story of the kind of people who use your application, and how they use it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Take notes on problem areas.&lt;/strong&gt; Talk to customer support about the most common questions they get&amp;ndash; they know more about pain points than anyone else in the company. Talk to the ops engineers who were on call during the last production incident. These problems are what you&amp;rsquo;ll need to test later.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Take notes on what you&amp;rsquo;ve learned.&lt;/strong&gt; If you don&amp;rsquo;t like learning, you&amp;rsquo;re in the wrong field. Document everything, even things you think you&amp;rsquo;ll never forget, because one day, you WILL forget.&lt;/p&gt;
&lt;p&gt;Taking notes, not tools, is the foundation every testing career is built on.&lt;/p&gt;</description></item><item><title>How Eurofunk uses k6 for load testing emergency services (k6 Office Hours #37)</title><link>https://nicolevanderhoeven.com/blog/20211217-koh37-daniel-knittl-frank/</link><pubDate>Fri, 17 Dec 2021 17:17:07 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20211217-koh37-daniel-knittl-frank/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/PHJQuYDdNps?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;In this k6 Office Hours, k6 CEO Robin Gustafsson joined me to talk to Daniel Knittl-Frank, a software engineer at Eurofunk, about how k6 is used in the emergency services industry. Daniel has an interesting use case for k6: he uses it to load test calls in Austria received from the 112 emergency services hotline!&lt;/p&gt;</description></item><item><title>Load Tester Reacts to Pokemon Go Scales for 166m Users</title><link>https://nicolevanderhoeven.com/blog/20211209-load-tester-reacts-to-pokemon-go-scales-for-166m-users/</link><pubDate>Thu, 09 Dec 2021 16:13:59 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20211209-load-tester-reacts-to-pokemon-go-scales-for-166m-users/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/MtsEFebioWI?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="transcript"&gt;Transcript&lt;/h2&gt;
&lt;p&gt;NICOLE: Last year, Pokemon GO, a mobile app developed by Niantic Labs, made $1.23 billion in revenue with 166 million players from all over the world. This level of success is unprecedented, especially for an app that was encouraging people to go outside at a time when many governments were encouraging them to stay inside. In tech, though, success comes at a cost. Here&amp;rsquo;s what Niantic has to do under the hood to keep this massively popular game running.&lt;/p&gt;
&lt;p&gt;Hey everyone, I&amp;rsquo;m Nicole van der Hoeven. I&amp;rsquo;ve been helping companies
through their load testing for over 10 years, and I like to talk about tech travel and taking notes. I&amp;rsquo;m also a Pokemon GO player. I&amp;rsquo;ve been playing it since
the day it was released in July 2016.&lt;/p&gt;
&lt;p&gt;In this video, I&amp;rsquo;m going to be reacting to a conversation between Priyanka Vergadia from Google and James Prompanya from Niantic Labs. Thank you to Joe Colantonio&amp;rsquo;s TestGuild News Show last month, for bringing it to my attention.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s get started.&lt;/p&gt;
&lt;p&gt;PRIYANKA: Yep.
NICOLE: Okay. Everybody knows that you should be doing a curve ball to catch Pokemon the fastest way.&lt;/p&gt;
&lt;p&gt;PRIYANKA: I am catching some Pokemons. Did you know that it was
built on Google Cloud? Well, let&amp;rsquo;s talk&amp;ndash;&lt;/p&gt;
&lt;p&gt;NICOLE: GCP, okay.&lt;/p&gt;
&lt;p&gt;PRIYANKA: At Niantic Labs to take a behind the scenes look at Pokemon Go&amp;rsquo;s architecture, and how it scales for large number of players. Hi James, welcome to the show.&lt;/p&gt;
&lt;p&gt;JAMES: Pokemon Go is not your typical mobile game.&lt;/p&gt;
&lt;p&gt;NICOLE: I love that he&amp;rsquo;s got Pokemon paraphernalia everywhere.&lt;/p&gt;
&lt;p&gt;JAMES: Catching these little creatures around you called Pokemon that are
appearing in a real world. Encourage you to go outside, explore and discover things using augmented reality. A big part of that, which wasn&amp;rsquo;t in&amp;ndash;&lt;/p&gt;
&lt;p&gt;NICOLE: See this is one of the things that make me really impressed with their implementation. They have majority of their users using mobile networks. That&amp;rsquo;s a really hard thing to account for, especially when you&amp;rsquo;re talking about a global audience that is playing in different parts of the world. So it&amp;rsquo;s really important that everything is front-loaded, and that they&amp;rsquo;re minimizing the amount of traffic, the amount of resources that each player has to download on their mobile network.&lt;/p&gt;
&lt;p&gt;JAMES: Wasn&amp;rsquo;t included in the game when it first came out, was this big community aspect of it. We really liked this part of the game. So we made it a major part by hosting regular live events, such as Community Days, Raid Hours,Team GO Rocket Takeovers, all culminates in this big summer event that we call GO Fest.&lt;/p&gt;
&lt;p&gt;PRIYANKA: So it&amp;rsquo;s&amp;ndash;&lt;/p&gt;
&lt;p&gt;NICOLE: So this is a really brave move as well because they have events that are timed. So they happen at the same time for people in that time zone. And earlier on in Pokemon Go&amp;rsquo;s history, I did experience some slowness and some congestion in the mobile networks. But I mean, that&amp;rsquo;s a really difficult thing for them to plan for. I&amp;rsquo;m interested to see how they solve that.&lt;/p&gt;
&lt;p&gt;PRIYANKA: How does Pokemon Go back and actually scale to handle these peaks in traffic?&lt;/p&gt;
&lt;p&gt;JAMES: So we use Google Cloud. (chuckles) We have lots of services that need scaling such as the Google Kubernetes Engine and Spanner. Our front-end service is hosted on GKE, and it&amp;rsquo;s pretty easy to scale the nodes there. Google Cloud provides us with all the tools we need to manage the Kubernetes cluster.&lt;/p&gt;
&lt;p&gt;NICOLE: So it&amp;rsquo;s really cool to hear him talking about their stacks. So they&amp;rsquo;re using GCP, Google Cloud Platform. They&amp;rsquo;re on Kubernetes, so they&amp;rsquo;re using GKE, the Google Kubernetes Engine. And they use Google Cloud Spanner, which is a very highly available relational database.&lt;/p&gt;
&lt;p&gt;JAMES: To give an idea of scale, we have about 5,000 spanner nodes handling the traffic and thousands of Kubernetes nodes running just for the Pokemon&amp;ndash;&lt;/p&gt;
&lt;p&gt;NICOLE: That is so interesting. 5,000 Spanner nodes. That&amp;rsquo;s just for the data. That makes sense because Niantic&amp;rsquo;s main reason for creating this game, or the way that they&amp;rsquo;re making money, I guess, is by getting the data from users about walking paths and &amp;hellip;Basically, geo location or spatial data. So it&amp;rsquo;s super important for them to be able to store the data that they&amp;rsquo;re getting from their application usage.&lt;/p&gt;
&lt;p&gt;JAMES: We also have the various microservices that host other parts of the&amp;ndash;&lt;/p&gt;
&lt;p&gt;NICOLE: So another thing that they&amp;rsquo;re doing to keep it scalable is
by using microservices. See the traditional way is to use a monolith, so one large application with many sub-components. The problem with that though, is you can&amp;rsquo;t independently scale those components, you&amp;rsquo;d have to scale the entire application. And when that application is already really big and complex, that&amp;rsquo;s really inefficient because you&amp;rsquo;re scaling everything, even services that you
may not need to scale. So it&amp;rsquo;s really smart that they&amp;rsquo;ve chosen for a microservices based architecture, so that each of those components can be scaled separately of each other.&lt;/p&gt;
&lt;p&gt;JAMES: And if you compare ourselves to maybe World of Warcraft, you&amp;rsquo;ll see that other massively multiplayer online games, they split players into multiple realms, but for us, all of our players, they reside on a single realm. It was important for us that players can always interact with each other and share the same game, the experience, no matter where or when they&amp;rsquo;re playing.&lt;/p&gt;
&lt;p&gt;PRIYANKA: Yeah&amp;ndash;&lt;/p&gt;
&lt;p&gt;NICOLE: Okay. So I happen to have also played WoW, World of Warcraft. My main &amp;rsquo;toon was a disciplined priest. So when you sign up to WoW, you have to choose a realm, that&amp;rsquo;s basically a server or group of servers so that they don&amp;rsquo;t have to shoulder the entire load from all users. So that was WoW&amp;rsquo;s way to reduce the load. And he&amp;rsquo;s making the point that Pokemon Go can&amp;rsquo;t really do that to a certain extent. It&amp;rsquo;s not entirely correct to say that they don&amp;rsquo;t have
that sort of splintering, because they do still splinter based on the time zone. You&amp;rsquo;re only seeing people in that location in your time zone.&lt;/p&gt;
&lt;p&gt;Even events, they sometimes say 10:00 AM in your local time. So you&amp;rsquo;re not necessarily playing at the same time that people in Australia are playing. So there is some splintering, but it is less than what there would be for a game like WoW.&lt;/p&gt;
&lt;p&gt;JAMES: When we&amp;rsquo;re looking at different providers, we saw that Spanner
has consistent indexing that allows us to do more complex database schemas with these primary and secondary keys. Data Store was also non-relational with atomic and durable transactions. So we needed a relational database with full consistency, and made the choice to go to Spanner, which gave us these global ACID transactions.&lt;/p&gt;
&lt;p&gt;NICOLE: So he&amp;rsquo;s talking about consistency, global consistency, being a big deal and a big factor for why they chose to go and use Google Cloud Spanner instead of Google Data Store. And the reason is that normally, when you have a bunch of different instances of database, it doesn&amp;rsquo;t matter so much that those requests are processed in exactly the order that they came in. Because usually those
requests are being made by different people, and they&amp;rsquo;re trying to change different accounts. But with Pokemon Go, there&amp;rsquo;s the added complexity of wanting to keep the integrity of the chronological order. So if I go and attack a gym before you do, my, the process, the request that I created by attacking the gym, should be processed before yours is because it matters who gets to the gym first. So that&amp;rsquo;s an interesting twist.&lt;/p&gt;
&lt;p&gt;PRIYANKA: Now let&amp;rsquo;s say I&amp;rsquo;m a player and I&amp;rsquo;m playing the game right now. I open my app to catch a Pokemon. What is happening behind the scenes? How does the request flow work?&lt;/p&gt;
&lt;p&gt;JAMES: When the user catches a Pokemon, we receive that request through the Google Cloud Load Balancer. All of the static media is also stored on Google Cloud storage buckets. And it&amp;rsquo;s downloaded to the phone when you first start the app. We also have caching enabled at the load balancers. So it&amp;rsquo;s&amp;ndash;&lt;/p&gt;
&lt;p&gt;NICOLE: Already, they&amp;rsquo;ve mentioned they have a load balancer, so that that&amp;rsquo;s like a traffic controller that&amp;rsquo;s sitting above the servers and saying, &amp;ldquo;Okay, this request goes to this server.&amp;rdquo; And then maybe when that server is processing too many requests, that load balancer should be able to say, &amp;ldquo;All right, now let&amp;rsquo;s
divert some of the traffic to another server that maybe isn&amp;rsquo;t as heavily utilized.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;He also mentioned that they employ caching. This is what I was saying earlier that because you want to minimize the amount of traffic and the bytes that are flowing on the network, you want to employ caching for maybe things that
aren&amp;rsquo;t going to change so more static assets. Maybe you might want to change the Pokemon that&amp;rsquo;s in a gym, but the location of that gym is something that should and can be cached. He&amp;rsquo;s right now talking about caching on the server side, on
the application side, and not on the mobile phone. But I wonder if they&amp;rsquo;re going to talk about that later as well.&lt;/p&gt;
&lt;p&gt;JAMES: It&amp;rsquo;s all cached and served through Google Cloud CDN. So when the Poke&amp;ndash;&lt;/p&gt;
&lt;p&gt;NICOLE: So he also mentions using a CDN, so a Content Delivery Network, which is really good because that means that if I&amp;rsquo;m in the Netherlands and I make a request to their servers, my request isn&amp;rsquo;t then going to be sent to a server in the US, because it&amp;rsquo;s going to be sent to one of the servers in my country or nearby. That means that the latency between my request being sent, and that request getting to the server, and retrieving that resource and back, is going to be a lot lower. So it&amp;rsquo;s &amp;hellip; This is a way to improve performance.&lt;/p&gt;
&lt;p&gt;JAMES: The player catches the Pokemon, the GCLB sends the request to our GKE cluster. And we have a front-end service that sits behind Nginx reverse proxy. The request goes from the user&amp;rsquo;s phone through the reverse proxy, to one of these player, front-end services. We also have this thing called a Spatial Query Backend. It&amp;rsquo;s a cache by location.&lt;/p&gt;
&lt;p&gt;So that is where we store the information that determines where a Pokemon is shown on the map, what gyms and Poke stops are around you, what time zone you&amp;rsquo;re in, or any other feature that is location-based.&lt;/p&gt;
&lt;p&gt;PRIYANKA: Now, what happens when I hunt a Pokemon down and catch it?&lt;/p&gt;
&lt;p&gt;JAMES: When you catch a Pokemon, it sends the request to the front end, to the Spanner database, where your player entity is stored and it store it there. For catching Pokemon, that actually doesn&amp;rsquo;t go to the Spatial Query Backend. If you were, instead, if you were battling in a gym or adding lures to the Poke stop, that information is stored on the Spatial Query Backend, and&amp;ndash;&lt;/p&gt;
&lt;p&gt;NICOLE: Okay. So it sounds like the Spatial Query Backend is only storing data about the world, the Pokemon Go world that everybody can see. So people don&amp;rsquo;t need to know whether another person has caught a particular Pokemon. They just need to know whether there&amp;rsquo;s a lure on a Poke stop, or whether the gym is Team Mystic and things like that that everybody else can see. So there&amp;rsquo;s this segmentation of some data that is specific to the user, and other data that all users need to see.&lt;/p&gt;
&lt;p&gt;JAMES: We also use Pub/Sub to send the message to a Pub/Sub topic, which is then used for analytics pipeline.&lt;/p&gt;
&lt;p&gt;NICOLE: He talks about a Pub/Sub model, which means that their architecture is event driven. So the traditional way that this is handled is by polling. So normally when an service is waiting for something to happen, it goes, and it sends a message and it checks. Basically like, &amp;ldquo;Hey, are we there yet? Are we there yet? Are we there yet?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;And then when it finally gets a response that &amp;ldquo;Yes, we are,&amp;rdquo; then it can do something with that data. Instead what they&amp;rsquo;re doing as a Pub/Sub. So instead it waits for events. There is no constant polling, again, reducing the amount of traffic that&amp;rsquo;s going back and forth. And it just specifies criteria for what it is actually waiting for. And when that happens, after the services that require that event are subscribed, then that event is published to all of them. And then they can then do whatever they want with that event.&lt;/p&gt;
&lt;p&gt;PRIYANKA: So, how do you ensure that when two people who are in the same geographic regions, see the same Pokemon data, and keep that relatively in sync, especially during the events?&lt;/p&gt;
&lt;p&gt;JAMES: So it&amp;rsquo;s actually pretty interesting. Everything in our servers are deterministic. So even if players are on different machines, they&amp;rsquo;re sensitive to
different front-end services, if they&amp;rsquo;re in the same physical location, all the inputs would be the same and the same Pokemon would get returned to both users. There&amp;rsquo;s a lot of caching involved and as well as precise timing, especially when the settings are changed and they need to be in sync across all the servers.&lt;/p&gt;
&lt;p&gt;So it&amp;rsquo;s very tricky, but it was very important for us that all the players feel like they&amp;rsquo;re part of this one shared world.&lt;/p&gt;
&lt;p&gt;NICOLE: I&amp;rsquo;m not entirely sure what he means when he says that it&amp;rsquo;s deterministic.I&amp;rsquo;m going to guess, and I have no relationship with Google or with Niantic, but I&amp;rsquo;m thinking that what he means is that when you&amp;rsquo;re catching a Pokemon, there is no request that&amp;rsquo;s being sent to the servers to say, &amp;ldquo;Hey, did I catch this?&amp;rdquo; Instead, there&amp;rsquo;s probably some sort of algorithm. This Psyduck is caught 80% of the time and appears 2% of the time. So 2% of the Pokemons that you&amp;rsquo;re gonna see appear in this area, are going to be Psyducks. And that&amp;rsquo;s also reducing the load going back and forth, right? Because it&amp;rsquo;s just the equation or the algorithm that determines whether you catch a Pokemon or not.&lt;/p&gt;
&lt;p&gt;JAMES: This game data is of interest to our data science team. They use this for marketing purposes, for verifications. For example, we might want to say that this player, or players caught x millions amount of Pokemon during our Saturday Community Day events. So, it&amp;rsquo;s important that we have that information in an easily accessible manner.&lt;/p&gt;
&lt;p&gt;NICOLE: So there&amp;rsquo;s a lot of data here that they track. So I&amp;rsquo;ve got my distance walked, Pokemon caught, I&amp;rsquo;m at 18,878. Poke stops visited, total XP, start date. And then there are these medals as well. So, they look at things like, how far have you walked in total? So all of these things are data points that they store for every single user. No wonder they have such a focus on databases, right?&lt;/p&gt;
&lt;p&gt;PRIYANKA: As the events grow, like you mentioned, in some of these events, the traffic grows to millions of users per second. You also said&amp;ndash;&lt;/p&gt;
&lt;p&gt;NICOLE: Per second!&lt;/p&gt;
&lt;p&gt;PRIYANKA: &amp;hellip;of data is generated. How does the system scale when it comes to data pipeline?&lt;/p&gt;
&lt;p&gt;JAMES: Yeah. So when there&amp;rsquo;s increase of transactions, there is increase of load
throughout the system with a lot of our data pipelines for things like BigQuery, one of that&amp;ndash;&lt;/p&gt;
&lt;p&gt;NICOLE: I&amp;rsquo;m not actually sure she was saying millions of users per second, but that&amp;rsquo;s a little bit ambiguous. Maybe she meant millions of requests per second. And the way that they&amp;rsquo;re trying to do that is they&amp;rsquo;re reducing the size of those requests. If she means there are millions of concurrent users at any given time, that doesn&amp;rsquo;t necessarily mean that those users are all doing something at the exact same time. So I would have wanted to see exactly how many requests, to hear
how many requests per second they&amp;rsquo;re needing to deal with, or how many bytes per second are being sent over the wire. That would&amp;rsquo;ve been cool.&lt;/p&gt;
&lt;p&gt;JAMES: &amp;hellip;Just works. Google Cloud will handle the increase in traffic without any intervention.&lt;/p&gt;
&lt;p&gt;PRIYANKA: With that much traffic, obviously health of the system is critical as well. How do you monitor the health of the system during these massive events?&lt;/p&gt;
&lt;p&gt;JAMES: So we use multiple monitoring systems, including Prometheus, Grafana, and Google Cloud monitoring. On a personal level, I actually prefer it to Google Cloud monitoring because it&amp;rsquo;s very simple to use&amp;ndash;&lt;/p&gt;
&lt;p&gt;NICOLE: Whoo whoo! And they&amp;rsquo;re using Prometheus and Grafana &amp;hellip; Oh, this is entirely unexpected, but I&amp;rsquo;m actually wearing a Grafana shirt. So it&amp;rsquo;s really cool that they&amp;rsquo;re using Prometheus and it really, it makes sense, because they&amp;rsquo;re on a Kubernetes cluster and Prometheus and Kubernetes just go really well together. By the way, I work for Grafana, for context.&lt;/p&gt;
&lt;p&gt;PRIYANKA: What are some of the expansions and improvements you&amp;rsquo;re looking to do in the future?&lt;/p&gt;
&lt;p&gt;JAMES: On the Google Cloud side of things, we are looking into things such as Agones and Google Game servers, and using that to see how we can make our game even better.&lt;/p&gt;
&lt;p&gt;PRIYANKA: We wish you and the Niantic team best of luck for these enhancements. And this has obviously been super insightful for us, James. Thanks for joining me today and sharing your architecture with us.&lt;/p&gt;
&lt;p&gt;JAMES: Yeah, thanks for having me. This was fun.&lt;/p&gt;
&lt;p&gt;NICOLE: That was really good. So there were a few things that were mentioned there for how they&amp;rsquo;re scaling Pokemon Go, that I wrote down here.&lt;/p&gt;
&lt;p&gt;One, they use an event driven architecture and also a microservices based architecture, both of which are way more performant than the traditional methods.And the microservices based architecture will also let them scale up independently as demand increases as well. And they&amp;rsquo;re also using Cloud Spanner instead of Google Data Store, prioritizing global consistency, as well as high availability.&lt;/p&gt;
&lt;p&gt;They front-load a lot of the static assets that are used by the application. And they&amp;rsquo;re being downloaded when the app is initially downloaded or installed onto users&amp;rsquo; mobile phones. That way they don&amp;rsquo;t have to keep serving the same data if it&amp;rsquo;s going to be used consistently. And when something changes, like a different lot of Pokemon, they release these patches that let you download a lot of those images so that when you catch those Pokemons, then you already have all that information on your phone. And on a related note, they&amp;rsquo;re employing a lot of caching. They talked about caching on the mobile app side, and on their server side.&lt;/p&gt;
&lt;p&gt;Events are also staggered. So splintered realms sort of, because they&amp;rsquo;re happening
on different time zones, depending on where you live. And not completely simultaneously, regardless of the time in the part of the world where you&amp;rsquo;re from.&lt;/p&gt;
&lt;p&gt;They&amp;rsquo;re also using things like Prometheus, Grafana and Google Cloud Monitoring. They didn&amp;rsquo;t mention how they&amp;rsquo;re actually using multi-tenant versions of Prometheus like, maybe, I don&amp;rsquo;t know if they&amp;rsquo;re using Cortex or something like that, but that&amp;rsquo;s something that they should look into.&lt;/p&gt;
&lt;p&gt;And they also mentioned potentially increasing the number of Google Game Servers.&lt;/p&gt;
&lt;p&gt;I really appreciated that behind the scenes look. I wish more companies would do this, especially for apps that I personally love and use. One thing that I&amp;rsquo;m really curious about though, is the testing side of it. Because testing an application of this scale and complexity, is another thing entirely from observability. And I would have wanted to know how they&amp;rsquo;re doing their performance and load testing. And whether they&amp;rsquo;re doing things like chaos engineering maybe, or reliability testing to improve the availability and reliability of their application.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re still watching this, then chances are high that you like Pokemon and load testing as much as I do, which is a bit of an odd combination. And in that case, check out this video, on how I run chaos experiments using k6, Prometheus and Grafana. Thank you for joining me as I watched this awesome video.&lt;/p&gt;
&lt;p&gt;And as they say in the Netherlands, (Dutch) Until next time! Bye!&lt;/p&gt;</description></item><item><title>What's new with k6 Cloud, with front-end lead Simon Legander (k6 Office Hours #36)</title><link>https://nicolevanderhoeven.com/blog/20211203-koh36-whats-new-with-k6-cloud/</link><pubDate>Fri, 03 Dec 2021 17:09:45 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20211203-koh36-whats-new-with-k6-cloud/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/oyl9HNMC-ug?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;In this week&amp;rsquo;s k6 Office Hours, I was joined by my colleagues &lt;a href="https://twitter.com/markjmeier"&gt;Mark Meier&lt;/a&gt; and Simon Legander, front-end lead at k6, to talk about the new features that have come to k6 Cloud this year so far. Simon also gives us a sneak peek of all the cool features coming on the horizon&amp;hellip;&lt;/p&gt;</description></item><item><title>Performance Objective: Intro to Load Testing With k6 and Grafana</title><link>https://nicolevanderhoeven.com/blog/20211123-intro-to-load-testing-with-k6-and-grafana/</link><pubDate>Tue, 23 Nov 2021 17:05:06 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20211123-intro-to-load-testing-with-k6-and-grafana/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/fjq-JmrLjPc?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;I spoke at the Performance Objective meetup to talk about how to use k6 and Grafana for beginners. I always enjoy talking to like-minded engineers, and I think sharing ideas in a meetup context is probably the best way to do it.&lt;/p&gt;</description></item><item><title>Everyone Can Contribute: Load Performance Testing With k6</title><link>https://nicolevanderhoeven.com/blog/20211123-load-performance-testing-with-k6/</link><pubDate>Tue, 23 Nov 2021 16:57:26 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20211123-load-performance-testing-with-k6/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/_ty40gSaaw8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;This is a recording of a live meetup I spoke at, the Everybody Can Contribute Café hosted by Michael Friedrich, Senior Developer Evangelist at GitLab. This was a more casual conversation and show-and-tell about k6&amp;rsquo;s capabilities, and I really enjoyed it!&lt;/p&gt;</description></item><item><title>Browser testing and API load testing in the same script with k6 (k6 Office Hours #35)</title><link>https://nicolevanderhoeven.com/blog/20211112-koh35-browser-testing-and-api-load-testing-with-k6/</link><pubDate>Fri, 12 Nov 2021 00:28:02 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20211112-koh35-browser-testing-and-api-load-testing-with-k6/</guid><description>&lt;p&gt;Earlier this week, at &lt;a href="https://grafana.com/go/observabilitycon/2021/k6-load-testing/"&gt;ObservabilityCON 2021&lt;/a&gt;, we announced something new: k6 now supports browser-based testing with xk6-browser. Here&amp;rsquo;s a few of us from the k6 team talking about the announcement!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Y4qDAaJgxV0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="resources-mentioned"&gt;Resources mentioned&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://grafana.com/go/observabilitycon/2021/k6-load-testing/"&gt;Catch the announcement here&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://k6.io/blog/extending-k6-with-xk6/"&gt;Learn more about the xk6 extension system&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/grafana/xk6-browser"&gt;Try the xk6-browser extension&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>k6 load testing on Kubernetes using the k6 Operator, with Hans Knecht (k6 Office Hours #34)</title><link>https://nicolevanderhoeven.com/blog/20211105-koh34-k6-load-testing-on-kubernetes-using-k6-operator/</link><pubDate>Fri, 05 Nov 2021 00:23:15 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20211105-koh34-k6-load-testing-on-kubernetes-using-k6-operator/</guid><description>&lt;p&gt;I was really excited to have Hans Knecht on this week&amp;rsquo;s Office Hours. Hans works at Mission Lane, and is one of the biggest contributors to a k6 extension called k6 operator. k6 Operator lets you create a k6 custom resource object in Kubernetes.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/IJ0uQgn7gI8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="resources-mentioned"&gt;Resources mentioned&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/grafana/k6-operator"&gt;k6 operator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://k6.io/blog/running-distributed-tests-on-k8s/"&gt;Running distributed k6 tests on Kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=KPyI8rM3LvE"&gt;Previous k6 Office Hours on the Operator&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Work week in the life of a Developer Advocate</title><link>https://nicolevanderhoeven.com/blog/20211103-work-week-in-the-life-of-a-developer-advocate/</link><pubDate>Wed, 03 Nov 2021 00:31:46 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20211103-work-week-in-the-life-of-a-developer-advocate/</guid><description>&lt;p&gt;Before I became a Developer Advocate, I didn&amp;rsquo;t really know what developer advocates did - so here&amp;rsquo;s my attempt at explaining what it is I do for a living!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/71q0JmEli0k?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="weekly-breakdown"&gt;Weekly breakdown&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s a list of my activities during this week:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Friday
&lt;ul&gt;
&lt;li&gt;Filmed new ending for video #1&lt;/li&gt;
&lt;li&gt;Figured out integration options&lt;/li&gt;
&lt;li&gt;Did k6 Office Hours&lt;/li&gt;
&lt;li&gt;Prepared for Clubhouse talk&lt;/li&gt;
&lt;li&gt;Participated in customer demo&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Saturday
&lt;ul&gt;
&lt;li&gt;Did post-production for k6 Office Hours&lt;/li&gt;
&lt;li&gt;Talked at a Clubhouse meetup&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Sunday
&lt;ul&gt;
&lt;li&gt;Wrote (team profile) blog post #1&lt;/li&gt;
&lt;li&gt;Wrote talking points for Racket&lt;/li&gt;
&lt;li&gt;Started writing blog post #2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Monday
&lt;ul&gt;
&lt;li&gt;Edited video #1&lt;/li&gt;
&lt;li&gt;Created thumbnail, description&lt;/li&gt;
&lt;li&gt;Scheduled video #1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Tuesday
&lt;ul&gt;
&lt;li&gt;Created slides for presentation&lt;/li&gt;
&lt;li&gt;Played with Prometheus and Grafana for webinar&lt;/li&gt;
&lt;li&gt;Had a virtual coffee with colleagues&lt;/li&gt;
&lt;li&gt;Finished writing blog post #2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Wednesday
&lt;ul&gt;
&lt;li&gt;Went to four meetings&lt;/li&gt;
&lt;li&gt;Caught up on emails, Slack, and social media (last night)&lt;/li&gt;
&lt;li&gt;Wrote blog post #3&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Thursday
&lt;ul&gt;
&lt;li&gt;Scripted and filmed videos #2 and #3&lt;/li&gt;
&lt;li&gt;Started editing video #2&lt;/li&gt;
&lt;li&gt;Talked to a potential guest on livestream&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Common performance testing problems and fears (k6 Office Hours #33)</title><link>https://nicolevanderhoeven.com/blog/20211029-koh33-common-performance-testing-fears-and-issues/</link><pubDate>Fri, 29 Oct 2021 00:20:27 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20211029-koh33-common-performance-testing-fears-and-issues/</guid><description>&lt;p&gt;For this week&amp;rsquo;s k6 Office Hours, we attempted to steer into Halloween by talking about some of the most common performance testing issues we&amp;rsquo;ve faced in our careers as performance testing consultants. For this one, I had Tom Miseur join me to commiserate and swap stories.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/jVa3noSOyg8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Site Reliability Engineering and performance testing with Stephen Townshend (k6 Office Hours #32)</title><link>https://nicolevanderhoeven.com/blog/20211022-koh32-sre-and-performance-testing/</link><pubDate>Tue, 19 Oct 2021 00:09:50 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20211022-koh32-sre-and-performance-testing/</guid><description>&lt;p&gt;In this week&amp;rsquo;s Office Hours, I wanted to talk about the intersection of Site Reliability Engineering and performance testing, so I decided to invite two people with different backgrounds from me to discuss it. Stephen Townshend is a performance engineer who recently changed jobs to become an SRE, and Daniel González Lopes is an SRE who had not had experience in performance testing before he joined k6. It turned out to be a great talk!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/2U6nP8ajx1Q?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="resources-mentioned"&gt;Resources mentioned&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://open.spotify.com/show/7wOCHzZBCzOi071QuDPodI"&gt;Stephen&amp;rsquo;s Performance Time podcast&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.katacoda.com/"&gt;Katacoda&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.pluralsight.com/"&gt;Pluralsight&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://12factor.net/"&gt;The Twelve-Factor App&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fs.blog/2021/05/slack/"&gt;The blog post that Stephen mentioned, about slack&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>How to install and use the k6 Cloud Grafana data source plugin</title><link>https://nicolevanderhoeven.com/blog/20211019-how-to-install-and-use-k6-cloud-grafana-datasource-plugin/</link><pubDate>Tue, 19 Oct 2021 00:02:05 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20211019-how-to-install-and-use-k6-cloud-grafana-datasource-plugin/</guid><description>&lt;p&gt;In this video, I talk about the k6 Cloud Grafana data source plugin, which lets you use k6 Cloud as a data source for your Grafana visualizations.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Q2oihIg9Zjg?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://k6.io/docs/cloud/integrations/grafana-plugin/"&gt;Installing and using the k6 Cloud Grafana data source plugin&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://grafana.com/plugins/grafana-k6cloud-datasource/?tab=installation"&gt;Installing the plugin for Grafana Cloud&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://k6.io/docs/cloud/integrations/token"&gt;Get your k6 Cloud API token on this page&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/grafana/helm-charts/blob/main/charts/grafana/values.yaml"&gt;Grafana Helm Charts repository&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Load testing with k6 for beginners, with İnanç Gümüş and Viktor Mihajlović (k6 Office Hours #31)</title><link>https://nicolevanderhoeven.com/blog/20211015-koh31-load-testing-with-k6-for-beginners/</link><pubDate>Fri, 15 Oct 2021 01:52:48 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20211015-koh31-load-testing-with-k6-for-beginners/</guid><description>&lt;p&gt;Did you know that every new person to k6 does a Week of Testing? It&amp;rsquo;s a k6 tradition for new hires to spend their first week seeing firsthand what the experience of a new user of k6 is like. How quickly do they find the documentation? What issues do they get stuck on? Then, at the end of the week, the new employees do a presentation for the rest of the team to show their first impressions and findings.&lt;/p&gt;
&lt;p&gt;In today&amp;rsquo;s Office Hours, &lt;a href="https://twitter.com/inancgumus"&gt;İnanç Gümüş&lt;/a&gt;, one of the newest k6 team members, shares his presentation and his experience as a k6 beginner. Another colleague, Viktor Mihajlović, a Technical Customer Success Engineer, also shares some of the most commonly asked questions he&amp;rsquo;s heard on the job.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/MeN3H1Ml8OU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Conf42 podcast: in the k6 Universe</title><link>https://nicolevanderhoeven.com/blog/20211014-conf42-in-the-k6-universe/</link><pubDate>Thu, 14 Oct 2021 01:27:45 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20211014-conf42-in-the-k6-universe/</guid><description>&lt;p&gt;&lt;a href="https://twitter.com/mikopawlikowski"&gt;Miko Pawlikowski&lt;/a&gt; interviewed &lt;a href="https://simme.dev"&gt;Simme Aronsson&lt;/a&gt; and I for the &lt;a href="https://www.conf42.com/podcast"&gt;Conf42 podcast&lt;/a&gt;, and we talked about:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;why I love to learn human languages, and what Esperanto sounds like&lt;/li&gt;
&lt;li&gt;the Grafana acquisition of k6&lt;/li&gt;
&lt;li&gt;what performance testing is, anyway&lt;/li&gt;
&lt;li&gt;whether everyone needs to do performance testing, and my personal setup for this blog&lt;/li&gt;
&lt;li&gt;chaos engineering and Schrödinger&amp;rsquo;s Pokémon&lt;/li&gt;
&lt;li&gt;an overview of the Grafana Labs projects landscape&lt;/li&gt;
&lt;li&gt;what k6 is, and how we would get started for free (k6 OSS)&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/3Ja3RVi53YM?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to make load testing scripts realistic</title><link>https://nicolevanderhoeven.com/blog/20211014-realistic-load-testing/</link><pubDate>Wed, 13 Oct 2021 15:17:45 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20211014-realistic-load-testing/</guid><description>&lt;p&gt;A good load testing script exercises the functions and components as specified in the requirements gathering phase while simulating real users as closely as possible. Here are a few ways to make scripts more realistic.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Xz6drbGuUdI?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Timestamps so you can skip around!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=Xz6drbGuUdI"&gt;0:00&lt;/a&gt; Intro&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=Xz6drbGuUdI&amp;amp;t=82s"&gt;1:22&lt;/a&gt; Static resources&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=Xz6drbGuUdI&amp;amp;t=151s"&gt;2:31&lt;/a&gt; Cache and cookies&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=Xz6drbGuUdI&amp;amp;t=182s"&gt;3:02&lt;/a&gt; Dynamic think time&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=Xz6drbGuUdI&amp;amp;t=307s"&gt;5:07&lt;/a&gt; Concurrent requests&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=Xz6drbGuUdI&amp;amp;t=345s"&gt;5:45&lt;/a&gt; Load profile&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=Xz6drbGuUdI&amp;amp;t=379s"&gt;6:19&lt;/a&gt; Test data&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=Xz6drbGuUdI&amp;amp;t=421s"&gt;7:01&lt;/a&gt; Different user paths&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=Xz6drbGuUdI&amp;amp;t=475s"&gt;7:55&lt;/a&gt; Other forms of testing&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Basics of load testing with k6 and Grafana in 20 minutes</title><link>https://nicolevanderhoeven.com/blog/20211012-basics-of-load-testing-with-k6-and-grafana/</link><pubDate>Tue, 12 Oct 2021 01:04:02 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20211012-basics-of-load-testing-with-k6-and-grafana/</guid><description>&lt;p&gt;This was a video I pre-recorded in preparation for &lt;a href="https://nicolevanderhoeven.com/blog/20211005-testing-with-k6-and-grafana-better-together/"&gt;the first Grafana EMEA virtual meetup&lt;/a&gt;.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/gvounvDSDGg?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;In mid-June (just three months ago), k6 joined the Grafana Labs family. Many people didn&amp;rsquo;t quite understand what the connection was between k6 and Grafana, but I thought it made a lot of sense.&lt;/p&gt;
&lt;p&gt;Google&amp;rsquo;s Site Reliability Engineering book talks about 4 golden signals that we should measure in a system: latency, traffic, errors, and saturation. Load testing provides 3 of those (latency, traffic, and errors), but it doesn&amp;rsquo;t show saturation, and it doesn&amp;rsquo;t give us visibility into the system.&lt;/p&gt;
&lt;p&gt;Grafana brings observability. k6 brings data. They work really well together, which is why we&amp;rsquo;ve been using each other&amp;rsquo;s products for a few years now, before there was ever any talk of an acquisition.&lt;/p&gt;
&lt;p&gt;In this video, I talk about why k6 and Grafana are better together and also demonstrate:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;how to run a simple script in k6 OSS&lt;/li&gt;
&lt;li&gt;how to make sense of the results of a load test&lt;/li&gt;
&lt;li&gt;test execution options: running locally, sending results to k6 Cloud, and running a test from k6 Cloud&amp;ndash; all triggered using the CLI&lt;/li&gt;
&lt;li&gt;two different integration options to bring k6 and Grafana together: the k6 Cloud Grafana data source plugin and Prometheus Remote Write&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>TTRPG Obsidian Showcase</title><link>https://nicolevanderhoeven.com/blog/20211009-ttrpg-obsidian-showcase/</link><pubDate>Sat, 09 Oct 2021 00:43:25 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20211009-ttrpg-obsidian-showcase/</guid><description>&lt;p&gt;Here&amp;rsquo;s a presentation I participated in about a bunch of nerds who like both &lt;a href="https://obsidian.md"&gt;Obsidian&lt;/a&gt; and D&amp;amp;D. My part begins around &lt;a href="https://www.youtube.com/watch?v=Ovqu_1aW3Sw&amp;amp;t=2720"&gt;0:45:20&lt;/a&gt;, but I thought the other speakers&amp;rsquo; parts were really fascinating as well!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Ovqu_1aW3Sw?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>SLOs in performance testing, with Leandro Melendez aka Señor Performo (k6 Office Hours #30)</title><link>https://nicolevanderhoeven.com/blog/20211008-koh30-slos-in-performance-with-leandro-melendez/</link><pubDate>Fri, 08 Oct 2021 22:05:22 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20211008-koh30-slos-in-performance-with-leandro-melendez/</guid><description>&lt;p&gt;In this Office Hours, I invited my colleague Tom Miseur and friend Leandro Melendez, aka Señor Performo, to talk all about different criteria in performance testing, including non-functional requirements, SLAs, SLOs, SLIs, thresholds, and checks. Criteria at different levels is how we determine whether testing, including performance testing, has been successful, so it&amp;rsquo;s important to understand what they are and incorporate them into testing scripts and processes.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/GyueCZi5qBI?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Testing in Public: How to plan a load test (practical example) - Wyrmwood Gaming</title><link>https://nicolevanderhoeven.com/blog/20211006-testing-in-public-planning-a-load-test/</link><pubDate>Wed, 06 Oct 2021 11:21:41 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20211006-testing-in-public-planning-a-load-test/</guid><description>&lt;p&gt;When you&amp;rsquo;re learning a new skill, there&amp;rsquo;s only so much that studying can do. The problem is that there&amp;rsquo;s still a big gulf between studying something and doing it yourself. The solution is having a mentor to bridge the gap&amp;ndash; someone who will let you shadow them while they&amp;rsquo;re executing tests.&lt;/p&gt;
&lt;p&gt;I made this video thinking about the me from over a decade ago who would have wanted to get the chance to look over a more experienced tester&amp;rsquo;s shoulder. In this video, I talk about how considerations for planning load testing, using a hypothetical use case for a real company: &lt;a href="https://wyrmwoodgaming.com"&gt;Wyrmwood Gaming&lt;/a&gt;.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/EFqBWqo3IzY?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Testing With k6 + Grafana: Better Together (Grafana virtual meetup EMEA)</title><link>https://nicolevanderhoeven.com/blog/20211005-testing-with-k6-and-grafana-better-together/</link><pubDate>Tue, 05 Oct 2021 21:49:13 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20211005-testing-with-k6-and-grafana-better-together/</guid><description>&lt;p&gt;In this first EMEA session of the Grafana Labs virtual meetups, I talked about how to use k6 and Grafana together to get the full performance picture for a software application. Observability, using tools like Prometheus and Grafana, lets us see what&amp;rsquo;s going on inside the application, and load testing, using k6, helps us get those insights earlier on in software cycles, such as during pre-production.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/MUd5xuuxt0A?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to use k6 Cloud - a k6 load testing tutorial with Bill Rainaud (k6 Office Hours #29)</title><link>https://nicolevanderhoeven.com/blog/20211001-koh29-bill/</link><pubDate>Fri, 01 Oct 2021 13:58:03 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20211001-koh29-bill/</guid><description>&lt;p&gt;Bill Rainaud is an inside account executive at k6, which means he talks to users and potential users of k6 every day. In this Office Hours, he explains how to get started with load testing using k6 Cloud, which is a SaaS platform for running and scaling up load tests on the cloud. We also answered a few frequently asked questions about k6&amp;rsquo;s capabilities and how to do correlation in k6.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/eCv1XshEpDI?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to load test a GraphQL API built with Hasura using k6 (k6 Office Hours #28)</title><link>https://nicolevanderhoeven.com/blog/20210917-koh28-load-testing-graphql-with-hasura-and-k6/</link><pubDate>Fri, 17 Sep 2021 13:58:42 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210917-koh28-load-testing-graphql-with-hasura-and-k6/</guid><description>&lt;p&gt;My co-host &lt;a href="https://simme.dev"&gt;Simme&lt;/a&gt; and I had invited Adron Hall from &lt;a href="https://hasura.io"&gt;Hasura&lt;/a&gt; to come talk to us about how to load test a GraphQL API, but he was unable to come due to unforeseen circumstances. Luckily, Tom Miseur, who is part of the Professional Services branch of k6, was able to step in on very little notice!&lt;/p&gt;
&lt;p&gt;Tom has done a load testing engagement using k6 that involved Hasura, so he was able to tell us what it is and how it can be tested with k6. It turned out really well, thankfully!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/sAPHPvmfdPQ?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Intro to Load Testing With k6 and Grafana (webinar)</title><link>https://nicolevanderhoeven.com/blog/20210916-intro-to-load-testing-with-k6-and-grafana/</link><pubDate>Thu, 16 Sep 2021 22:11:16 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210916-intro-to-load-testing-with-k6-and-grafana/</guid><description>&lt;p&gt;Tonight I did a webinar with Grafana Labs&amp;ndash; the first k6-related webinar since the acquisition. I was more than a little nervous to give it, because I knew I was introducing k6 to a lot of new users, but also to Grafana for the first time. I think it went pretty well! I was still quite relieved when it was over, however. :)&lt;/p&gt;
&lt;p&gt;In the webinar, I talk about:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;why it&amp;rsquo;s still a good idea to do load testing in pre-production&lt;/li&gt;
&lt;li&gt;what k6 is&lt;/li&gt;
&lt;li&gt;why k6 and Grafana together make sense&lt;/li&gt;
&lt;li&gt;and how to integrate k6 and Grafana&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There&amp;rsquo;s quite a bit of demo in it, and I also had the k6 CEO, Robin Gustafsson, join me for Q&amp;amp;A as a nice treat.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/tFsIgbqXbxM?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Check out the full webinar &lt;a href="https://grafana.com/go/webinar/intro-to-load-testing-with-grafana-and-k6/"&gt;here&lt;/a&gt;&amp;ndash; it&amp;rsquo;s already up on the Grafana site. You can also go through my slides &lt;a href="https://docs.google.com/presentation/d/1WOA50nqIv1NoiHBxGIH_JM02rZqSjX81gHTlwPJ5i1U/edit?usp=sharing"&gt;here&lt;/a&gt;, if you&amp;rsquo;d like.&lt;/p&gt;</description></item><item><title>Schrödinger's Pokémon: k6 and Grafana edition</title><link>https://nicolevanderhoeven.com/blog/20210908-schrodingers-pokemon-k6-and-grafana/</link><pubDate>Wed, 15 Sep 2021 18:22:31 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210908-schrodingers-pokemon-k6-and-grafana/</guid><description>&lt;p&gt;Earlier this year, I gave a presentation at New Relic&amp;rsquo;s FutureStack conference about &lt;a href="https://nicolevanderhoeven.com/blog/20210730-schrodingers-pokemon/"&gt;chaos engineering with k6 and New Relic&lt;/a&gt;. A few months ago, k6 got acquired by &lt;a href="https://grafana.com"&gt;Grafana Labs&lt;/a&gt;, and so I wanted to redo it, but with the Grafana stack this time.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the result, and I think I like this iteration even better:&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/2QHs_HEX7r0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;I presented this talk at &lt;a href="https://www.youtube.com/watch?v=jSgH3I8_ldk"&gt;TestCon Europe 2021&lt;/a&gt; today, although the audio sync issues were not great, so I recommend you watch the video above instead.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.google.com/presentation/d/11HakdG0w2RsOunVnD6qPkTfTPpBxtXFECK_ynSOBraE/edit"&gt;Slides are here.&lt;/a&gt;&lt;/p&gt;</description></item><item><title>How Gitlab uses k6 for load testing, with Grant Young (k6 Office Hours #27)</title><link>https://nicolevanderhoeven.com/blog/20210910-koh27-how-gitlab-uses-k6-for-load-testing/</link><pubDate>Fri, 10 Sep 2021 18:13:26 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210910-koh27-how-gitlab-uses-k6-for-load-testing/</guid><description>&lt;p&gt;&lt;a href="https://www.linkedin.com/in/grantyoung86/"&gt;Grant Young&lt;/a&gt;, Software Engineer in Test at GitLab, joined &lt;a href="https://grafana.com/k6"&gt;k6 OSS&lt;/a&gt; maintainer &lt;a href="https://twitter.com/MStoykov"&gt;Mihail Stoykov&lt;/a&gt; and me to talk about how GitLab uses k6. Apparently, they began using k6 internally some time ago, and because they like to eat their own dogfood and use GitLab to test GitLab, they also incorporated k6 into GitLab so that their users could reap the benefits, too.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/YTGkq0m1bYk?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://docs.gitlab.com/ee/user/project/merge_requests/load_performance_testing.html"&gt;Here&amp;rsquo;s the GitLab documentation&lt;/a&gt; about how to do load testing in GitLab, and &lt;a href="https://k6.io/blog/integrating-load-testing-with-gitlab/"&gt;here&amp;rsquo;s a k6 blog post&lt;/a&gt; on how to set it up!&lt;/p&gt;</description></item><item><title>How to do continuous performance testing, with Lee Barnes (k6 Office Hours #26)</title><link>https://nicolevanderhoeven.com/blog/20210827-koh26-continuous-performance-testing-with-k6/</link><pubDate>Fri, 27 Aug 2021 09:34:13 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210827-koh26-continuous-performance-testing-with-k6/</guid><description>&lt;p&gt;&lt;a href="https://twitter.com/USI_LeeBarnes"&gt;Lee Barnes&lt;/a&gt; and I got connected because we are both speaking at &lt;a href="https://testcon.lt/"&gt;TestCon Europe 2021&lt;/a&gt; this year, and I thought it would be nice to have a chat with him before the conference to get a sneak peek at what he&amp;rsquo;s presenting about: continuous performance testing. Lee is the CEO of &lt;a href="https://utopiasolutions.com/"&gt;Utopia Solutions&lt;/a&gt;, and he&amp;rsquo;s been in the testing industry for decades, so I really appreciated his insights on where the industry is going.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/5pd0G-jBOTo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Catch Lee&amp;rsquo;s talk &lt;a href="https://testcon.lt/Lee-Barnes/"&gt;here&lt;/a&gt; and mine &lt;a href="https://testcon.lt/Nicole-van-der-Hoeven/"&gt;here&lt;/a&gt;!&lt;/p&gt;</description></item><item><title>How to debug k6 load testing scripts with Tom Miseur (k6 Office Hours #25)</title><link>https://nicolevanderhoeven.com/blog/20210820-koh25-k6_load_testing_scripts/</link><pubDate>Fri, 20 Aug 2021 14:38:11 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210820-koh25-k6_load_testing_scripts/</guid><description>&lt;p&gt;&lt;a href="https://www.linkedin.com/in/tommiseur/"&gt;Tom Miseur&lt;/a&gt; joined k6 at about the same time I did late last year, and we immediately hit it off because we both come from a performance testing consulting background AND we both had worked for different competing testing tool vendors before moving to k6. I was excited to have him on k6 Office Hours to talk about a topic we both had a lot to say about: how to debug load testing scripts, and specifically k6 scripts. We got a chance to do a bit of a show-and-tell of tools that we use that we use, and they are all independent of k6.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://wireshark.org"&gt;Wireshark&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.charlesproxy.com"&gt;Charles Proxy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mitmproxy.org"&gt;mitmproxy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.telerik.com/fiddler"&gt;Fiddler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://proxyman.io"&gt;Proxyman&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also got to demo &lt;a href="https://github.com/benc-uk/k6-reporter"&gt;a cool HTML reporting dashboard&lt;/a&gt; that Ben Coleman, a k6 user, created. While it&amp;rsquo;s not baked into the tool itself, it&amp;rsquo;s fairly straightforward to add it, requiring only two snippets of code that can be pasted onto any script.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Zln_TWOuoho?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Kubedim: Microservices testing using k6 for reliability, with Kelvin Zhang (k6 Office Hours #24)</title><link>https://nicolevanderhoeven.com/blog/20210813-kubedim-microservices-testing/</link><pubDate>Fri, 13 Aug 2021 15:50:46 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210813-kubedim-microservices-testing/</guid><description>&lt;p&gt;Today, my colleague &lt;a href="https://www.gonzalezlopes.com/"&gt;Daniel González Lopes&lt;/a&gt; joined me as a co-host on k6 Office Hours, and we interviewed &lt;a href="https://twitter.com/kelvzhan"&gt;Kelvin Zhang&lt;/a&gt; about his thesis at Imperial College London, using k6 to test microservices-based architectures. He created something called Kubedim, an application that intelligently applies non-uniform brownout theory to intentionally dim application requests for the purpose of improving overall availability.&lt;/p&gt;
&lt;p&gt;This was a dense Office Hours to digest, but Kelvin really impressed us with his experiments and findings! It&amp;rsquo;s definitely an awesome use case for k6 and just a great one to watch for any site reliability engineer.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/O1Evg9_EEmU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Monitoring your k6 load test: how to install Grafana and Prometheus on a Kubernetes cluster</title><link>https://nicolevanderhoeven.com/blog/20210811-how-to-install-grafana-prometheus-in-kubernetes/</link><pubDate>Wed, 11 Aug 2021 18:55:49 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210811-how-to-install-grafana-prometheus-in-kubernetes/</guid><description>&lt;p&gt;Running a load test is half of the equation, and not having the right observability tools to see how your application responds to the load can sometimes flat-out invalidate a test.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s how to install open-source tools Grafana and Prometheus on a Kubernetes cluster in DigitalOcean and how a performance user could use them for increased visibility during a load test.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/GL2v81xYuAQ?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Realistic load testing</title><link>https://nicolevanderhoeven.com/blog/20210807-clubhouse-realistic-load-tests/</link><pubDate>Sat, 07 Aug 2021 22:15:13 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210807-clubhouse-realistic-load-tests/</guid><description>&lt;p&gt;This is a conversation I recorded from Clubhouse in the Performance Engineers group created by NaveenKumar Namachivayam today, August 7th, 2021. I started by introducing myself and then let everyone know that I would be recording the conversation. Enjoy!&lt;/p&gt;
&lt;iframe src="https://open.spotify.com/embed/episode/5MJaz2PAhYfy5FShrIaXUK" width="100%" height="232" frameBorder="0" allowtransparency="true" allow="encrypted-media"&gt;&lt;/iframe&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/-hBVZqNJ4_A?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How we work at k6 - building software &amp; working remotely with CTO Pawel Suwala (k6 Office Hours #23)</title><link>https://nicolevanderhoeven.com/blog/20210806-koh23-pawel/</link><pubDate>Fri, 06 Aug 2021 18:09:05 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210806-koh23-pawel/</guid><description>&lt;p&gt;For this episode of k6 Office Hours, I got the k6 Chief Technical Officer, Pawel Suwala, to give a bit of a behind-the-scenes of how we work at k6 and what we&amp;rsquo;re working on next. We talked about the methodology we use for building k6, the different teams we have, and exciting new features that are coming soon!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/95PP2zwMlc0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Schrödinger's Pokémon: Observability for chaotic load testing (New Relic FutureStack)</title><link>https://nicolevanderhoeven.com/blog/20210730-schrodingers-pokemon/</link><pubDate>Sun, 01 Aug 2021 18:54:27 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210730-schrodingers-pokemon/</guid><description>&lt;p&gt;This is a presentation I gave at &lt;a href="https://newrelic.com/futurestack/speakers/nicole-van-der-hoeven"&gt;New Relic FutureStack 2021&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Deploying an application to production is often like putting a pokémon in a box and hoping it manages to stay alive despite real-world chaos and potential outages. What can we, as testers, do to prepare applications for these situations before they go live? In this talk, I discuss chaos engineering concepts and demonstrates how to apply them by incorporating load tests with chaos experiments and setting up observability tools to watch it all happen. Because without observability, how can we tell whether Schrödinger&amp;rsquo;s pokémon is alive or dead?&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/356yC-DOSmo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>A tester's overview of Grafana Labs open-source projects</title><link>https://nicolevanderhoeven.com/blog/20210719-grafana-labs-overview/</link><pubDate>Mon, 19 Jul 2021 18:23:33 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210719-grafana-labs-overview/</guid><description>&lt;p&gt;Since the acquisition of k6 by Grafana Labs, the entire k6 team has been absorbed into the new, larger team that we&amp;rsquo;re suddenly a part of. Grafana Labs maintains a lot of projects, so I was very quickly overwhelmed with things to learn about all of them. Here&amp;rsquo;s my attempt to make sense of the Grafana Labs landscape, and perhaps it can help some of you as well:&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/_DB-lNZW7LQ?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to run distributed load tests with k6 Operator (k6 Office Hours #21)</title><link>https://nicolevanderhoeven.com/blog/20210716-koh-k6-operator/</link><pubDate>Fri, 16 Jul 2021 18:17:13 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210716-koh-k6-operator/</guid><description>&lt;p&gt;In this week&amp;rsquo;s Office Hours, &lt;a href="https://simme.dev"&gt;Simme&lt;/a&gt; and I talked about the &lt;a href="https://github.com/grafana/k6-operator"&gt;k6 Operator&lt;/a&gt;, which is a open-source project that Simme created for distributed load testing with k6.&lt;/p&gt;
&lt;p&gt;k6 Cloud already offers a no-hassle distributed load testing experience, but for those who prefer to use their own infrastructure, k6 Operator allows the setup of a k6 test as a custom resource object that can be deployed along with a Kubernetes cluster.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/KPyI8rM3LvE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to add performance testing to CI/CD pipelines using k6 and GitHub Actions</title><link>https://nicolevanderhoeven.com/blog/20210712-github-actions/</link><pubDate>Mon, 12 Jul 2021 22:26:20 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210712-github-actions/</guid><description>&lt;p&gt;Continuous testing means verifying and improving software quality at all stages, including development. It can sound like something only large companies do, but it&amp;rsquo;s an approach I use even for this personal blog that you&amp;rsquo;re reading this on.&lt;/p&gt;
&lt;p&gt;Every new blog post or change I make to this site automatically triggers the execution of a small test. This test, when run over time, lets me see whether changes I&amp;rsquo;ve made have been detrimental to site performance. Here&amp;rsquo;s a video on my setup:&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/GzR2Z25-Yqo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Load testing and Azure DevOps with José Luis Latorre Millas (k6 Office Hours #20)</title><link>https://nicolevanderhoeven.com/blog/20210709-koh-jose/</link><pubDate>Fri, 09 Jul 2021 21:08:36 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210709-koh-jose/</guid><description>&lt;p&gt;José Luis Latorre Millas, Developer Community Lead and Software Architect at Swiss Life AG, joined &lt;a href="https://simme.dev"&gt;Simme&lt;/a&gt; and me on k6 Office Hours to talk about how he personally uses k6 with Azure DevOps to add load testing to his team&amp;rsquo;s CI/CD pipeline.&lt;/p&gt;
&lt;p&gt;I got to know José from the k6 Community Slack workspace when he mentioned that he would be presenting on k6 in a few meetups. I went to &lt;a href="https://www.youtube.com/watch?v=HITJg03AQFo&amp;amp;t=112s"&gt;his livestream with CrossDvlUp&lt;/a&gt; (Spanish) and enjoyed his approach, so I knew I wanted to have him on. It&amp;rsquo;s always great to have real users of k6 (both of the OSS and the commercial Cloud option) talk about how they personally use k6 and even what they found lacking in the tool.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/vC2pKgVFxt8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;José&amp;rsquo;s multi-scenario template repo: &lt;a href="https://github.com/SwissLife-OSS/K6-MultiScenario-template"&gt;https://github.com/SwissLife-OSS/K6-MultiScenario-template&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Register to watch José&amp;rsquo;s talk at Azure Summit 2021, later this year: &lt;a href="https://azuresummit.live/speaker/jose-luis-latorre-millas/"&gt;https://azuresummit.live/speaker/jose-luis-latorre-millas/&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Acquisition talk with CEOs Raj Dutt (Grafana) and Robin Gustafsson (k6) (k6 Office Hours #19)</title><link>https://nicolevanderhoeven.com/blog/20210702-koh-raj-robin/</link><pubDate>Fri, 02 Jul 2021 21:04:13 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210702-koh-raj-robin/</guid><description>&lt;p&gt;This week on k6 Office Hours, &lt;a href="https://simme.dev"&gt;Simme&lt;/a&gt; and I were joined by two CEOs: k6 CEO &lt;a href="https://www.linkedin.com/in/robinegustafsson/"&gt;Robin Gustafsson&lt;/a&gt; and Grafana Labs CEO &lt;a href="https://twitter.com/nopzor"&gt;Raj Dutt&lt;/a&gt;. It was a little nerve-wracking to have two CEOs on the stream, but it did give us the opportunity to ask both of them pointed questions on Grafana Labs&amp;rsquo;s acquisition of k6, including any plans they have for how both companies could integrate better in the future.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/sfWIB-myito?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>What you need to know about Grafana Labs's acquisition of k6</title><link>https://nicolevanderhoeven.com/blog/20210630-gl-acquisition/</link><pubDate>Wed, 30 Jun 2021 18:29:24 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210630-gl-acquisition/</guid><description>&lt;p&gt;Recently, during Grafanaconline 2021, &lt;a href="https://grafana.com/about/press/2021-06-17-grafana-labs-brings-modern-open-source-load-testing-to-observability-with-acquisition-of-k6/"&gt;Grafana Labs CEO Raj Dutt announced&lt;/a&gt; the acquisition of k6&amp;ndash; the company I work for. What does this mean? Here&amp;rsquo;s a video I made to explain it all:&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/t1agJsLwrGE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://simme.dev"&gt;Simme&lt;/a&gt; and I have also discussed the acquisition twice on k6 Office Hours:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=RrDo2wMeV80"&gt;once with our CEO, Robin Gustafsson&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;and another time with &lt;a href="https://www.youtube.com/watch?v=sfWIB-myito"&gt;both Robin and Raj, Grafana Labs CEO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;TL;DW: We unanimously agree it&amp;rsquo;s a positive thing. I myself am cautiously optimistic about the future of both k6 and Grafana Labs.&lt;/p&gt;</description></item><item><title>How to use k6 to benchmark hosting providers with Kevin Ohashi (k6 Office Hours #18)</title><link>https://nicolevanderhoeven.com/blog/20210625-koh-kevin/</link><pubDate>Fri, 25 Jun 2021 20:57:42 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210625-koh-kevin/</guid><description>&lt;p&gt;&lt;a href="https://twitter.com/kevinohashi"&gt;Kevin Ohashi&lt;/a&gt; joined me and &lt;a href="https://twitter.com/FloorDrees/"&gt;Floor Drees&lt;/a&gt; on k6 Office Hours to talk about how he used k6 to &lt;a href="https://wphostingbenchmarks.com/"&gt;benchmark the performance of WordPress hosting providers&lt;/a&gt;. He talks about the difficulties he ran into while trying to keep tests repeatable and consistent, and I also make some suggestions for how he could improve his load testing script for future comparisons.&lt;/p&gt;
&lt;p&gt;Of particular note for me in his results was how clearly the performance of the hosting providers varied depending on the location Kevin had selected for his load generators. One in particular showed a significant delay when a site was fetched from Sydney, indicating the possibility of a lack of a CDN server in that region. It made a great argument for load testing in the cloud, from different geographical regions.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/NSOOYiBsPII?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;WordPress Hosting Performance Benchmarks: &lt;a href="https://wphostingbenchmarks.com/"&gt;https://wphostingbenchmarks.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Benchmarks methodology: &lt;a href="https://wphostingbenchmarks.com/methodology/"&gt;https://wphostingbenchmarks.com/methodology/&lt;/a&gt;&lt;/p&gt;</description></item><item><title>k6 is part of Grafana Labs! AMA with CEO Robin Gustafsson (k6 Office Hours #17)</title><link>https://nicolevanderhoeven.com/blog/20210618-koh-with-robin-grafana/</link><pubDate>Fri, 18 Jun 2021 22:26:49 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210618-koh-with-robin-grafana/</guid><description>&lt;p&gt;On this week&amp;rsquo;s Office Hours, &lt;a href="https://simme.dev"&gt;Simme&lt;/a&gt; and I were joined by &lt;a href="https://www.linkedin.com/in/robinegustafsson/"&gt;Robin Gustafsson&lt;/a&gt;, the CEO of k6, to make a big announcement: k6 has been acquired by Grafana Labs.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/RrDo2wMeV80?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;The folks at Grafana Labs have been fans of k6 for a while, and we&amp;rsquo;ve been fans (and users) of their work since almost the beginning of k6. While a surprise to many, Grafana and k6 together is a combination that makes sense.&lt;/p&gt;
&lt;p&gt;Read &lt;a href="https://grafana.com/about/press/2021-06-17-grafana-labs-brings-modern-open-source-load-testing-to-observability-with-acquisition-of-k6/"&gt;Grafana&amp;rsquo;s press release here&lt;/a&gt; to hear more about this milestone.&lt;/p&gt;</description></item><item><title>Accessibility and open source support program with Floor Drees (k6 Office Hours #16)</title><link>https://nicolevanderhoeven.com/blog/20210611-koh-with-floor/</link><pubDate>Fri, 11 Jun 2021 22:38:52 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210611-koh-with-floor/</guid><description>&lt;p&gt;On this week&amp;rsquo;s Office Hours, &lt;a href="https://simme.dev"&gt;Simme&lt;/a&gt; and I were joined by &lt;a href="https://twitter.com/FloorDrees/"&gt;Floor Drees&lt;/a&gt;, the newest member to join the k6 team. Every new person at k6 goes through a week of testing, and Floor decided to spend her week of testing doing an accessibility review on the k6 Cloud web app and documentation. We talk about how accessibiltiy is an often-overlooked form of operational testing, and Floor shares specific tools that testers can use to make applications more accessible.&lt;/p&gt;
&lt;p&gt;We also discuss the k6 open source support program, which makes k6 free for open-source maintainers and regular contributors.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/3jvM9JB1YZY?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="resources-mentioned"&gt;Resources mentioned&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://k6.io/oss-program/"&gt;k6 Open Source Support Program&lt;/a&gt;
&lt;a href="https://www.boia.org"&gt;Boia.org&lt;/a&gt;, a good tool for accessibility reviews
&lt;a href="https://alexjs.com"&gt;AlexJS&lt;/a&gt;, for identifying inconsiderate language
&lt;a href="https://www.youtube.com/watch?v=7ASFUzRDeMg"&gt;Paul Bruce&amp;rsquo;s rant&lt;/a&gt; on operational requirements instead of &amp;ldquo;non-functional&amp;rdquo; requirements
Marie Drake on &lt;a href="https://www.youtube.com/watch?v=ve7Rg0MUZ0g"&gt;accessibility using Cypress&lt;/a&gt;
&lt;a href="https://chrome.google.com/webstore/detail/dark-reader/eimadpbcbfnmbkopoojfekhnkhdbieeh"&gt;Chrome extension&lt;/a&gt; to get dark mode everywhere
Contributing Today - &lt;a href="https://www.contributing.today/april-7-oss-funding-sponsorship/oss-funding-and-sponsorship-panel-discussion/"&gt;open source funding and sponsorship&lt;/a&gt;
Contributing Today - &lt;a href="https://www.contributing.today/past-sessions/open-source-licensing/"&gt;on open source licensing&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Making k6 extensions using xk6, with Iván Szkiba and Mihail Stoykov (k6 Office Hours)</title><link>https://nicolevanderhoeven.com/blog/20210604-koh-ivan/</link><pubDate>Sat, 05 Jun 2021 22:28:29 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210604-koh-ivan/</guid><description>&lt;p&gt;This week on k6 Office Hours, &lt;a href="https://simme.dev"&gt;Simme&lt;/a&gt; and I were joined by &lt;a href="https://twitter.com/szkiba"&gt;Iván Szkiba&lt;/a&gt; and &lt;a href="https://twitter.com/MStoykov"&gt;Mihail Stoykov&lt;/a&gt; to talk all about extensions. Iván, who is a System Architect at NNG LLC, is the most active k6 extension creator outside of the k6 team. Mihail is a software engineer at k6, and one third of the k6 OSS team.&lt;/p&gt;
&lt;p&gt;We talked about the many extensions Iván has created for k6 so that he can incorporate k6 into his team&amp;rsquo;s daily testing activities, his considerations for creating extensions, and how he got started. Mihail also shares some inside information on why certain decisions were made about the way k6 is structured, and common mistakes he sees people make in their custom extensions.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/I-NtzkxdzyA?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>What Is Load Testing? - A real-world explanation</title><link>https://nicolevanderhoeven.com/blog/20210601-what-is-load-testing/</link><pubDate>Tue, 01 Jun 2021 20:23:17 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210601-what-is-load-testing/</guid><description>&lt;p&gt;I&amp;rsquo;ve made about 60 videos on load testing and application performance to date, but I realized that I&amp;rsquo;ve never made one defining load testing, which seemed like a glaring mistake. So, here&amp;rsquo;s my attempt!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/cCFwqlcHkX8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Rough transcript below - though I went off script a few times:&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Load testing is a key part of making sure that an application performs well and reliably. But what IS load testing, anyway? In this video, I break it down for you in simple terms. And if you&amp;rsquo;re a family member or friend of mine trying to understand what it is I do for a living, thank you! This is for you too.&lt;/p&gt;
&lt;h3 id="software-testing"&gt;Software testing&lt;/h3&gt;
&lt;p&gt;It takes a whole team to build software, but some roles are more visible than others. For example, pretend you want to build a bridge. Who do you need to build it?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An architect to design the specifications of the bridge&lt;/li&gt;
&lt;li&gt;A liaison or representative to the gemeente or local council to clarify what the specifications ARE&lt;/li&gt;
&lt;li&gt;Builders who will physically build the bridge, who might need to hire subcontractors for various materials and services&lt;/li&gt;
&lt;li&gt;Someone to double-check that what you&amp;rsquo;re building is up to code (testers)&lt;/li&gt;
&lt;li&gt;Someone to manage it all, and maybe a few more levels of team leads&lt;/li&gt;
&lt;li&gt;Traffic enforcers to detour traffic away from the bridge while it&amp;rsquo;s being built&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So who is responsible for &amp;ldquo;building&amp;rdquo; the bridge? The answer is, everybody. Everybody has a part to play. Every part is important.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s the same thing with software. When we think about building software, we often think about developers, but that&amp;rsquo;s not the full picture. Just like building a bridge, it&amp;rsquo;s a team effort. But I want to zoom in on one role in particular, because it&amp;rsquo;s the role I&amp;rsquo;ve had most often: load tester.&lt;/p&gt;
&lt;p&gt;But first, let&amp;rsquo;s go on a field trip.&lt;/p&gt;
&lt;h3 id="load-testing-on-the-field"&gt;Load testing on the field&lt;/h3&gt;
&lt;p&gt;Does this bridge look familar? This is the Sint Servaasbrug, and they SAY that it&amp;rsquo;s the bridge on the €10 note. It might be true, too, because it&amp;rsquo;s here in my current hometown of Maastricht, the Netherlands, where the European Union was founded in the Treaty of Maastricht. The name Maastricht means the crossing of the Maas, which is the name of this river here.&lt;/p&gt;
&lt;p&gt;So let&amp;rsquo;s pretend the bridge hasn&amp;rsquo;t been built yet, and that we&amp;rsquo;re helping build it. Let&amp;rsquo;s put on our load tester hats. As a load tester, it&amp;rsquo;s our job to make sure that the bridge can support the weight it is intended to support.&lt;/p&gt;
&lt;p&gt;How do we know how much weight it&amp;rsquo;s intended to support? Well, the council or the rest of the team helping us build the bridge might have some ideas on that, or some building standards that we can use. That&amp;rsquo;s a good place to start, and we should definitely discuss that with them, but as a load tester, it&amp;rsquo;s also our job to question those requirements. Let&amp;rsquo;s do some research.&lt;/p&gt;
&lt;p&gt;This is the street leading up to the bridge. Remember, the bridge isn&amp;rsquo;t built yet, but maybe we can get an idea of the kind of traffic that the area gets.&lt;/p&gt;
&lt;p&gt;Some things to watch out for or questions to answer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How many people are walking?&lt;/li&gt;
&lt;li&gt;How many are on bikes?&lt;/li&gt;
&lt;li&gt;How many are on bakfiets bikes?&lt;/li&gt;
&lt;li&gt;Are vehicles allowed on this street, and if so, how many of them drive through?&lt;/li&gt;
&lt;li&gt;Do people tend to pass by in groups, or on their own?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Another thing we can do is check other bridges. This is the Hoogbrug, another bridge across the Maas river. It&amp;rsquo;s not going to be an exact match for the kind of traffic we might expect on OUR bridge, but it might give us some ideas. So we can scout this out the way we did the street near our bridge.&lt;/p&gt;
&lt;p&gt;One difference we can see right away is that this bridge has stairs on both ends. Our bridge isn&amp;rsquo;t going to have that. The stairs do have the lip to make pushing a bike up it easier, but it&amp;rsquo;s not as easy as riding through, and any heavier vehicles are out. And people are probably less likely to go up stairs than they are to walk up an incline. So we already know that this bridge will probably experience less traffic than our bridge, but it&amp;rsquo;s still good to take notes on.&lt;/p&gt;
&lt;p&gt;Okay, let&amp;rsquo;s head back home, write down our findings, and think about what we&amp;rsquo;ve learned.&lt;/p&gt;
&lt;h3 id="tying-it-back-to-software-testing"&gt;Tying it back to software testing&lt;/h3&gt;
&lt;p&gt;What we learned was useful, but there are still a few things we don&amp;rsquo;t know:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It is 10 AM right now. But is that really the highest point of traffic during the day? To be really sure, we should really try to go back at different times. Maybe there&amp;rsquo;s an increased amount of traffic during lunch as people go to restaurants or back to their homes to eat. Maybe a horde of kids would go across our bridge after school to go home.&lt;/li&gt;
&lt;li&gt;And we should think beyond that, too. Are weekends busier because more people are out? Or are weekdays busier because people are going to and from work?&lt;/li&gt;
&lt;li&gt;Then there are some things that are seasonal. Maastricht happens to be in the part of the Netherlands that celebrates Carnaval, so sometimes that area looks like &lt;em&gt;this&lt;/em&gt;. Carnaval involves a slow parade of people, bikes, and trucks through the bridge to the central town square, called the Vrijthof. That&amp;rsquo;s absolutely something we&amp;rsquo;ll have to plan for when testing our bridge.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We&amp;rsquo;ve been talking about the bridge this whole time, but as load testers, we go through the same process for software, too. What we&amp;rsquo;ve just done on our field trip is called a workload model. A workload model is describes the load profile for a given test scenario, and it involves determining &lt;em&gt;what&lt;/em&gt; (the key transactions), &lt;em&gt;how much&lt;/em&gt; (the load distribution among the transactions) and &lt;em&gt;when&lt;/em&gt; (timing of the load) to test.&lt;/p&gt;
&lt;p&gt;For a web application, for example, like a web site, we might try to look through analytics and monitoring tools to try to determine things like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How many users access our site?&lt;/li&gt;
&lt;li&gt;Which pages do they visit? Some pages are like pedestrians - they don&amp;rsquo;t have much comparative weight and aren&amp;rsquo;t complex to process. But other pages are like big old trucks, that involve many components of our application and are comparatively very intensive.&lt;/li&gt;
&lt;li&gt;When do they visit the site? Is our site the sort of site people go to to work, or to avoid work? at weekends, or during the week?&lt;/li&gt;
&lt;li&gt;Are there any seasonal events, like sales or holidays, that might drive MORE people to our site?&lt;/li&gt;
&lt;li&gt;Where are the users from? Are they in the same country that our application servers are located in, or are they quite far away? What sort of internet speeds do they have? What percentage of them use computers to access our site, and what percentage of them use tablets or mobiles?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That was just a taste of the kinds of questions a load tester has to answer during the course of testing. There&amp;rsquo;s still a lot more to cover - for starters, we haven&amp;rsquo;t even talked about how to actually RUN the tests yet! I plan to make more videos going through typical activites in load testing in more detail, but for now, I hope that gave you a good idea of what load testing is. And Mom, I hope you know what I do for a living now. :D&lt;/p&gt;
&lt;p&gt;Thanks for watching!&lt;/p&gt;</description></item><item><title>Interview on Performance Time Podcast</title><link>https://nicolevanderhoeven.com/blog/20210531-performance-time/</link><pubDate>Mon, 31 May 2021 11:28:18 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210531-performance-time/</guid><description>&lt;p&gt;I first heard of &lt;a href="https://twitter.com/perftestnz"&gt;Stephen Townshend&lt;/a&gt; because he happens to have gotten the same introduction to performance testing that I did&amp;ndash; our shared mentor, &lt;a href="https://www.linkedin.com/in/stijnschepers/"&gt;Stijn Schephers&lt;/a&gt;. He has started a podcast called Performance Time, where he interviews performance engineers about a variety of topics. This week, it was me!&lt;/p&gt;
&lt;iframe src="https://open.spotify.com/embed/episode/3pp3ZFFB8DyfUEtLRuLxGe" width="100%" height="232" frameBorder="0" allowtransparency="true" allow="encrypted-media"&gt;&lt;/iframe&gt;
&lt;p&gt;We talked about how I got started, one of my biggest failures as a performance tester, chaos engineering, what we can do to improve diversity in tech, and why I think note-taking is a key skill for any performance tester.&lt;/p&gt;</description></item><item><title>Application Performance Monitoring using Netdata and k6, with Odysseas Lamtzidis (k6 Office Hours)</title><link>https://nicolevanderhoeven.com/blog/20210528-koh-odysseas/</link><pubDate>Fri, 28 May 2021 23:24:48 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210528-koh-odysseas/</guid><description>&lt;p&gt;This week, we had &lt;a href="https://twitter.com/odysseas_lam"&gt;Odysseas Lamtzidis&lt;/a&gt; on the show to talk about &lt;a href="https://netdata.cloud"&gt;Netdata&lt;/a&gt;, which is an application performance monitoring tool that prides itself on having the easiest setup ever. Odysseas admitted that it might not have all the bells and whistles of other monitoring platforms, it Just Works. I see this as being very interesting especially for testers like me, who just want to have something set up but might not want to be bothered by the implementation.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Y2dVJssTemI?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>End-to-End Guide for Load Testing</title><link>https://nicolevanderhoeven.com/blog/20210524-end-to-end-guide-for-load-testing/</link><pubDate>Mon, 24 May 2021 10:48:55 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210524-end-to-end-guide-for-load-testing/</guid><description>&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://abstracta.us/blog/performance-testing/load-testing-guide/"&gt;Abstracta blog&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;link rel="canonical" href="https://abstracta.us/blog/performance-testing/load-testing-guide/"&gt;
&lt;p&gt;If you have a public-facing web application, the odds are you should probably be thinking about load testing. Any tester can (and should) add load testing to their repertoire.&lt;/p&gt;
&lt;p&gt;Functional tests are often carried out with a single user&amp;rsquo;s experience of your application in mind, but what happens when hundreds or thousands of users are on your site at the same time? Load testing helps prepare an application for this eventuality by simulating that situation before the application goes live. That way, you have time to fix any issues you find, and there are no nasty surprises in production.&lt;/p&gt;
&lt;p&gt;In this guide, I&amp;rsquo;m going to walk you through the basics of the load testing process, which fits in closely with traditional functional testing phases as well:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Planning: &lt;em&gt;Why are we testing? What are we testing?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Writing test scripts: &lt;em&gt;How are we testing?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Execution: &lt;em&gt;Running test scripts against the application.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Analysis and reporting: &lt;em&gt;What happened, and what do we need to fix?&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="planning-for-load-testing"&gt;Planning for load testing&lt;/h2&gt;
&lt;p&gt;During the planning phase, the team gets together and determines what load testing will involve, including the objectives, scope, resources needed, and test scenarios. The deliverable for this phase is a test plan, but that can be as formal or informal as the team requires.&lt;/p&gt;
&lt;p&gt;Planning for any testing is a team activity, and you&amp;rsquo;ll want to get input from all the stakeholders &amp;ndash; that&amp;rsquo;s anyone who is involved in or might be affected by the testing. The first thing you need to clarify is the reason for load testing.&lt;/p&gt;
&lt;h3 id="requirements"&gt;Requirements&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Why are we doing load testing?&lt;/em&gt; seems like a very simple question, but you may be surprised by the varying answers from your stakeholders. Their reasons may require different test scenarios, so it&amp;rsquo;s a good idea to agree on the collective objectives of this load testing cycle so that expectations are set accordingly. A requirement is a concise statement of how an application should behave in a given situation.&lt;/p&gt;
&lt;p&gt;Phrasing objectives as nonfunctional requirements (NFRs) is a good way to formalize them. An NFR defines the desired state of the application and can includes performance thresholds that the team decides on. For example: &lt;em&gt;Logging in as a registered user must take no more than 3 seconds (90th percentile response time)&lt;/em&gt; is a requirement based on response time. Good requirements are SMART (Specific, Measurable, Agreed Upon, Realistic, and Timely).&lt;/p&gt;
&lt;p&gt;Here are some other things that should be decided on during this phase:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scope&lt;/strong&gt;. &lt;em&gt;What are we testing?&lt;/em&gt; Deciding on a shared objective for load testing lets you narrow down what areas of the application need to be targeted. Make sure everyone is clear on what &lt;em&gt;won&amp;rsquo;t&lt;/em&gt; be tested.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/daria-nepriakhina-zoCDWPuiRuA-unsplash.jpg" alt="Post-its on a board for planning" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo by &lt;a href="https://unsplash.com/@epicantus?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Daria Nepriakhina&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/post-it?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Entry Criteria&lt;/strong&gt;. What do you need to begin? This is the time to start thinking about resources that are required for testing, including the number of people who need to be involved, the time it takes to carry out the testing, and environment requirements (including test data). You don&amp;rsquo;t always need a separate testing environment to do load testing, but if you do, that should be discussed up front so that the DevOps team knows you can&amp;rsquo;t begin without an environment.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Workload Modeling&lt;/strong&gt;. A workload model is a set of characteristics that describe the load you&amp;rsquo;re attempting to simulate. If you want your load testing to simulate registered users accessing your site, what does that entail? This might require you to look through your site analytics to determine which pages are visited most often and which application features are most commonly used, or arrive at an estimate if analytics are not available. Are most users visiting from their laptops at lunch on work days, or do they use your site from mobile devices after work? Are most of them located in the US or in Europe? You&amp;rsquo;ll want your scripts to match real load as much as possible, so take note of key characteristics that might have an effect on the traffic your application experiences.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Server monitoring&lt;/strong&gt;. Which application components will be involved? You want to have a plan in place to have monitoring, alerts, and logs set up on every server that will be tested by your scripts. If your load testing tool shows performance degradation, you want to be able to have information to look through on the relevant servers to troubleshoot that issue. Keep in mind that any sort of monitoring adds some resource overhead, so decide as a team what information you absolutely need to track.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Test Scenarios&lt;/strong&gt;. Which situations do you want to recreate? A test scenario objectively describes the situation to be simulated. Do you want to recreate the load profile of a typical day, or one from a very high-traffic period, such as during a sale? Do you want to recreate a production outage? You can use analytics data to come up with parameters for your each test scenario such as duration, number of concurrent users or requests, ramp up period (how quickly the application went from 0 users to your highest number of users), or how &amp;ldquo;spiky&amp;rdquo; the load needs to be (how the number of requests per second fluctuates throughout the test).&lt;/p&gt;
&lt;p&gt;Everything discussed in this phase should be written in some sort of a load testing plan, which could be a formal, multi-page document, an epic with many user stories, or a bunch of Trello cards. Use the tools your team already uses. The format isn&amp;rsquo;t important; formalizing the outcome of the discussions is what counts. The test plan makes sure everyone has the same intent with regard to the testing.&lt;/p&gt;
&lt;h2 id="writing-load-testing-scripts"&gt;Writing load testing scripts&lt;/h2&gt;
&lt;p&gt;Now it&amp;rsquo;s time to start writing scripts! You&amp;rsquo;ve already front-loaded a lot of the important decisions to the planning phase, so all that&amp;rsquo;s left to do in this step is to implement the plan in the form of load testing scripts.&lt;/p&gt;
&lt;h3 id="tool-selection"&gt;Tool selection&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/tools_on_market.png" alt="Different load testing tools on the market" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;There are many load testing tools available on the market, and the reality is that you don&amp;rsquo;t always get to be the one to choose what you use. Often, companies have already made agreements with tool vendors for licenses before you begin your load testing, and it would be financially infeasible to switch to another tool. However, if you&amp;rsquo;re lucky enough that you can choose the load testing tool, here are a few considerations for assessing different tools:&lt;/p&gt;
&lt;h4 id="resources-and-costs"&gt;Resources and costs&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;How much does it cost? Does the pricing model allow for scaling usage up and down as necessary?&lt;/li&gt;
&lt;li&gt;Should you &lt;a href="https://k6.io/what-to-consider-when-building-or-buying-a-load-testing-solution/"&gt;build or buy&lt;/a&gt; an end-to-end load testing solution?&lt;/li&gt;
&lt;li&gt;What technical skills or experience with tools does your team have? Who will be doing the testing?&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="features"&gt;Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Does the load testing tool support the protocols and technologies used by the application?&lt;/li&gt;
&lt;li&gt;How easy would it be for the team to learn this tool and/or scripting language?&lt;/li&gt;
&lt;li&gt;Does the tool make it easy for multiple people to collaborate on the same script?&lt;/li&gt;
&lt;li&gt;Does it integrate with other tools in the testing stack (for test management, test result analysis, server monitoring, team communication)?&lt;/li&gt;
&lt;li&gt;Could you add this tool to your CI/CD pipeline?&lt;/li&gt;
&lt;li&gt;Does the tool have an easy way of setting thresholds or SLOs for performance?&lt;/li&gt;
&lt;li&gt;Are the test results displayed in usable reports, or does the tool integrate with existing data visualization tools you are using?&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="support"&gt;Support&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;If something goes wrong, does customer support cost extra?&lt;/li&gt;
&lt;li&gt;Is there ample documentation available online for getting started without help?&lt;/li&gt;
&lt;li&gt;Is there a community of users of the tool whose experiences you could learn from?&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="scaling-up-load-testing"&gt;Scaling up load testing&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;How many virtual users or requests per second can a single load generator simulate using the tool?&lt;/li&gt;
&lt;li&gt;How many load generators would you need if you used this tool?&lt;/li&gt;
&lt;li&gt;Can the tool handle the amount of test data required by your tests?&lt;/li&gt;
&lt;li&gt;Can you execute tests from different geographical locations, depending on your the location of your users?&lt;/li&gt;
&lt;li&gt;Does the tool allow you to generate load from the cloud?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These questions are not exhaustive, but you can use them as a starting point for your comparisons of load testing tools.&lt;/p&gt;
&lt;p&gt;For this guide, I&amp;rsquo;m going to outline a basic script in &lt;a href="https://k6.io"&gt;k6&lt;/a&gt; for a few reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It&amp;rsquo;s open-source, so anyone reading this can download the tool and the script and try it out for themselves;&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s written in JavaScript, which makes it easy to learn for front-end developers or testers who have used tools like Cypress, Puppeteer, or Playwright.&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s capable of generating &lt;a href="https://k6.io/docs/testing-guides/running-large-tests/"&gt;tens of thousands of users&lt;/a&gt; on a single machine, so it&amp;rsquo;s cost-effective even with load ramped up.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;However, the principles I discuss will be applicable to other tools. I highly recommend you conduct your own proof of concepts with several tools to come up with a tool that fits your particular situation, test scenarios, and company.&lt;/p&gt;
&lt;h3 id="installation-and-setup"&gt;Installation and setup&lt;/h3&gt;
&lt;p&gt;If you&amp;rsquo;re on a Mac, the easiest way to install k6 is to use Brew. Run &lt;code&gt;brew install k6&lt;/code&gt; from your terminal, and you&amp;rsquo;ll be ready to go in a few seconds.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re on a different operating system, &lt;a href="https://k6.io/docs/getting-started/installation/"&gt;check here for installation instructions&lt;/a&gt; that apply to you.&lt;/p&gt;
&lt;h3 id="a-basic-k6-test-script"&gt;A basic k6 test script&lt;/h3&gt;
&lt;p&gt;A barebones k6 test script looks like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;http&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;k6/http&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;default&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; () {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;response&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;http&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;https://test.k6.io&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This script sends an HTTP GET request for the URL &lt;code&gt;https://test.k6.io&lt;/code&gt;, which is a simple test site. If you copy that code to your favorite text editor and save it as &lt;code&gt;test.js&lt;/code&gt;, you can then run it with the command &lt;code&gt;k6 run test.js&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll get something like this in response:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/k6-supersimple-run.png" alt="A sample run of a simple local test in k6" loading="lazy" decoding="async"&gt;
&lt;em&gt;A sample run of a simple local test in k6&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The output above means that you&amp;rsquo;ve executed 1 iteration of your script with 1 virtual user from your local machine. The test run consisted of 1 HTTP request, which had a response time of 128.2 ms (&lt;code&gt;http_req_duration&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;It might be tempting to start scaling up the test at this point, increasing the number of virtual users and the duration of the script. But there&amp;rsquo;s one problem with the script as it is: it&amp;rsquo;s not realistic.&lt;/p&gt;
&lt;h3 id="making-a-test-script-realistic"&gt;Making a test script realistic&lt;/h3&gt;
&lt;p&gt;The purpose of a load testing script is to simulate a real user who accesses your site. In most cases, that involves more than the simple GET request from the script above. Load testing scripts don&amp;rsquo;t have to mimic a real user &lt;em&gt;exactly&lt;/em&gt;, but they do have to be close enough so as to apply the same amount, shape, and distribution of the load on your application server. If your load testing scripts aren&amp;rsquo;t realistic enough, you may get false positives during testing and discover too late that there is a performance issue in an application component that your scripts didn&amp;rsquo;t test.&lt;/p&gt;
&lt;p&gt;Here are some ways to make your scripts more realistic:&lt;/p&gt;
&lt;h4 id="add-static-resources"&gt;Add static resources&lt;/h4&gt;
&lt;p&gt;If a page has static resources like images and scripts that are retrieved by a browser automatically, make sure your script retrieves those too, as they will have an impact on the response times you get. Consider excluding static resources fetched from third-party providers unless you&amp;rsquo;ve gotten their permission to run a load test on their servers.&lt;/p&gt;
&lt;h4 id="set-cache-and-cookie-behavior"&gt;Set cache and cookie behavior&lt;/h4&gt;
&lt;p&gt;Review your load testing tool&amp;rsquo;s default cache and cookie management settings and change them, if necessary, to match the scenario you want to test. First-time visitors to a site won&amp;rsquo;t have resources cached locally, but repeat visitors may be retrieving resources from the cache.&lt;/p&gt;
&lt;h4 id="add-think-time"&gt;Add think time&lt;/h4&gt;
&lt;p&gt;Real users don&amp;rsquo;t usually fetch the same URL over and over again without stopping. They navigate to your site, then spend some time reading the contents of the homepage before they interact with the page again. Think time is the amount of time that a user spends “thinking”— that is, the delay between requests. Adding a think time that varies between 1 and 5 seconds, for example, prevents the application server from getting artificially bombarded by requests in a way that wouldn&amp;rsquo;t occur in production.&lt;/p&gt;
&lt;h4 id="using-different-user-paths"&gt;Using different user paths&lt;/h4&gt;
&lt;p&gt;A user path is the flow of how a user interacts with the application. What pages do they visit? What information do they type in? So far, you&amp;rsquo;re only testing one request, but perhaps your users may be performing other actions. The workload model that you put together in the Planning phase will come into play here. Other actions like logging in or paying for items in a cart exercise different parts of an application than browsing does, so the load testing script should reflect the most common user flows through your system. In k6, this is done by adding scenarios, but other tools may call them thread groups or execution groups.&lt;/p&gt;
&lt;h4 id="adding-test-data"&gt;Adding test data&lt;/h4&gt;
&lt;p&gt;In the same way that users don&amp;rsquo;t (typically) search for the same keyword over and over again and don&amp;rsquo;t all log into the same test account, a script shouldn&amp;rsquo;t use the same data repeatedly. This behavior could cause responses to be cached, leading to misleadingly quick response times, or increased error rates, in the case of multiple virtual users attempting to log into the same account. To prevent that, modify your script to take data from a CSV file instead, letting you add some natural variation.&lt;/p&gt;
&lt;h4 id="setting-test-parameters"&gt;Setting test parameters&lt;/h4&gt;
&lt;p&gt;Test parameters are the main characteristics of the test and include the number of users, ramp up, duration, and ramp down. They control the shape of the user load, which you can see when you plot the number of virtual users over time during the test:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/k6-vusonly.png" alt="The number of virtual users over time during a load test, as graphed in k6" loading="lazy" decoding="async"&gt;
&lt;em&gt;The number of virtual users over time during a load test, as graphed in k6&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Ramp up is a period of time during which virtual users are gradually added, usually at the start of the test, and ramp down is when they are gradually stopped. For most applications, ramps are more realistic than all users clicking a link at exactly the same time.&lt;/p&gt;
&lt;h4 id="setting-failure-criteria"&gt;Setting failure criteria&lt;/h4&gt;
&lt;p&gt;Part of simulating real users is determining what constitutes failures in user experience. You can incorporate failure criteria into scripts by adding response verifications, checks, and thresholds (such as those for response time or error rate). Building these into the script is a good practice to get into, because it defines the limits of acceptable performance from the beginning.&lt;/p&gt;
&lt;p&gt;The suggestions in this section are for general use, but there are many situations where taking the opposite approach would be more realistic. Spend some time thinking about what is &amp;ldquo;realistic&amp;rdquo; for your application and test scenario.&lt;/p&gt;
&lt;p&gt;For your reference, &lt;a href="https://gist.github.com/nicolevanderhoeven/fb74cd9769c8abf95eeb8765a49398cb"&gt;here&amp;rsquo;s a k6 script&lt;/a&gt; that started from the basic script I showed earlier, but has been modified to be more realistic. That link includes a CSV file with login credentials.&lt;/p&gt;
&lt;h2 id="executing-load-tests"&gt;Executing load tests&lt;/h2&gt;
&lt;p&gt;In the course of writing the test script, you probably would have already executed small verification tests, called shakeout tests. It&amp;rsquo;s a good idea to start with these shakeout tests on a new environment to make sure that both your test artifacts (your script and any other data files) and the environment are ready for full testing.&lt;/p&gt;
&lt;h3 id="running-the-test"&gt;Running the test&lt;/h3&gt;
&lt;p&gt;If you&amp;rsquo;ve been following along with the k6 script so far, all you need to do to run a load test is to execute the following command:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;k6 run test.js&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This command will run the k6 script according to the test parameters set within it. The test will be executed locally. This is best used for shakeout tests, or if you prefer to run your load test on your own infrastructure.&lt;/p&gt;
&lt;h3 id="realism-in-test-execution"&gt;Realism in test execution&lt;/h3&gt;
&lt;p&gt;One way can make executing load tests realistic is by matching the location of load generators to the physical location of your users. When you run a load test on machines in your data center, in the same network as your application servers, you will likely see response times that are significantly faster than your users would see. These false positives can look good on the report, but they don&amp;rsquo;t help you measure real user experience.&lt;/p&gt;
&lt;p&gt;Running on the cloud is an easy way to make tests more realistic, especially if most of your end users are external to your organization.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re following along with the k6 script, you can &lt;a href="https://app.k6.io/account/register"&gt;sign up for an account&lt;/a&gt; with k6 Cloud (the first 50 tests are free). Since k6 itself is open source, you can also run it on your own cloud infrastructure, but using k6 Cloud is the most convenient way to get started.&lt;/p&gt;
&lt;p&gt;Once you have an account, &lt;a href="https://app.k6.io/account/api-token"&gt;copy your API token from here&lt;/a&gt;. Then, run this command in your terminal to give your local k6 installation permission to run on your account:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;k6 login cloud --token &amp;lt;YOUR_K6_CLOUD_API_TOKEN&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Once you are successfully authenticated, you can continue to run tests locally using &lt;code&gt;k6 run&lt;/code&gt;, but you now have the option of running on the cloud as well:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;k6 cloud test.js&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;k6 will then begin to execute your load test, and you&amp;rsquo;ll see a screen like this:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/k6-cloud-run-output.png" alt="Running a k6 test on the cloud" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Note that the &lt;code&gt;execution&lt;/code&gt; mode is now &lt;code&gt;cloud&lt;/code&gt;, to remind you where you&amp;rsquo;re running the test.&lt;/p&gt;
&lt;p&gt;By default, your test will run on the k6 AWS account, in the Ashburn region. However, you can override this and specify other regions, including percentages of your virtual user to run on each, using &lt;a href="https://k6.io/docs/cloud/creating-and-running-a-test/cloud-tests-from-the-cli#cloud-execution-options"&gt;cloud execution options&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="analyzing-load-testing-results-and-reporting"&gt;Analyzing load testing results and reporting&lt;/h2&gt;
&lt;p&gt;Although I&amp;rsquo;m listing analysis as a different step in the process from execution, the two often (and should) overlap. The output from k6 in the screenshot above contains a link to the dashboard on k6 Cloud, so that you can see the results of the test in real time, as the test is running. Monitoring the test in real time lets you immediately spot issues as they arise, and, if necessary, stop the test to fix them. If the test is being executed by multiple load generators, having a consolidated dashboard is helpful in giving you an overview of the entire test.&lt;/p&gt;
&lt;p&gt;![An example of the results after a load test in k6 Cloud](/assets/Finished k6 run.png)
&lt;em&gt;An example of the results after a load test in k6 Cloud&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This is also a good time to monitor the health of the application servers and the load generator servers, which you set up monitoring tools for during the planning phase.&lt;/p&gt;
&lt;p&gt;A load test is only useful when it&amp;rsquo;s providing information about the application. If errors occur in large quantities, or if the response time makes it clear that a certain component has failed to handle the load, don&amp;rsquo;t be afraid to stop the test. Your objective is to get the information you need to suggest performance improvements and solutions for any bottlenecks you find.&lt;/p&gt;
&lt;p&gt;Often, you&amp;rsquo;ll run into issues you can&amp;rsquo;t solve or even identify during a test. That&amp;rsquo;s why it&amp;rsquo;s useful to explore the data that you have after a test. k6 lets you create shareable links to dashboards so that you can involve relevant engineering teams who may be able to help you understand what happened and why. &lt;a href="https://app.k6.io/runs/public/f6ad87cec7a24a8c82e46c816e67c4b3"&gt;Here&amp;rsquo;s an example of what that dashboard looks like&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Some projects require formal documentation of test execution by way of a Test Summary Report, but in more agile teams, it may be enough to share the test results dashboard and some supplementary information about what type of tests were run and what problems were encountered.&lt;/p&gt;
&lt;p&gt;The most important part of load testing isn&amp;rsquo;t the execution itself; it&amp;rsquo;s what you do with the results. Communicating results clearly to stakeholders will make it more likely that performance issues are fixed.&lt;/p&gt;
&lt;h2 id="whats-next"&gt;What&amp;rsquo;s next&lt;/h2&gt;
&lt;p&gt;The phases I&amp;rsquo;ve outlined here are a good guide for anyone starting with load testing, but I always recommend that you take what works for your situation and leave the rest. In reality, the phases overlap with each other considerably, especially in more modern engineering cycles.&lt;/p&gt;
&lt;p&gt;Another activity I&amp;rsquo;ve not covered here, but one that I recommend, is adding load testing to your CI/CD pipeline. This continuous testing approach involves &lt;a href="https://k6.io/docs/testing-guides/automated-performance-testing/"&gt;automating load testing&lt;/a&gt; so that it occurs in regularly, in parallel with other development and testing activities. Continuous testing is a great way to get more value out of load testing, and it ensures that performance is front-of-mind for everyone on the application team.&lt;/p&gt;
&lt;p&gt;Happy testing!&lt;/p&gt;</description></item><item><title>Learning how to use k6 live with Nočnica Fee from New Relic (k6 Office Hours)</title><link>https://nicolevanderhoeven.com/blog/20210515-koh-nica/</link><pubDate>Fri, 14 May 2021 21:53:09 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210515-koh-nica/</guid><description>&lt;p&gt;We were happy to welcome &lt;a href="https://www.twitch.tv/serverlessmom"&gt;Nočnica Fee&lt;/a&gt; from &lt;a href="https://www.twitch.tv/new_relic"&gt;New Relic&lt;/a&gt; to k6 Office Hours. She very bravely volunteered to learn how to use k6&amp;ndash; live! Talk about pressure. But she handled it like a champ!&lt;/p&gt;
&lt;p&gt;We also talked about why observability is both particularly important and particularly difficult in serverless architecture. There will definitely be a part two at some point!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/6oMmRiXzvFc?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Analyzing load testing results in k6 Cloud</title><link>https://nicolevanderhoeven.com/blog/20210511-k6-analysis/</link><pubDate>Tue, 11 May 2021 21:53:09 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210511-k6-analysis/</guid><description>&lt;p&gt;Have you ever run a load test but been unable to decipher what it all means? In this video, I break it all down using k6 Cloud.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Eia2l3bY5jU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Performance testing tool feature requests (k6 Office Hours)</title><link>https://nicolevanderhoeven.com/blog/20210507-koh-robin-mark/</link><pubDate>Fri, 07 May 2021 21:53:09 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210507-koh-robin-mark/</guid><description>&lt;p&gt;We managed to get two other folks from k6 to join our Office Hours: our CEO, Robin Gustafsson, and our Head of Customer Success, Mark Meier. We took advantage of the opportunity to discuss wishlist features for k6 and bug Robin about how likely each feature was to see the light of day!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/d8WaMOmwI3Y?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Using the k6 Cloud interface</title><link>https://nicolevanderhoeven.com/blog/20210504-k6-cloud-interface/</link><pubDate>Tue, 04 May 2021 21:53:09 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210504-k6-cloud-interface/</guid><description>&lt;p&gt;I&amp;rsquo;ve gotten the feedback that people would like to see more videos of the basics of using k6 and k6 Cloud, so here&amp;rsquo;s a video on getting situated with the k6 Cloud interface and navigation.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/gwO7k5RTE54?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to get started with chaos engineering (k6 Office Hours)</title><link>https://nicolevanderhoeven.com/blog/20210430-koh-pokemon/</link><pubDate>Fri, 30 Apr 2021 21:53:09 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210430-koh-pokemon/</guid><description>&lt;p&gt;Recently, I&amp;rsquo;ve been learning more about chaos engineering. In this week&amp;rsquo;s k6 Office Hours, I shared my experience as a tester getting started with Kubernetes, chaos engineering with &lt;a href="https://github.com/simskij/xk6-chaos"&gt;xk6-chaos&lt;/a&gt; and k6, and observability with &lt;a href="https://newrelic.com"&gt;New Relic&lt;/a&gt;.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/gVwJZPo30rk?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Shift-left testing and creating a culture of quality with Simon Prior (k6 Office Hours)</title><link>https://nicolevanderhoeven.com/blog/20210423-koh-simonprior/</link><pubDate>Fri, 23 Apr 2021 21:53:09 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210423-koh-simonprior/</guid><description>&lt;p&gt;&lt;a href="https://twitter.com/siprior"&gt;Simon Prior&lt;/a&gt; from the &lt;a href="https://testingpeers.com/"&gt;Testing Peers podcast&lt;/a&gt; joined us on k6 Office Hours to talk to us about how he&amp;rsquo;s managed to foster a culture of quality at his job with EasyJet.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/w4pqfr5cu_4?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>The future of load testing with k6, with k6 CEO Robin Gustafsson (k6 Office Hours)</title><link>https://nicolevanderhoeven.com/blog/20210416-koh-robin/</link><pubDate>Fri, 16 Apr 2021 21:53:09 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210416-koh-robin/</guid><description>&lt;p&gt;This week, &lt;a href="https://simme.dev"&gt;Simme&lt;/a&gt; and I convinced k6 CEO, Robin Gustafsson, to come onto k6 Office Hours to talk about the origins of k6 (spoiler: it began with a company called Gatorhole), things we&amp;rsquo;re working on right now, and what he sees as the future of the company.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/pX6AALeD5SA?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Testing Kubernetes and infrastructure as code with Sid Palas (k6 Office Hours)</title><link>https://nicolevanderhoeven.com/blog/20210409-koh-sid/</link><pubDate>Fri, 09 Apr 2021 21:53:09 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210409-koh-sid/</guid><description>&lt;p&gt;For this week&amp;rsquo;s k6 Office Hours, &lt;a href="https://simme.dev"&gt;Simme&lt;/a&gt; and I had &lt;a href="https://twitter.com/sidpalas"&gt;Sid Palas&lt;/a&gt; from &lt;a href="https://www.youtube.com/channel/UC4MdpjzjPuop_qWNAvR23JA"&gt;DevOps Directive&lt;/a&gt; come on board to talk about what Kubernetes is, how it relates to Infrastructure as Code, and why either of those should matter to testers.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/bYdDRZqRSHA?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Using CircleCI and environment variables with k6 (k6 Office Hours)</title><link>https://nicolevanderhoeven.com/blog/20210326-koh-circleci/</link><pubDate>Fri, 26 Mar 2021 21:53:09 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210326-koh-circleci/</guid><description>&lt;p&gt;&lt;a href="https://simme.dev"&gt;Simme&lt;/a&gt; and I decided to take this week to answer questions on k6 Office Hours, and we ended up talking about &lt;a href="https://circleci.com/"&gt;CircleCI&lt;/a&gt;, environment variables, and how to use them with k6.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/3FyV1j3TRBk?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Performance Testing with k6 and Cypress (Ministry of Testing)</title><link>https://nicolevanderhoeven.com/blog/20210323-performance-testing-with-k6-and-cypress/</link><pubDate>Tue, 23 Mar 2021 19:52:48 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210323-performance-testing-with-k6-and-cypress/</guid><description>&lt;p&gt;My friend &lt;a href="https://mariedrake.com"&gt;Marie Drake&lt;/a&gt; and I teamed up to give a presentation about performance testing at a &lt;a href="https://www.meetup.com/Ministry-of-Testing-Manila/events/276622895/"&gt;Ministry of Testing (Philippines) meetup&lt;/a&gt;, and we talked about using &lt;a href="https://cypress.io"&gt;Cypress&lt;/a&gt; for front-end performance testing and &lt;a href="https://k6.io"&gt;k6&lt;/a&gt; for back-end performance testing.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/yPmbZl2Qtus?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Performance testing vs. load testing with Señor Performo and Pepe Cano (k6 Office Hours)</title><link>https://nicolevanderhoeven.com/blog/20210319-koh-sr-perf/</link><pubDate>Fri, 19 Mar 2021 21:53:09 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210319-koh-sr-perf/</guid><description>&lt;p&gt;What&amp;rsquo;s the difference between performance testing vs. load testing? This week, Simme and I were joined by &lt;a href="https://www.srperf.com/"&gt;Señor Performo&lt;/a&gt;, aka Leandro Melendez, and Pepe Cano, the Head of Marketing at k6, to talk about this common question.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/ZR8zgIs3he4?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Load Tests as Code: An introduction to k6</title><link>https://nicolevanderhoeven.com/blog/20210318-load-tests-as-code/</link><pubDate>Thu, 18 Mar 2021 20:36:41 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210318-load-tests-as-code/</guid><description>&lt;p&gt;Today, I attended the &lt;a href="https://www.cambridge.org/"&gt;Cambridge University Press&lt;/a&gt; QA Week 2021 to talk about load testing with k6. Here&amp;rsquo;s a recording of the presentation.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/kz3Mt97L9CY?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;And &lt;a href="https://slides.nicolevanderhoeven.com/2021-load-tests-as-code/"&gt;here are the slides&lt;/a&gt; I used!&lt;/p&gt;
&lt;p&gt;I had fun discussing the advantages of the load test as code approach and why k6 is a great way to implement it.&lt;/p&gt;</description></item><item><title>Testing Our Performance Test Tools</title><link>https://nicolevanderhoeven.com/blog/20210316-testing-our-performance-test-tools/</link><pubDate>Tue, 16 Mar 2021 21:29:33 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210316-testing-our-performance-test-tools/</guid><description>&lt;p&gt;On this episode of the &lt;a href="https://testguild.com/"&gt;TestGuild performance podcast&lt;/a&gt;, I had a chat with Joe Colantonio about languages, board games, nontraditional backgrounds in tech, and why we should all test our performance test tools.&lt;/p&gt;
&lt;iframe style="border: none" src="//html5-player.libsyn.com/embed/episode/id/18351014/height/90/theme/custom/thumbnail/yes/direction/forward/render-playlist/no/custom-color/000000/" height="90" width="100%" scrolling="no" allowfullscreen webkitallowfullscreen mozallowfullscreen oallowfullscreen msallowfullscreen&gt;&lt;/iframe&gt;</description></item><item><title>k6 Office Hours 05: Observability with Daniel González Lopes</title><link>https://nicolevanderhoeven.com/blog/20210312-k6-office-hours05/</link><pubDate>Fri, 12 Mar 2021 21:53:09 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210312-k6-office-hours05/</guid><description>&lt;p&gt;Our first repeat guest, Daniel González Lopes, also from &lt;a href="https://k6.io"&gt;k6&lt;/a&gt;, joined us today to talk about how to use observability in conjunction with load testing. We talked about the differences between metrics, logs, and traces, and how to implemented distributed tracing.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/ADkd18AdaEA?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>k6 Office Hours 04: Using Cypress with Marie Drake</title><link>https://nicolevanderhoeven.com/blog/20210305-k6-office-hours04/</link><pubDate>Fri, 05 Mar 2021 21:46:56 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210305-k6-office-hours04/</guid><description>&lt;p&gt;&lt;a href="https://mariedrake.com"&gt;Marie Drake&lt;/a&gt; joined us today on k6 Office Hours to talk about front-end performance testing using a test tool called &lt;a href="https://cypress.io"&gt;Cypress&lt;/a&gt; and how it can compliment a back-end performance testing strategy.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/ve7Rg0MUZ0g?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>k6 Office Hours 03: Chaos Engineering with Daniel González Lopes</title><link>https://nicolevanderhoeven.com/blog/20210226-k6-office-hours03/</link><pubDate>Fri, 26 Feb 2021 21:40:25 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210226-k6-office-hours03/</guid><description>&lt;p&gt;In this week&amp;rsquo;s Office Hours, &lt;a href="https://simme.dev"&gt;Simme&lt;/a&gt; and I invited Daniel González Lopes, a DevOps engineer from &lt;a href="https://k6.io"&gt;k6&lt;/a&gt;, to join us to talk about chaos engineering and what it has to do with load testing. Simme also demonstrated how to use k6 to run simple chaos experiments.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/WrDV8iIdCy8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>k6 Office Hours 02: Observability with New Relic</title><link>https://nicolevanderhoeven.com/blog/20210219-office-hours-02/</link><pubDate>Fri, 19 Feb 2021 23:24:58 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210219-office-hours-02/</guid><description>&lt;p&gt;For this week&amp;rsquo;s Office Hours, &lt;a href="https://simme.dev"&gt;Simme&lt;/a&gt; and I invited &lt;a href="https://twitter.com/gspncr"&gt;Gary Spencer&lt;/a&gt; from &lt;a href="https://newrelic.com"&gt;New Relic&lt;/a&gt; to talk to us about why he&amp;rsquo;s recently started using k6, and why an observability platform like New Relic is the perfect companion for performance testing and observability.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/TbRVFTXGUPU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>The 503 Podcast</title><link>https://nicolevanderhoeven.com/blog/20210211-503-podcast/</link><pubDate>Thu, 11 Feb 2021 21:46:35 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210211-503-podcast/</guid><description>&lt;p&gt;This must be the month for trying new things, because I jumped into livestreaming with the first ever &lt;a href="https://nicolevanderhoeven.com/blog/20210205-k6-office-hours"&gt;k6 Office Hours&lt;/a&gt; just a week ago, and this week I&amp;rsquo;m jumping into podcasting with &lt;a href="https://simme.dev"&gt;Simme Aronsson&lt;/a&gt;, who&amp;rsquo;s also doing the Office Hours with me. There&amp;rsquo;s definitely safety (at least psychological safety) in numbers, because doing it with someone else makes me feel a little more brave.&lt;/p&gt;
&lt;p&gt;While the podcast is presented by &lt;a href="https://k6.io"&gt;k6&lt;/a&gt;, that&amp;rsquo;s really just a fancy term for saying that we&amp;rsquo;re both employed by k6 and we&amp;rsquo;re recording and producing the podcast on company time. Unlike the Office Hours, which is heavily k6-focused, the podcast will be about software performance and reliability in general. Simme and I happen to have different and complementary skillsets (he comes from a developer background, and I come from a testing background, and I think that makes for an interesting combination of perspectives.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the first episode! It should also be available on your audio podcasting tool of choice.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/JEpLfLWP4YY?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>The first ever k6 Office Hours</title><link>https://nicolevanderhoeven.com/blog/20210205-k6-office-hours/</link><pubDate>Fri, 05 Feb 2021 21:47:16 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210205-k6-office-hours/</guid><description>&lt;p&gt;The k6 virtual office is open!&lt;/p&gt;
&lt;p&gt;The first time I heard about office hours was from &lt;a href="https://www.notion.so/"&gt;Notion&lt;/a&gt;. Recently, &lt;a href="https://obsidian.md"&gt;Obsidian&lt;/a&gt; went in on this trend as well. The concept involves opening your virtual doors regularly to your community, to answer questions and share best practices.&lt;/p&gt;
&lt;p&gt;A big part of being a Developer Advocate is talking &lt;em&gt;to&lt;/em&gt; people, and even conferences these days are mostly pre-recorded. I kind of miss being able to interact &lt;em&gt;with&lt;/em&gt; people. I miss the immediacy of &lt;em&gt;live&lt;/em&gt;. So I talked &lt;a href="https://simme.dev"&gt;Simme Aronsson&lt;/a&gt; into doing a k6 Office Hours with me.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re both new to livestreaming, so there&amp;rsquo;s a lot that we&amp;rsquo;ve learned and will be improving in future videos, but here&amp;rsquo;s our first attempt!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/bZsWn5ckzVM?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Week of Testing Wrap-up: My thoughts on k6 as a load testing tool</title><link>https://nicolevanderhoeven.com/blog/20201217-week-of-testing-07/</link><pubDate>Thu, 17 Dec 2020 15:29:57 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20201217-week-of-testing-07/</guid><description>&lt;p&gt;I decided to make a final wrap-up video for my &amp;ldquo;Week of Testing&amp;rdquo; with k6&amp;hellip; ok, so it&amp;rsquo;s actually three weeks later now, but I wanted to explore k6 a little bit more before I gave my opinion on it.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/zVjLBp543E4?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;And here&amp;rsquo;s the audio version:&lt;/p&gt;
&lt;iframe src="https://open.spotify.com/embed-podcast/episode/0YgYqrPpEzEMSZIloeiQtC" width="100%" height="232" frameborder="0" allowtransparency="true" allow="encrypted-media"&gt;&lt;/iframe&gt;
&lt;p&gt;Thank you, k6, for being awesome enough to agree to this video series before knowing what I&amp;rsquo;d say. Gotta love a company that welcomes transparency and feedback.&lt;/p&gt;</description></item><item><title>Cuándo JMeter no alcanza: Pruebas de carga simulando navegadores</title><link>https://nicolevanderhoeven.com/blog/20201216-cuando-jmeter-no-alcanza/</link><pubDate>Wed, 16 Dec 2020 18:18:23 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20201216-cuando-jmeter-no-alcanza/</guid><description>&lt;p&gt;Aquí está el video de mi presentación en JMeter Scripting Day, un evento organizado por &lt;a href="https://jmeterenespanol.org/"&gt;JMeter en Español&lt;/a&gt; el 31 de Oktubre, 2020.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/1KB8e2Ld08M?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Y la versión audio:&lt;/p&gt;
&lt;iframe src="https://open.spotify.com/embed-podcast/episode/1f17kzrbYmOxk8e65JBTQH" width="100%" height="232" frameborder="0" allowtransparency="true" allow="encrypted-media"&gt;&lt;/iframe&gt;
&lt;h2 id="introducción"&gt;Introducción&lt;/h2&gt;
&lt;p&gt;Hola a todos! Yo soy Nicole van der Hoeven, y soy performance tester. JMeter es una de mis herramientas favoritas porque es gratis, simple, y por muchos casos hace exactamente lo que quiero y no más. Sin embargo, como performers es parte de nuestro trabajo elegir la herramienta adecuada para cada proyecto, y hay que admitir que hay situaciones en que JMeter simplemente no es suficiente.&lt;/p&gt;
&lt;h2 id="amazon---ui--dev-tools"&gt;Amazon - UI + Dev Tools&lt;/h2&gt;
&lt;p&gt;Esto es el sitio web de Amazon.com. Tengo abierta la pantalla de Chrome Developer Tools, que me muestra las solicitudes (o requests) que componen la página. Cuándo vamos a la página, el navegador (Chrome en este caso) envia estas solicitudes para nosotros, pero eso occure en el fondo. Un usuario normal no las ve.&lt;/p&gt;
&lt;h2 id="jmeter---creando-un-script"&gt;JMeter - Creando un script&lt;/h2&gt;
&lt;p&gt;Lo que JMeter hace es grabar estas solicitudes y replicarlas. Aqui vemos una ejecución de un usuario virtual de un script en JMeter. Cada solicitud tiene la respuesta y el tiempo de respuesta. Pero eso no nos da una idea completa del rendimiento de la aplicación. ¿Por qué?&lt;/p&gt;
&lt;p&gt;Por que JMeter, como otras herramientas de nivel protocolo, tiene unas limitaciónes. La primera es que si hay javascript o otros script que deben estar ejecutado por el navegador, JMeter no los ejecuta. JMeter solo los descarga. El tiempo de respuesta mide la descarga, no la duración de la ejecución. Entonces, siempre habrá una diferencia entre los tiempos de respuesta en una prueba de JMeter y los tiempos de respuesta en práctica.&lt;/p&gt;
&lt;p&gt;A veces esta diferencia no es tan importante. Pero hay más y más aplicaciones hoy en día que se componen principalmente de estos javascript. Por esas aplicaciones, simplemente no es posible hacer un script en JMeter porque la mayoría de la lógica de la aplicación occure en el navegador, no en el servidor.&lt;/p&gt;
&lt;h2 id="flood-challenge"&gt;Flood Challenge&lt;/h2&gt;
&lt;p&gt;La segunda razón es que el aumento de la seguridad de aplicaciones conduce a solicitudes más complejas que incluyen parámetros dinámicos. Estos parámetros hacen que sea más difícil para un intermediario lanzar un ataque, pero también hacen que sea más difícil para nosotros scripters, porque tenemos que extraer información desde la última respuesta y ponerla en la próxima solicitud. Es posible, pero es la pesadilla de cada performance tester.&lt;/p&gt;
&lt;p&gt;Podemos verlo en la aplicación de muestra &lt;a href="https://challenge.flood.io"&gt;Flood Challenge&lt;/a&gt;. Ya no trabajo para Flood, pero todavía es un buen ejemplo.&lt;/p&gt;
&lt;h2 id="correlación-en-jmeter---flood-challenge-script"&gt;Correlación en JMeter - Flood challenge script&lt;/h2&gt;
&lt;p&gt;Esto es mi script en JMeter, y vemos que hay muchos parámetros que he tenido que correlacionar. La solicitud para simular hacer clic en el botón &amp;ldquo;Start&amp;rdquo; necesita los parámetros authenticity token, step ID, y step number, que son dinámicos. El contenido de los parámetros cambian cada vez que usamos esta aplicación.&lt;/p&gt;
&lt;h2 id="la-experiencia-del-usuario"&gt;La experiencia del usuario&lt;/h2&gt;
&lt;p&gt;La tercera razón es que JMeter tampoco mide la verdadera experiencia del usuario. Solo mide la duración de la comunicación entre el navegador y el servidor, pero no mide cosas como la representación de elementos en la página web, ni el efecto de un script que dura mucho tiempo para terminar.&lt;/p&gt;
&lt;p&gt;Eso es importante porque estas cosas afectan significativamente la experiencia del usuario. De hecho, Steve Souders, un conocido el la industría de performance, dice que &lt;a href="https://rigor.com/blog/80-90-of-load-times-are-spent-on-the-front-end-start-there/#:~:text=Start%20there.,-Written%20by%20Craig&amp;amp;text=Last%20month%2C%20Steve%20Souders%2C%20Google's,is%20spent%20on%20the%20frontend"&gt;hasta 90% del tiempo de respuesta&lt;/a&gt; que experimenta el usuario está en la interfaz. Con este numero podemos estar ciertos que una prueba con una herramienta de nivel protocolo no va a poder encapsular el rendimiento final de una aplicación.&lt;/p&gt;
&lt;h2 id="developer-tools---lighthouse"&gt;Developer Tools - Lighthouse&lt;/h2&gt;
&lt;p&gt;Entonces, ¿qué podemos hacer?&lt;/p&gt;
&lt;p&gt;Lo más fácil es intentar de medir la interfaz durante una prueba de cargas. Mientras ejecutamos una prueba con JMeter, podemos ir manualmente a la aplicación web en Chrome para usar Developer Tools. Podemos usar la pestaña Lighthouse, que nos da más métricos del perspectivo del usuario y sugerencias para mejorar el rendimiento.&lt;/p&gt;
&lt;h2 id="webpagetest"&gt;WebPageTest&lt;/h2&gt;
&lt;p&gt;También uso &lt;a href="https://webpagetest.org"&gt;WebPageTest&lt;/a&gt; a veces. Eso tiene más opciones para ejecutar la prueba automáticamente varias veces desde un lugar que puedo elegir. Aún podemos elegir un dispositivo para simular la experiencia de un usuario en un iPad, por ejemplo.&lt;/p&gt;
&lt;h2 id="herramientas-alternativas-para-pruebas-de-carga"&gt;Herramientas alternativas para pruebas de carga&lt;/h2&gt;
&lt;p&gt;Tambien podemos elegir herramientas alternativas para ejecutar nuestras pruebas de carga. Lo que tienen en común es que fueron diseñadas para pruebas de automatización, y utilizan un navegador real.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.selenium.dev/"&gt;Selenium&lt;/a&gt; es probablemente la más popular de esas. Selenium WebDriver en particular. Es compatible con Ruby, Java, Python, C# y Javascript. El problema con Selenium es que puede ser muy pesada. En una machina probablamente podemos ejecutar cinco usuarios de Selenium, más o menos. Eso es importante si estamos tratando de simular miles de usuarios.&lt;/p&gt;
&lt;p&gt;Hay muchas herramientas basadas en Javascript que también podemos usar. Hay varias framework que se utilizan para adaptar Javascript y nodeJS.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Puppeteer fue desarollado por Google. Tricentis Flood también ha diseñado Element que utiliza Puppeteer, pero con un enfoque en el rendimiento.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/microsoft/playwright"&gt;Playwright&lt;/a&gt; es una creación de Microsoft.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://jest.io"&gt;Jest&lt;/a&gt; fue desarrollado por Facebook&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mocha es otro framework que es la base para &lt;a href="https://cypress.io"&gt;Cypress&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Todos esas herramientas son open source y gratis. También hay alternativas propietarias, pero prefiero las soluciones open source porque en la mayoría de casos hacen la misma cosa y se actualizan con más frecuencia.&lt;/p&gt;
&lt;h2 id="element-script"&gt;Element script&lt;/h2&gt;
&lt;p&gt;Esto es un ejemplo de la misma acción, hacer clic en el botón Start en la aplicación Flood Challenge.&lt;/p&gt;
&lt;p&gt;Otra ventaja de simulando navegadores en vez de simulando las solicitudes es que es más simple crear un script. No tenemos que saber cada parámetro. Solo tenemos que describir lo que queremos que cada usuario virtual haga.&lt;/p&gt;
&lt;p&gt;Podemos ejecutar scripts usando estas herramientas al mismo tiempo que un script de &lt;a href="https://jmeter.apache.org"&gt;JMeter&lt;/a&gt; o &lt;a href="https://gatling.io"&gt;Gatling&lt;/a&gt; o lo que sea, y también tenemos la opción de reemplazar los script de protocolo con estas.&lt;/p&gt;
&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Para resumir, JMeter y otras herramientas de nivel protocolo tiene algunas limitaciones.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;No ejecutan scripts del lado del navegador&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pueden ser más complicado correlacionar parámetros dinámicos&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No miden la experiencia final de un usuario&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Para solucionar estos problemas, podemos complementar pruebas de carga tradicionales, de nivel protocolo, como JMeter, con herramientas simulando navegadores. De este modo podremos tener una comprensión más completa del rendimiento total de la aplicación.&lt;/p&gt;
&lt;p&gt;Bueno, se acabó el tiempo, entonces los dejo aquí. Gracias por escuchar, y me disculpo por mi español. Gracias a todos!&lt;/p&gt;</description></item><item><title>Week of Testing: Day 5 - The thing about learning in public</title><link>https://nicolevanderhoeven.com/blog/20201128-week-of-testing-5/</link><pubDate>Sat, 28 Nov 2020 20:03:04 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20201128-week-of-testing-5/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/quoOYnweKw?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Yesterday I mentioned that I&amp;rsquo;d used the &lt;code&gt;constant-vus&lt;/code&gt; executor to recreate the stepped load profile. Well, the thing about learning publicly is that it also means making mistakes publicly!&lt;/p&gt;
&lt;p&gt;I was kindly informed by a few of my new colleagues that &lt;code&gt;constant-vus&lt;/code&gt; was not the most optimal way to recreate the stepped load profile. &lt;a href="https://simme.dev"&gt;Simme&lt;/a&gt; wrote up a little function so I wouldn&amp;rsquo;t have to repeat myself so much, and &lt;a href="https://twitter.com/ppcano_"&gt;Pepe Cano&lt;/a&gt; and Pawel Suwala (the CTO of k6 himself) both told me nicely that using &lt;a href="https://k6.io/docs/getting-started/running-k6#stages-ramping-up-down-vus"&gt;stages&lt;/a&gt; would have been the better solution.&lt;/p&gt;
&lt;p&gt;So, let&amp;rsquo;s chalk that up to a TIL (Today I Learned) and record that snippet here for prosperity (found in the k6 documentation linked above):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;http&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;k6/http&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;check&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;sleep&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;k6&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;options&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;stages&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { &lt;span style="color:#a6e22e"&gt;duration&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;30s&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;target&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { &lt;span style="color:#a6e22e"&gt;duration&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;1m30s&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;target&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { &lt;span style="color:#a6e22e"&gt;duration&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;20s&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;target&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;default&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; () {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;http&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;https://httpbin.org/&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;check&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;, { &lt;span style="color:#e6db74"&gt;&amp;#39;status was 200&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;r&lt;/span&gt;) =&amp;gt; &lt;span style="color:#a6e22e"&gt;r&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;status&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;200&lt;/span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;sleep&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Week of Testing: Day 4 - Load profiles on k6</title><link>https://nicolevanderhoeven.com/blog/20201127-week-of-testing-4/</link><pubDate>Fri, 27 Nov 2020 19:54:06 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20201127-week-of-testing-4/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/jDmMmc75RRM?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;k6 has a cool feature where even if you start a load test locally via the CLI, you can still stream the results to k6 Cloud. It&amp;rsquo;s an interesting compromise between debugging a test locally (and therefore not paying for cloud infrastructure) and sharing results for load tests run on the cloud. It worked seamlessly, too.&lt;/p&gt;
&lt;p&gt;I also wanted to see how to recreate a specific load profile that I commonly use - the stepped load profile. In JMeter, I typically do this with a plugin - the jp@gc Ultimate Thread Group is my thread group of choice. So, I created it in JMeter (I love that it shows a little image of it as well, while you&amp;rsquo;re building it) and then attempted to recreate it in k6.&lt;/p&gt;
&lt;p&gt;I definitely had to look at the k6 documentation for this. I used the &lt;code&gt;constant-vus&lt;/code&gt; executor for this, but k6 has &lt;a href="https://k6.io/docs/using-k6/scenarios#executors"&gt;several other executors&lt;/a&gt; to choose from, and it worked as well as I had hoped.&lt;/p&gt;
&lt;p&gt;So far, my experience with k6 has been positive. Things are well-documented, and they just work out of the box. No plugins necessary.&lt;/p&gt;</description></item><item><title>Week of Testing: Day 3 - Running a load test locally using k6</title><link>https://nicolevanderhoeven.com/blog/20201126-week-of-testing-3/</link><pubDate>Thu, 26 Nov 2020 19:31:33 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20201126-week-of-testing-3/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/y5tteMKZUqk?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;I&amp;rsquo;ve had my fun playing around with k6 Cloud, the SaaS component. For Day 3, I thought it was time to jump into the heart of k6: k6 the &lt;a href="https://github.com/loadimpact/k6"&gt;open source load testing tool&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;First impressions: logging was a little sparser than I expect, coming from having used load testing tools that just do this for me automatically. I think one of the first things I&amp;rsquo;ll do with k6 is to create my own little &amp;ldquo;load testing starting script&amp;rdquo; that I&amp;rsquo;ll always use, with all of the appropriate logging already set up.&lt;/p&gt;
&lt;p&gt;Otherwise, I was really impressed with how quickly it installed. If you scrub over to the timestamp &lt;a href="https://www.youtube.com/watch?v=y5tteMKZUqk&amp;amp;ab_channel=k6&amp;amp;ts=106"&gt;1:46&lt;/a&gt; in the video, you&amp;rsquo;ll hear that I was actually expecting to have to speed up the installation process while editing to save time, but the installation actually finished before I could say that I was going to do so. By my count that was 7 seconds between hitting enter in my terminal and the download finishing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;7 seconds&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I can&amp;rsquo;t help but compare that to &lt;a href="https://jmeter.apache.org/"&gt;JMeter&lt;/a&gt;. JMeter is honestly probably my go-to load testing right now&amp;ndash; it&amp;rsquo;s not good for absolutely everything, but it&amp;rsquo;s the tool that I reach for when I &amp;ldquo;just want to test this one thing&amp;rdquo;. I&amp;rsquo;ve used it for years, and it&amp;rsquo;s the tool that I know the most. But one of the issues with JMeter is that there&amp;rsquo;s so much to do before it&amp;rsquo;s actually usable.&lt;/p&gt;
&lt;p&gt;Before you even open JMeter, you need to install Java, and when I first started in load testing, I spent a long time wrestling with getting setting the Java environment variable in Windows before my computer would even recognize that Java was installed. Then you need to install JMeter&amp;ndash; but any JMeter tester will tell you that there are some plugins that you just can&amp;rsquo;t do without, and that really you should always install. That&amp;rsquo;s why there are so many &amp;ldquo;best plugins in JMeter&amp;rdquo; lists (&lt;a href="https://nicolevanderhoeven.com/blog/20200414-aaf11"&gt;here&amp;rsquo;s my top 3&lt;/a&gt;)&amp;hellip; because most of them are necessary, but you wouldn&amp;rsquo;t know that if you&amp;rsquo;re new to JMeter.&lt;/p&gt;
&lt;p&gt;The fact that k6 starts up in 7 seconds is&amp;hellip; shockingly good.&lt;/p&gt;</description></item><item><title>Week of Testing: Day 2 - Comparing tests against a baseline</title><link>https://nicolevanderhoeven.com/blog/20201125-week-of-testing-2/</link><pubDate>Wed, 25 Nov 2020 19:21:53 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20201125-week-of-testing-2/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/dcahi7-9pRs?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Day 2 of my Week of Testing!&lt;/p&gt;
&lt;p&gt;Yesterday I ran my first load test on k6, and actually set up the thresholds wrong. I still maintain that there are some UI improvements that could still be made in that area, and that feedback was well-received. Apparently I&amp;rsquo;m not the only one who has made the same mistake.&lt;/p&gt;
&lt;p&gt;Today I learned that on k6, you can actually set one test to be a baseline. There&amp;rsquo;s so much I want to say on this topic - that&amp;rsquo;s probably a whole blog post there - but for now, suffice it to say that having a baseline test to compare succeeding tests to is a key to a successful round of load testing. I was happy to see that k6 thinks so too, because that functionality is built into the UI by default.&lt;/p&gt;
&lt;p&gt;I also think that being able to schedule a test regularly is fantastic for practicing Continuous Testing. Of course, teams already using CI/CD pipelines would probably get the most benefit out of running load tests using the command line rather than through the UI, but it&amp;rsquo;s nice to know that scheduling is an option in the UI as well.&lt;/p&gt;</description></item><item><title>Week of Testing: Day 1 - Running a load test on k6</title><link>https://nicolevanderhoeven.com/blog/20201124-week-of-testing-1/</link><pubDate>Tue, 24 Nov 2020 19:13:03 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20201124-week-of-testing-1/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/6qXJUS6yMDc?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;On my first real day of testing with &lt;a href="https://k6.io"&gt;k6.io&lt;/a&gt;, I wanted to jump right in and figure out how to run a load test on k6 Cloud. k6 has documentation on this, but I didn&amp;rsquo;t use it for this test, since the point of a week of testing is to record how easy the product is to use.&lt;/p&gt;
&lt;p&gt;My verdict: I&amp;rsquo;m pleasantly surprised with how easily everything went. Is it just me, or was that AWS startup time exceptionally fast? I&amp;rsquo;m used to AWS taking at least a couple of minutes to provision a machine, but this seemed to start up almost instantaneously.&lt;/p&gt;</description></item><item><title>Week of Testing: Intro</title><link>https://nicolevanderhoeven.com/blog/20201123-week-of-testing-intro/</link><pubDate>Mon, 23 Nov 2020 20:45:31 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20201123-week-of-testing-intro/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/zcYeboT5FYE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Today was my first day at &lt;a href="https://k6.io"&gt;k6.io&lt;/a&gt;! I&amp;rsquo;m happy to announce that I&amp;rsquo;ve joined as their newest Developer Advocate for Performance Testing. k6 is a company I&amp;rsquo;ve had my eye on for a while, even (or maybe especially) when I was working for a competitor, &lt;a href="https://flood.io"&gt;Tricentis Flood&lt;/a&gt;. I always admired k6&amp;rsquo;s stance on open source, their involvement with the developer community, and the slick web app that brings load testing into the hands of many developers and testers.&lt;/p&gt;
&lt;p&gt;As a load tester, I try to be tool-agnostic. I have to admit, though, that I do have a strong bias towards opensource tools. I joined Flood because of their focus on tools I already loved like &lt;a href="http://jmeter.apache.org/download_jmeter.cgi"&gt;JMeter&lt;/a&gt;, &lt;a href="https://gatling.io/"&gt;Gatling&lt;/a&gt;, and &lt;a href="https://element.flood.io"&gt;Element&lt;/a&gt; (based on Puppeteer). (And Selenium, but it&amp;rsquo;s a stretch to say I love Selenium.) But these are tools I&amp;rsquo;ve used for years, most of them from even before I joined Flood. What kind of load tester would I be if I could only really talk about scripting in a handful of tools?&lt;/p&gt;
&lt;p&gt;So I thought it was time for a change, and k6 was the first and only company on my list for a couple reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/loadimpact/k6"&gt;The free and open source tool k6&lt;/a&gt;, which recently crossed over to 10,000 stars on Github, is often touted as the developer&amp;rsquo;s load testing tool of choice.&lt;/li&gt;
&lt;li&gt;k6&amp;rsquo;s &lt;a href="https://k6.io/cloud"&gt;cloud offering&lt;/a&gt; integrates seamlessly with the OSS tool, and it adds some killer features like performance insights that add real value to teams wanting to scale their load tests.&lt;/li&gt;
&lt;li&gt;The k6 team is incredibly responsive to the needs of their community. Unlike most companies, where only marketing, sales, and customer support people talk to customers, k6 developers are active on GitHub, social media, and other blog sites. Everyone is passionate about what they&amp;rsquo;re building.&lt;/li&gt;
&lt;li&gt;Roles in testing are changing, and the lines between tester and developer are blurring. Developers who don&amp;rsquo;t test are going to become just as obsolete as testers who don&amp;rsquo;t develop. I see k6&amp;rsquo;s popularity among the developer crowd as a good opportunity for me to sharpen my coding skills.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So I had to see for myself whether k6 was actually as good as it seemed.&lt;/p&gt;
&lt;p&gt;Luckily, it turns out that k6 has a tradition of a &amp;ldquo;Week of Testing&amp;rdquo;, where every new member of the k6 team, regardless of role, spends their first week putting the product through its paces. Every part of the whole k6 solution (Cloud and OSS tool) is fair game, and the goal of the Week of Testing is to present feedback to the team at the end of it, while the new member&amp;rsquo;s eyes are fresh. When they told me about it, they said &amp;ldquo;We want to see you learn the tool on your own to see what parts are difficult to figure out.&amp;rdquo; To which I responded, &amp;ldquo;Challenge accepted!&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I decided to not only give a presentation at the end, but also to video the process for posterity&amp;rsquo;s sake&amp;hellip; and, let&amp;rsquo;s face it, to impress my new managers and coworkers with my dazzling work ethic.&lt;/p&gt;
&lt;p&gt;Step 1: Get the company&amp;rsquo;s name right.&lt;/p&gt;
&lt;p&gt;In the first video, I share the differences between k6 vs. k6 Cloud vs. Load Impact!&lt;/p&gt;</description></item><item><title>How to Become a Load Tester</title><link>https://nicolevanderhoeven.com/blog/20201007-how-to-become-a-load-tester/</link><pubDate>Wed, 07 Oct 2020 14:15:45 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20201007-how-to-become-a-load-tester/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/how-to-become-a-load-tester"&gt;
&lt;p&gt;&lt;em&gt;&lt;a href="https://www.flood.io/blog/how-to-become-a-load-tester"&gt;Originally posted here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Load testing can be a pretty intimidating field to get into, but it&amp;rsquo;s easy to get started. Here are some concrete steps you can take to start learning how to load test from scratch.&lt;/p&gt;
&lt;p&gt;In this video, Flood co-founder Tim Koopmans and I teamed up at Tricentis User Conference 2020 to talk about the essential ingredients for load testing.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/_R2dmEmtO48?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="background-required-for-load-testing"&gt;Background required for load testing&lt;/h2&gt;
&lt;p&gt;Load testing can be quite technical. It involves not just the ability to use different programming languages to create load testing scripts but also familiarity with software engineering practices, DevOps, application infrastructure, site reliability, and networking. A good load tester needs to be able to understand the basics of how an application works and how different components interact with each other. It&amp;rsquo;s common for a load tester to work on applications employing a variety of technologies, so staying up to date with recent technological trends and switching seamlessly from one language to another, or from one platform to another, is of utmost importantance. This technical side of load testing might make you think that a load tester needs to have formal studies in computer science and several years of experience in software testing. The reality is that there are many load testers who stumbled into the field from wildly unexpected backgrounds. So you might think load testing looks like this:&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/how-to-become-a-load-tester01.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Photo by &lt;a href="https://unsplash.com/@wocintechchat?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Christina @ wocintechchat.com&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/meeting?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;And sometimes it does. But it more often looks something like this:&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/how-to-become-a-load-tester02.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Photo by &lt;a href="https://unsplash.com/@youxventures?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;You X Ventures&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/meeting?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;You see, load testing is an interdisciplinary field. So much of the job involves talking to people. Sometimes the requirements for a project are not clear, and someone needs to talk to the both the business and the developers to make sure that nonfunctional requirements are clarified. A load tester is a detective, tracing a request as it goes from one application component to another, coordinating with different application teams. A load tester is a scientist, using the scientific method to design experiments that yield the results. A load tester is a statistician, making sense of a jumble of data and seeking correlations between variables. A load tester is a public speaker. Even when the actual load testing has been completed and the report has been sent, a load tester makes sure all stakeholders understand the report so that the results can be used to make meaningful changes to improve application performance. All these tasks require a mishmash of skills and competencies that can be difficult to find in just the field of computer science.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s take our backgrounds as anecdotal examples.&lt;/p&gt;
&lt;p&gt;Tim grew up and currently lives in a small country town in Australia, and he joined the military straight after school. He later developed a love of automating things, which led him first to use tools like perl to scrape websites and try to win bids with early versions of ebay, and then later to starting a performance engineering consulting career and co-founding Flood itself.&lt;/p&gt;
&lt;p&gt;I, Nicole, grew up in Metro Manila in the Philippines (which has 14,000 more people per km2 than Mumbai does). I learned English as a foreign language in school, and I have a university degree in Economics. When I discovered load testing, I had a job in a completely different field– I was working for an airline and making sure engine components were properly maintained and repaired. My love for gadgets and technology took me down an 8-year rabbit hole involving doing performance consulting for clients across a variety of industries in Australia and the Netherlands. At Flood, I help customers around the world improve their application performance.&lt;/p&gt;
&lt;p&gt;As you can see, Tim and I came from very different backgrounds and different parts of the world. Neither of us knew what load testing even was when we started working. Neither of us got formal instruction in load testing. But somehow, we still both ended up becoming load testers at Flood.&lt;/p&gt;
&lt;h2 id="reasons-to-become-a-load-tester"&gt;Reasons to become a load tester&lt;/h2&gt;
&lt;p&gt;So why become a load tester? Here are some practical reasons.&lt;/p&gt;
&lt;h3 id="load-testing-is-cool"&gt;Load testing is cool&lt;/h3&gt;
&lt;p&gt;A little-known fact about load testing is that it can be really satisfying to be involved in big-name projects that end up going live.&lt;/p&gt;
&lt;p&gt;You may have heard of Flood. But even if you haven’t, we’re sure you&amp;rsquo;re familiar with the results of load testing done on Flood. In the last few years, we have been helping Hotstar, one of the largest streaming services in the world, load test their systems in preparation for the Indian Premier League.&lt;/p&gt;
&lt;p&gt;Hotstar uses an open-source tool that we support, Gatling, to create scripts to simulate users tuning in to watch cricket games. Then, they use Flood to create a “Game Day” simulation. They scale up those load tests and run 5 million users on thousands of machines in the cloud. We help them coordinate execution, spot problems quickly with real-time results from all those machines while the test is still running, and identify bottlenecks so that they don’t occur in production, when India’s playing.&lt;/p&gt;
&lt;p&gt;As a load tester, you&amp;rsquo;ll definitely be working with brands you recognize and love.&lt;/p&gt;
&lt;h3 id="load-testing-can-pay-well"&gt;Load testing can pay well&lt;/h3&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/how-to-become-a-load-tester03.png" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Source: &lt;a href="https://www.payscale.com/research/IN/Job=Software_Tester/Salary"&gt;Payscale&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/how-to-become-a-load-tester04.png" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Source: &lt;a href="https://www.payscale.com/research/IN/Job=Performance_Engineer/Salary"&gt;Payscale&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I said this would be a practical list, right?&lt;/p&gt;
&lt;p&gt;Here are 261,768 practical reasons. The average performance engineer’s salary is 71% more than that of an average software tester in India, according to Payscale.com. We all know that money isn’t everything, but this is a clear signal from the market about the importance of performance-related skills. Adding load testing to your CV as a tester makes you more attractive to employers. It’s a great way to differentiate yourself in an over-saturated market.&lt;/p&gt;
&lt;h3 id="load-testing-can-literally-take-you-places"&gt;Load testing can literally take you places&lt;/h3&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/how-to-become-a-load-tester05.png" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Source: &lt;a href="https://twitter.com/shamim_j"&gt;Shamim&lt;/a&gt; from &lt;a href="https://www.flood.io/blog/inside-the-career-of-a-digital-nomad-is-a-life-on-the-road-right-for-you"&gt;Flood&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Then there are the side benefits of being in load testing. The photos above are real ones from the Flood team. That’s me on the upper left, exploring a castle in Belgrade, Serbia, and that’s Tim in the bottom right, taking a photo in San Francisco, USA.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.flood.io/blog/inside-the-career-of-a-digital-nomad-is-a-life-on-the-road-right-for-you"&gt;We’re a fully distributed team on Flood&lt;/a&gt;, which means we can work from anywhere. Flood is a web app, so you don’t need to install anything– I’ve been known to start load tests from my iPad in a café. Load testing on the cloud frees you from being tied to running tests from the office. You can start load generators when you need them and shut them down when you don’t– all from a web browser. It’s a job that can come with a great work/life balance, if you find the right company.&lt;/p&gt;
&lt;p&gt;Load testing can also be a great way to move to another country. It’s what’s allowed me to move to other countries– twice. In Australia, the average performance engineer’s salary is AU$108,053, or over 5.6 million rupee.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/how-to-become-a-load-tester06.png" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Source: &lt;a href="https://www.payscale.com/research/AU/Job=Performance_Engineer/Salary"&gt;Payscale&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;So it’s clear that there are some pretty good reasons for you to become a load tester. I&amp;rsquo;m going to walk you through the practical steps to become a load tester. You may not be an expert by the end of this, but I hope I can convince you that you can get started in load testing whether your background looks like Tim’s or mine.&lt;/p&gt;
&lt;h3 id="load-testing-adds-real-value"&gt;Load testing adds real value&lt;/h3&gt;
&lt;p&gt;And the trite, but absolutely true reason: Everyone fails.&lt;/p&gt;
&lt;p&gt;As a load tester, you are a gatekeeper of quality. What you do directly affects revenue and customer experience.&lt;/p&gt;
&lt;p&gt;Performance is an aspect of software that is often overlooked, but it’s only becoming more important in a world where everything is going online. People are being born who have never known what it’s like not to have the internet, and consumers in general expect applications to be responsive and stable. Would-be customers who can’t get an e-commerce site to load within 3 seconds may switch to a competitor’s site, and we all know there are many of them. Performance-related outages can be seriously damaging to a company’s reputation, and social networking amplifies customer dissatisfaction by effectively giving everyone a megaphone to complain into.&lt;/p&gt;
&lt;p&gt;Software functionality is still important. However, if an online store goes live with no critical functional defects, but it fails when the 100th person logs into it, or it takes 10 seconds to load the homepage, can you really say that it was ready for production?&lt;/p&gt;
&lt;p&gt;Load testing is a crucial part of ensuring software quality, and quality is the responsibility of everyone on a team, even if the word “performance” isn’t in your job title.&lt;/p&gt;
&lt;h2 id="the-essential-ingredients-of-a-load-test"&gt;The essential ingredients of a load test&lt;/h2&gt;
&lt;p&gt;Load testing is like cooking a meal. This is one of Tim&amp;rsquo;s favorite dishes, aloo matar.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/how-to-become-a-load-tester07.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Source: &lt;a href="https://www.cubesnjuliennes.com/aloo-matar-recipe/"&gt;Cubes n Juliennes&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;You can approach cooking as a science. There are recipes with a list of ingredients, a precise measurement of how much you need for each, and a procedure for creating the dish.&lt;/p&gt;
&lt;p&gt;But you can also look at cooking as an art. Cooking the same dish over and over again will give you an experience in working with those ingredients that a novice cook won’t have. There’s room in cooking for adding one ingredient, changing the quantity of another, or just trying something new.&lt;/p&gt;
&lt;p&gt;A master chef knows how to use both the science and the art to create something delicious. But you don’t HAVE to be at that level in order to cook.&lt;/p&gt;
&lt;p&gt;Anyone can cook. If you know how to follow a basic recipe, you may not create a masterpiece, but if you’re like me and you haven’t had lunch yet, you’ll still end up with something you’ll eat.&lt;/p&gt;
&lt;p&gt;So here’s the recipe for load testing.&lt;/p&gt;
&lt;p&gt;I prefer kadai paneer myself, but aloo matar requires, among other things, peas. And so does load testing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;P is Preparation&lt;/strong&gt;. To prepare for a load test, you need to get your ingredients ready. You need to decide what it is you want to test, why you’re testing it, and how. You write load testing scripts that will simulate real users as closely as possible.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;E is Execution&lt;/strong&gt;. This is when you do the actual cooking. You run your load tests and scale them up according to your requirements.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A is Analysis&lt;/strong&gt;. You figure out whether the dish you created is edible. You determine how your application servers responded during the load test, and decide if that’s acceptable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Preparation – Execution – Analysis.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="preparing-for-a-load-test"&gt;Preparing for a load test&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;“As far as the World Cup is concerned, it is a process. We don’t want to jump to the 50th floor straight away. We must start on the ground floor.” - Sachin Tendulkar, via &lt;a href="https://www.espncricinfo.com/story/_/id/22538610/world-cup-final-dream-tendulkar"&gt;ESPN&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Load testing doesn’t start with writing a script. Load testing starts with building a foundation for later tests.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/how-to-become-a-load-tester08.png" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Source: &lt;a href="https://www.insidesport.co/cricket-sachin-tendulkar-comes-to-aid-of-ailing-ashraf-who-once-fixed-his-bats/"&gt;Inside Sport&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Part of that foundation is asking WHY. Why do you want to do a load test? Has there been a performance-related issue before? Are you trying to determine whether an application is ready to go live, or is it already live, and you just want to improve its performance? What type of application do you want to test?&lt;/p&gt;
&lt;p&gt;WHOM are you cooking for? I think you’d cook differently for yourself than you would for Sachin Tendulkar. What do your end users typically do on your site? Where do they come from?&lt;/p&gt;
&lt;p&gt;These are questions that need to be answered before you think about scripting. Here are some resource for planning your load tests:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.flood.io/blog/start-with-why-how-to-write-requirements-for-api-load-testing"&gt;Start with Why: How to write requirements for API load testing&lt;/a&gt;
&lt;a href="https://www.flood.io/blog/how-to-write-a-test-plan-for-load-testing"&gt;How to write a test plan for load testing&lt;/a&gt;
&lt;a href="https://guides.flood.io/ebooks/api-load-testing/scripting-an-api-load-test"&gt;Selecting a tool for load testing&lt;/a&gt;
Generating a load testing script without coding: &lt;a href="https://guides.flood.io/overview-of-flood/scripting-your-load-test"&gt;Getting Started with Test Builder&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="execution-of-a-load-test"&gt;Execution of a load test&lt;/h2&gt;
&lt;p&gt;So now we’re ready to start cooking. This is the Execution phase. You’ll need a machine to use as a load generator. Depending on the number of users you want to run with, you may need more than one machine. You might be tempted to run a load test on your laptop, or on a bunch of machines you have lying around, but that introduces new variables that may affect the results.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/how-to-become-a-load-tester09.jpeg" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Source: &lt;a href="https://unsplash.com/@suicide_chewbacca?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Ashwini Chaudhary&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/indian-food?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Like any good cook, you’ll also need to make sure you have all your ingredients handy. In load testing, that means making sure your scripts and test data files are ready to be executed on every load generator.&lt;/p&gt;
&lt;p&gt;Both of these problems – provisioning a load generator and transferring files over to them – are solved pretty easily by running on the cloud using something like Flood.&lt;/p&gt;
&lt;p&gt;Designing and executing your load test&lt;/p&gt;
&lt;p&gt;Where should you run your load tests? A look at demand, hosted, and on-premise infrastructure&lt;/p&gt;
&lt;h2 id="analysis-of-results"&gt;Analysis of Results&lt;/h2&gt;
&lt;p&gt;The last part is Analysis.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/how-to-become-a-load-tester10.jpeg" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Source: &lt;a href="https://www.finedininglovers.com/recipes/brunch/potato-pakoras-yogurt-sauce"&gt;Fine Dining Lovers&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This is a pretty crucial moment, because this is when you figure out whether what you cooked was delicious or not. Unfortunately, in load testing, it’s not always easy to tell how your test went. It’s like this photo of pakora (onion is my favorite kind). It’s kind of hard to say what expression that is in their faces. Is it disgust? Or is the pakora so yummy that they just can’t wait to eat more?&lt;/p&gt;
&lt;p&gt;Load testing typically generates a LOT of data. You’d have to go copy every single file from every load generator you used. But can you imagine the hundreds of load generators that Hotstar used? Of course they didn’t manually copy those files. Instead, they used Flood.&lt;/p&gt;
&lt;p&gt;On Flood, we show real-time graphs as you’re running the test so that you can tell immediately whether transactions are failing or whether a server has stopped responding.&lt;/p&gt;
&lt;p&gt;After the test, you can also compare this data to previous tests to spot trends, or even create your own dashboards using an analytics engine.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://guides.flood.io/results-analysis/metrics-during-test"&gt;Real-time metrics during your load test&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://guides.flood.io/results-analysis/archived-results"&gt;Downloading results and logs after the test&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="is-that-it"&gt;Is that it?&lt;/h2&gt;
&lt;p&gt;You’ve prepared for a load test, you’ve executed a load test, and you’ve analysed the results from the load test. Congratulations, you’re a load tester! By following this recipe, you’re already doing better than many people, and you’re certainly doing a lot better than those who do not run any load tests at all.&lt;/p&gt;
&lt;p&gt;The cool thing about load testing, though, is that this is just the beginning. There’s always room for improvement.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/how-to-become-a-load-tester11.jpeg" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Source: &lt;a href="https://popupcity.net/observations/dabbawalla-hot-lunch-delivery-by-mumbais-fastest/"&gt;Pop Up City&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Dabbawallas are people who deliver hot lunches, and while the concept is not new, the implementation in India is particularly interesting.&lt;/p&gt;
&lt;p&gt;For these dabbawallas, having the meals prepared is not the end of the job. Once the food is ready, it needs to be packed into lunchboxes, picked up, separated according to destination, put on trains, and delivered. Later, the empty lunchboxes are picked up, and the system works in reverse.&lt;/p&gt;
&lt;p&gt;It turns out that this is actually a pretty sophisticated system. In fact, it’s been estimated that only one tiffin every two months is not delivered. That’s equivalent to a &lt;a href="https://www.bbc.com/future/article/20170114-the-125-year-old-network-that-keeps-mumbai-going"&gt;Six-Sigma quality rating of 99.9999999%&lt;/a&gt; (that’s nine nines) or more.&lt;/p&gt;
&lt;p&gt;Dabbawallas didn’t get that rating just by delivering quickly. They did it by being consistent and reliable. They did it by having a process.&lt;/p&gt;
&lt;p&gt;Once you see the benefits of running a load test, you may also start to understand that the real value of load testing is not in a test that you run once whenever you think of it. Imagine having the benefits of a load test tied to your development process, so that it is automated.&lt;/p&gt;
&lt;p&gt;As an advanced topic, &lt;a href="https://www.flood.io/blog/load-testing-in-devops-pipelines-with-azure-and-flood"&gt;adding your load testing&lt;/a&gt; to your team&amp;rsquo;s Continuous Integration/Continuous Development pipelines such as sets up a repeatable process that reaps benefits far into the future, not just whenever official load testing activities are carried out.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://guides.flood.io/continuous-integration/what-is-continuous-integration"&gt;Continuous Integration with Flood&lt;/a&gt;: Integrating Travis CI, Circle CI, and Jenkins&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;So that’s the recipe for becoming a load tester.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Preparation – Execution – Analysis.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In &lt;strong&gt;Preparation&lt;/strong&gt;, you determine why you’re testing and what tool best fits your needs. We showed you how to use Element, but there are many open source tools out there. Don’t get overwhelmed by scripting– a lot of times it can just mean replacing a URL with the one YOU want to test.&lt;/p&gt;
&lt;p&gt;In &lt;strong&gt;Execution&lt;/strong&gt;, you run a baseline test that will serve as a point of comparison for future testing, choose the number of users and the number of regions you want, and then you run your test. Running on the cloud is the easiest (and usually cheapest) way to get started.&lt;/p&gt;
&lt;p&gt;In &lt;strong&gt;Analysis&lt;/strong&gt;, you view the results in real-time, compare historical performance to see trends, and share reports to stakeholders so that your team can make changes to your application.&lt;/p&gt;
&lt;p&gt;We also talked about the bonus topic of &lt;strong&gt;CI/CD&lt;/strong&gt; and how you can incorporate load testing into your pipeline to get a continuous feedback during your development cycle.&lt;/p&gt;
&lt;p&gt;Tim and I started in very different places and had different experiences before we discovered load testing. But eventually, we ended up on the same path, and that’s what we’ve outlined for you here. We hope that this convinces you that load testing doesn’t have to be complicated.&lt;/p&gt;
&lt;p&gt;You absolutely don’t need to be an expert to run a load test. Even if you don’t think you’ll get all these steps right, a load test that is less than ideal is still better than no load testing at all.&lt;/p&gt;
&lt;p&gt;In the end, anyone can be a load tester with the right attitude and the right tools.&lt;/p&gt;
&lt;h2 id="learning-about-load-testing"&gt;Learning about load testing&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.goodreads.com/book/show/1681559.High_Performance_Web_Sites"&gt;High Performance Websites&lt;/a&gt; book by Steve Souders&lt;/p&gt;
&lt;p&gt;Ministry of Testing/PerfBytes &lt;a href="https://www.ministryoftesting.com/dojo/lessons/a-quick-start-guide-to-learning-performance-testing"&gt;list of resources&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.perfbytes.com/"&gt;PerfBytes podcast&lt;/a&gt; (EN and ES)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://guildconferences.com/conference/perfguild-2020/"&gt;PerfGuild conferences&lt;/a&gt; by Joe Colantonio&lt;/p&gt;
&lt;p&gt;Señor Performo’s YouTube Channel: &lt;a href="https://www.youtube.com/channel/UCO-RlGccAUQnMqTaBkvUJhQ"&gt;Señor Performo ENG&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Scott Moore’s &lt;a href="https://www.youtube.com/watch?v=9H2GSGvGwqQ&amp;amp;list=PLXRCdih3vTUEFz1TVyP7RRqEEk__CYGoB"&gt;Performance Tour&lt;/a&gt; on YouTube&lt;/p&gt;</description></item><item><title>Lifting the lid on performance testing</title><link>https://nicolevanderhoeven.com/blog/20200924-testing-talks-online/</link><pubDate>Thu, 24 Sep 2020 23:38:56 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200924-testing-talks-online/</guid><description>&lt;p&gt;I joined other performance and testing engineers in this online panel at Testing Talks Online about load testing best practices.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/pHQ4FwdwGGk?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;From the &lt;a href="https://www.testingtalks.com.au/presentations/lifting-the-lid-on-performance-testing-best-practices-from-leading-companies"&gt;Testing Talks Online site&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Performance testing is an essential part of the quality assurance function. However, across the industry the great majority of companies still struggle to master and execute a successful performance testing strategy that produces measurable results.
In this panel discussion, Cameron Bradley will host some of the best performance engineers in the world. The panel will discuss how we as quality assurance experts and performance engineers can better understand performance testing, the value of performance testing and how world leaders are approaching and succeeding with performance testing as part of the delivery life cycle.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>How to Write a Load Test Plan</title><link>https://nicolevanderhoeven.com/blog/20200921-how-to-write-a-load-test-plan/</link><pubDate>Mon, 21 Sep 2020 16:33:23 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200921-how-to-write-a-load-test-plan/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/how-to-write-a-test-plan-for-load-testing"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/how-to-write-a-test-plan-for-load-testing"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;People often start load testing by creating a script in their favorite load testing tool, but good load testing starts before that. Planning a load test may seem like a tedious exercise, but it is essential to ensuring the success of your testing.&lt;/p&gt;
&lt;p&gt;A test plan should answer why, what, who, when, and how the testing will be carried out.&lt;/p&gt;
&lt;p&gt;A good test plan, particularly for load testing, includes the following components:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Requirements&lt;/li&gt;
&lt;li&gt;Scope&lt;/li&gt;
&lt;li&gt;Entry criteria&lt;/li&gt;
&lt;li&gt;Workload modeling&lt;/li&gt;
&lt;li&gt;Server monitoring&lt;/li&gt;
&lt;li&gt;Test doubltes&lt;/li&gt;
&lt;li&gt;Test Scenarios&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We&amp;rsquo;ll dive into each of these, but first, a note on the format of a test plan.&lt;/p&gt;
&lt;h2 id="test-plan-format"&gt;Test Plan Format&lt;/h2&gt;
&lt;p&gt;Test plans have been traditionally presented as a document, but there&amp;rsquo;s no hard-and-fast rule. Instead, the length of a test plan, and the level of detail it goes into, should be tailored for the complexity of the project and the backgrounds of the stakeholders.&lt;/p&gt;
&lt;p&gt;Teams using Agile methodologies may not have a formal test plan at all, but I would argue that all teams should still have some sort of plan, whether it&amp;rsquo;s a Word document or a list of bullet points. Written plans clarify and communicate intent, and testing can be an expensive and fruitless exercise without a consensus on its intent.&lt;/p&gt;
&lt;p&gt;Technical documentation can be difficult to digest and understand, and that&amp;rsquo;s dangerous when it comes to software development and testing, where it&amp;rsquo;s imperative that all stakeholders are on the same page about the state of an application.&lt;/p&gt;
&lt;p&gt;Paul McLean, a performance engineer, has a creative solution for this. He creates a companion video for every technical report, giving stakeholders the option to read the written report for details but watch the video for a more high-level and nuanced explanation.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s an example of a companion video he created for a test plan:&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/FJj_7nyV3Ak?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="requirements"&gt;Requirements&lt;/h2&gt;
&lt;p&gt;Everything starts with requirements. Until requirements are identified, load testing can only ever be aimless and explanatory, and any performance bottlenecks spotted will be incidental.&lt;/p&gt;
&lt;p&gt;Requirements inform every step of the load testing process. Why are we doing load testing? What exactly do we want to test? How will we know when a test has passed or failed? How will we know if application performance is good enough to go into production? What does “good enough” mean?&lt;/p&gt;
&lt;p&gt;This is such an important part of the planning process that I felt it deserved its own blog post. See it here: &lt;a href="https://www.flood.io/blog/start-with-why-how-to-write-requirements-for-api-load-testing"&gt;Start with Why: How to Write Requirements for API Load Testing&lt;/a&gt;. Even though I specifically mention API load testing, the principles apply to load testing in general.&lt;/p&gt;
&lt;h2 id="scope"&gt;Scope&lt;/h2&gt;
&lt;p&gt;At Flood, we use a product development methodology called &lt;a href="https://basecamp.com/shapeup"&gt;Shape Up&lt;/a&gt; to keep us on track as we build new features. Projects in Shape Up are called &amp;ldquo;shaped work&amp;rdquo;, and one of the basic properties of shaped work is that it is bounded.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;hellip;shaped work [also] indicates what not to do. It tells the team where to stop. There’s a specific appetite—the amount of time the team is allowed to spend on the project. Completing the project within that fixed amount of time requires limiting the scope and leaving specific things out.- Ryan Singer, &lt;a href="https://basecamp.com/shapeup"&gt;Shape Up: Stop Running in Circles and Ship Work that Matters&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Defining scope is setting boundaries. Business priorities need to be weighed against the resource limitations (number of people available to do the work and time available) in order for testing to deliver maximum value.&lt;/p&gt;
&lt;p&gt;Some considerations for scope include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Specific features or key transactions to be tested&lt;/li&gt;
&lt;li&gt;Types of tests included (component test vs end-to-end test)&lt;/li&gt;
&lt;li&gt;Test scenarios (peak load test vs disaster recovery)&lt;/li&gt;
&lt;li&gt;Applications included in testing&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As with most things in the planning phase, scope is something that can change during the test when unexpected circumstances arise or when priorities change. But it&amp;rsquo;s still a good practice to define the scope at the beginning, and update it as it changes.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/how-to-write-a-load-test-plan01.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s important, however, to &lt;em&gt;prune with intention&lt;/em&gt;. By keeping our objectives in mind, we can keep our work in line with our intentions.&lt;/p&gt;
&lt;h2 id="entry-criteria"&gt;Entry criteria&lt;/h2&gt;
&lt;p&gt;Occasionally, you may be asked to load test an application that isn&amp;rsquo;t ready to be load tested. This happens more often than you think. While it&amp;rsquo;s true that Performance Testing is something that should be baked into all software development from the beginning, this doesn&amp;rsquo;t hold true for Load Testing. Load testing is only one activity that falls underneath the broader umbrella of performance testing.&lt;/p&gt;
&lt;p&gt;Entry criteria are conditions that you need to be fulfilled before the testing actually begins. It’s a good idea to have these conditions communicated beforehand so that everyone is clear on what needs to be set up before you can do your job.&lt;/p&gt;
&lt;h3 id="functional-testing-does-the-application-work"&gt;Functional testing: Does the application work?&lt;/h3&gt;
&lt;p&gt;Load testing cannot realistically be carried out until at least the core functionality has been tested and high-severity defects have been fixed. Depending on the kind of load test you want to execute, you may also want to specify that UAT has been executed, as there’s no point doing an end-to-end load test with 1000 users if it doesn’t work for one user.&lt;/p&gt;
&lt;h3 id="load-testing-environment-is-it-production-like"&gt;Load Testing Environment: Is it production-like?&lt;/h3&gt;
&lt;p&gt;Nonfunctional testing has stricter requirements for an environment than does functional testing, and you may have to champion this cause. For load testing, it is not enough to have an application staging environment that is a virtual machine that is a quarter of the size of the production environment. It’s important to get as close to a production-like environment as possible in terms of capacity (memory, CPU), codebase (the actual build that will be deployed), and integrations with other environments or servers (if within test scope).&lt;/p&gt;
&lt;p&gt;Load testing is not linear: a response time of 5 seconds on a server with half the capacity of the production server does not necessarily equate to a response time of 2.5 seconds in production.&lt;/p&gt;
&lt;p&gt;This is also the time to think about your load injectors. Will they be on-premises, or in the cloud? A good entry criterion is the availability of the machines in the right network and with the right tools installed. If you’re using commercial tools, license provisioning should be a criterion. What sort of capacity will your load testing scripts require?&lt;/p&gt;
&lt;h3 id="support-are-there-people-available-with-expertise-in-key-components"&gt;Support: Are there people available with expertise in key components?&lt;/h3&gt;
&lt;p&gt;Load testing is a team activity. When a load test involves multiple application teams, it’s important to request availability of key persons on those teams during the test. Often as load testers, we are seen as working independently, but the truth couldn’t be farther from that. Load testing is a team sport. We need support from:&lt;/p&gt;
&lt;p&gt;business analysts who will be able to tell us how things are expected to work and what the current priorities are&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;developers whom we can consult when poorly performing code needs to be optimised&lt;/li&gt;
&lt;li&gt;functional testers who can show us how the application works&lt;/li&gt;
&lt;li&gt;DevOps engineers who can help us provision and monitor servers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;and many more!&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/how-to-write-a-load-test-plan02.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h3 id="test-data-do-you-have-dummy-data-for-your-virtual-users-to-interact-with"&gt;Test Data: Do you have dummy data for your virtual users to interact with?&lt;/h3&gt;
&lt;p&gt;Once you have as close a copy of the production environment as possible, keep in mind that it’s still a clean copy, which may not be realistic. If there are databases in production, how much data do they contain? The application server may respond differently when your test database is empty compared to when it must contend with gigabytes of data in the production database.&lt;/p&gt;
&lt;p&gt;Using production data for testing purposes can be dangerous, not to mention illegal, in certain circumstances. To avoid this, you can scrub sensitive data or generate your own, either by injecting records into a database or by writing an automation script to create data on the front-end. If you write a script, you may be able to reuse parts of it later for your load test.&lt;/p&gt;
&lt;h2 id="workload-modeling"&gt;Workload Modeling&lt;/h2&gt;
&lt;p&gt;A workload model is a schema describing the load profile for a given test scenario, and it involves determining what (the key transactions), how much (the load distribution among the transactions) and when (timing of the load) to test.&lt;/p&gt;
&lt;p&gt;Workload modeling can be the most difficult part of the testing process because it involves finding out how load test scripting can best mimic what is actually happening in production. It can also be the most critical.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s my account of working on a project in horse racing, where workload modeling was of particular importance: &lt;a href="https://www.flood.io/blog/workload-modeling-preparing-for-large-events-like-the-melbourne-cup"&gt;Workload Modeling - Preparing for Large Events like the Melbourne Cup&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/how-to-write-a-load-test-plan03.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;When you&amp;rsquo;re selling bets for the Melbourne Cup, every second matters.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="server-monitoring"&gt;Server monitoring&lt;/h2&gt;
&lt;p&gt;Executing a load test without monitoring server health is like flying blind. You’ll know when you land safely and you’ll know when you crash, but even if you do crash, you won’t know why—or how you can avoid it next time. Monitoring server health is the black box that will tell you what went wrong.&lt;/p&gt;
&lt;p&gt;For load testing, you&amp;rsquo;ll want to monitor the application servers that you&amp;rsquo;re testing as well as the load generators that you&amp;rsquo;re using to run the load tests themselves. That&amp;rsquo;s right; if you&amp;rsquo;re not watching carefully, the machines you run the load tests on can be the bottlenecks in themselves, causing unnecessary failures in your load tests.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://testguild.com/performance-test-resource-utilization/"&gt;Joe Colantonio&lt;/a&gt; goes over the basics of resource utilization in terms of four main areas of concern:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU&lt;/li&gt;
&lt;li&gt;Memory&lt;/li&gt;
&lt;li&gt;Disk&lt;/li&gt;
&lt;li&gt;Network&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://www.flood.io/blog/load-testing-tutorial-server-monitoring"&gt;Here&amp;rsquo;s another guide&lt;/a&gt; I put together on the basic metrics as well as some tools you can use to set up your monitoring.&lt;/p&gt;
&lt;p&gt;Regardless of which metrics you identify as key or which tools you use, you&amp;rsquo;ll want to make sure that they&amp;rsquo;re all set up to measure server health before you run your load tests.&lt;/p&gt;
&lt;h2 id="test-doubles"&gt;Test doubles&lt;/h2&gt;
&lt;p&gt;Part of the strategic planning around load testing is deciding which components need to be tested in conjunction with your stated requirements. Applications can sometimes be complex enough that load testing end-to-end is not feasible due to the number of teams involved or the cost of duplicating application infrastructure.&lt;/p&gt;
&lt;p&gt;Keeping it as simple as possible will lead to fewer dependencies, so it&amp;rsquo;s worth considering creating test doubles to isolate relevant components. Test doubles include stubs, mocks, and full virtual services.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/how-to-write-a-load-test-plan04.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;A test double is that part that replaces a complicated component that is not within scope. It’s a “dumber” version that responds to requests enough to allow you to go on with your load testing without actually requiring that component.&lt;/p&gt;
&lt;p&gt;Test doubles allow us to abstract out other components we don&amp;rsquo;t want to test so that we can concentrate on the one that we do. The point of a test double is to remove the variables and noise introduced by other parts of the application so that we can focus on testing how one component responds.&lt;/p&gt;
&lt;p&gt;If you are willing to put the time into creating a test double, you can drastically reduce the amount of resources you need to set up an environment and isolate components. Reducing variables in your test allows you to more quickly determine where performance bottlenecks lie.&lt;/p&gt;
&lt;h2 id="test-scenarios"&gt;Test Scenarios&lt;/h2&gt;
&lt;p&gt;A test scenario is the description of a contained situation or condition under which the application will be tested. A test scenario is usually based on several test cases and includes a plan for how these test cases will be executed.&lt;/p&gt;
&lt;p&gt;Choosing your test scenarios means deciding which situation is most likely to yield the data that you require. Employing several different types of scenarios will give you a greater understanding of your application’s capabilities. You should feel free to create your own scenarios that are uniquely tailored to your requirements, but here are some common scenarios to start out with. Take the number of users and durations mentioned as guidelines and not rules.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what our Flooder amigo, Señor Performo, has to say about test scenarios:&lt;/p&gt;
&lt;p&gt;&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/EGzoAadzWwM?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;em&gt;Text version &lt;a href="https://www.flood.io/blog/ask-a-flooder-21-senor-performo-on-load-testing-scenarios"&gt;here&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Creating a test plan can seem daunting, but the process of writing it serves as a prompt for discussions among your team.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a &lt;a href="https://techbeacon.com/app-dev-testing/how-go-performance-tester-performance-engineer"&gt;pro tip from Scott Moore&lt;/a&gt;: Once you come up with a template you&amp;rsquo;re happy with, save it and reuse it for future projects. Modify it over time based on feedback to see progressive improvement.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Building a set of reusable documents and other deliverables (&amp;ldquo;templates&amp;rdquo;) to use in the initial planning phase and final reporting will speed your initial startup time. I recommend working with or learning from others with experience to build out some of these templates.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;‍When in doubt, remember that the format of a test plan is not as important as making sure it is meaningful and comprehensible for your team.&lt;/p&gt;
&lt;p&gt;‍For more information about the load testing process, check out &lt;a href="https://guides.flood.io/ebooks/api-load-testing"&gt;my book on API load testing&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Pros and Cons of API load testing</title><link>https://nicolevanderhoeven.com/blog/20200818-pros-and-cons/</link><pubDate>Tue, 18 Aug 2020 21:22:49 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200818-pros-and-cons/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/pros-and-cons-of-api-load-testing"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/pros-and-cons-of-api-load-testing"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;‍API load testing is one of the most popular ways to run a load test because of the number of open source and commercial load testing tools available on the market that support it. Creating a script to hit your application&amp;rsquo;s API endpoints is the traditional approach to load testing, but it&amp;rsquo;s not the only one.&lt;/p&gt;
&lt;p&gt;Here are some things to consider when deciding whether or not API load testing is right for your application.&lt;/p&gt;
&lt;h2 id="disadvantages-of-api-load-testing"&gt;Disadvantages of API load testing&lt;/h2&gt;
&lt;h3 id="api-load-testing-does-not-simulate-real-users-interacting-with-elements-of-your-webpage"&gt;API load testing does not simulate real users interacting with elements of your webpage.&lt;/h3&gt;
&lt;p&gt;‌In contrast to a customer opening up a browser and filling out forms on your site, an API load testing script will consist only of the underlying requests to the server that are made by clicking on those on-screen elements. Exactly how the customer triggers those requests, and what buttons they’ve pressed, is irrelevant. It’s all about the raw requests.‌&lt;/p&gt;
&lt;p&gt;The format of these requests will be dictated by the type of API your application uses, and it may take some technical knowledge or expertise to be able to formulate requests correctly. However, a RESTful API is one of the most common types, and it is considered to be relatively simple to use.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200818-01.png" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;HTTPS requests for amazon.com. This is what an API load testing script would need to replicate.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="it-doesnt-give-you-an-idea-of-how-user-friendly-your-application-is"&gt;It doesn’t give you an idea of how user-friendly your application is.&lt;/h3&gt;
&lt;p&gt;‌API load testing tools don’t give you feedback on how long your pictures took to render on your users’ browsers or whether that “SUBMIT” button is in an obvious spot.&lt;/p&gt;
&lt;h3 id="it-doesnt-measure-front-end-performance-or-how-quickly-pages-render-in-different-browsers"&gt;‌It doesn’t measure front-end performance or how quickly pages render in different browsers.&lt;/h3&gt;
&lt;p&gt;‌While all the resources that the server returns can be downloaded by your tool of choice, there is no browser on which to run them.&lt;/p&gt;
&lt;h3 id="api-load-testing-doesnt-run-client-side-scripts"&gt;‌API load testing doesn’t run client-side scripts.&lt;/h3&gt;
&lt;p&gt;‌It isn’t what you’re looking for if your application is a single-page web app that relies heavily on JavaScript or AJAX to dynamically populate and update the page. Your load testing tool will download the scripts, but not execute them.‌&lt;/p&gt;
&lt;p&gt;‌This includes scripts like those required to trigger Google Analytics, which prompts many an engineer to question the results of an API load test due to the inability to see the traffic come in on Google Analytics. API load testing won’t help you with that. Running browser-level load tests using tools like &lt;a href="https://element.flood.io"&gt;Flood Element&lt;/a&gt; or &lt;a href="https://selenium.dev"&gt;Selenium&lt;/a&gt; may be more useful.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve decided that API load testing is not the best way to load test your application, you can look at browser-based load testing as an alternative.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200818-02.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Executing a browser-based load testing script using Flood Element.&lt;/em&gt;
‌&lt;/p&gt;
&lt;h2 id="advantages-of-api-load-testing"&gt;‌Advantages of API load testing&lt;/h2&gt;
&lt;p&gt;Now that we’ve talked about what API load testing isn’t good at, let’s talk about what it IS good at.&lt;/p&gt;
&lt;p&gt;‌### It allows you to load test specific servers rather than the whole stack.&lt;/p&gt;
&lt;p&gt;‌API load testing allows you to tailor your load testing by applying load only on particular servers. This is particularly useful in more complicated applications that involve several components and would require substantial effort to reproduce in a test environment. Using APIs, you can test only the functions you want to test.&lt;/p&gt;
&lt;h3 id="it-is-well-supported-"&gt;It is well-supported. ‌&lt;/h3&gt;
&lt;p&gt;API load testing has been around for decades. There are lots of robust tools you can choose from, both commercial and open-source, and many of these tools have large communities and extensive documentation around how to script the most common cases. It’s a far cry from the browser-level testing space, which is relatively new and sparsely populated by comparison.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/20200818-03.png" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;The &lt;a href="https://jmeter.apache.org/usermanual/index.html"&gt;JMeter site&lt;/a&gt; contains a wealth of information, including a User&amp;rsquo;s Manual&lt;/em&gt;
‍&lt;/p&gt;
&lt;h3 id="its-not-as-resource-intensive-as-browser-level-testing"&gt;It’s not as resource-intensive as browser-level testing.&lt;/h3&gt;
&lt;p&gt;You can simulate more users with API load testing than with browser-level load testing. Since most interactions on the browser-level get translated to requests anyway, generating load this way is incredibly efficient, allowing you to hit your server with requests while bypassing the UI layer and the resource overhead that that entails.&lt;/p&gt;
&lt;p&gt;For example, at &lt;a href="https://flood.io"&gt;Flood&lt;/a&gt; we’ve baselined some of the tools that we support to see how many users we can run on an AWS m5.xlarge instance:&lt;/p&gt;
&lt;p&gt;Selenium: 5 users
Flood Element: 20-40 users
JMeter: 1000 users
Gatling: 1000 users&lt;/p&gt;
&lt;p&gt;‌You’ll see that the browser-level test tools, Selenium and Flood Element, can run significantly fewer users on the same sized node as can the protocol-level tools, JMeter and Gatling. This isn’t due to an inefficiency in the tools but rather to the fact that browser-level tools inherently need more CPU and memory to start separate instances of browsers per user and render pages graphically. You can run more users per node (or machine) by carrying out API load testing with protocol-level tools.&lt;/p&gt;
&lt;h3 id="its-cheaper"&gt;It’s cheaper.&lt;/h3&gt;
&lt;p&gt;‌The efficiency in resource utilization translates directly into cost savings because every node that you don’t need to execute your tests on is one fewer node that you’ll have to pay to provision (whether on premises or in the cloud).&lt;/p&gt;
&lt;p&gt;‌For this reason, API load testing is one of the most cost-efficient ways you can get started with load testing, allowing you to scale up your load relatively cheaply while getting immediate results.&lt;/p&gt;
&lt;h2 id="how-to-get-started-with-api-load-testing"&gt;How to get started with API load testing&lt;/h2&gt;
&lt;p&gt;API load testing isn&amp;rsquo;t for every application, but depending on your test scenario, it may be the easiest way to test application performance.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re new to non-functional testing or API load testing in particular and would like some step-by-step tutorials on how to get started, check out my free ebook, &lt;a href="https://guides.flood.io/ebooks/api-load-testing"&gt;API Load Testing: A Beginner&amp;rsquo;s Guide&lt;/a&gt;. It takes you through the basics of API load testing, including planning your first load test, selecting an open source tool, scripting, executing a test on the cloud, analyzing results, and even integrating it into your CI/CD pipelines.&lt;/p&gt;</description></item><item><title>Performance testing the Dutch coronavirus hotline</title><link>https://nicolevanderhoeven.com/blog/20200813-dutch-coronavirus-hotline/</link><pubDate>Thu, 13 Aug 2020 22:18:04 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200813-dutch-coronavirus-hotline/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/performance-testing-the-story-of-the-dutch-coronavirus-hotline"&gt;
&lt;p&gt;&lt;em&gt;Read the original Dutch version &lt;a href="https://nicolevanderhoeven.com/blog/20200704-performanceverbeteringen-voor-de-coronalijn/"&gt;here&lt;/a&gt;.&lt;/em&gt;
&lt;em&gt;This English version was first posted &lt;a href="https://www.flood.io/blog/performance-testing-the-story-of-the-dutch-coronavirus-hotline"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;On June 1st, 2020, the National Institute of Health and Environment (RIVM) announced that everyone with certain symptoms could call the hotline 0800-1202 to arrange a free COVID-19 test. The promise: call today, get tested tomorrow, and receive the results the day after that. The reality, though, did not live up to expectations.&lt;/p&gt;
&lt;p&gt;The opening day of the hotline was chaotic, and many Dutch people reported connection problems due to a system overload. Yet this could have been prevented with a better understanding of how human psychology can affect application performance.&lt;/p&gt;
&lt;h2 id="the-situation"&gt;The situation&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://nos.nl/collectie/13824/artikel/2335758-ggd-en-klaar-voor-massaal-testen-tijd-van-limiterende-factoren-voorbij"&gt;According to Dr. Ann Vossen&lt;/a&gt;, chairperson of the task force charged with scaling up mass testing in the Netherlands, the country was ready to process 30,000 tests per day. This number corresponds to &lt;a href="https://nos.nl/artikel/2335790-drukte-op-nieuw-telefoonnummer-voor-coronatests-0800-1202.html"&gt;the national capacity&lt;/a&gt; of all the municipal health clinics (GGDs) in the Netherlands. Despite this claim, though, &lt;a href="https://www.ad.nl/binnenland/liefst-323-000-telefoontjes-naar-nieuw-nummer-voor-coronatest-systemen-overbelast~a16a9a50"&gt;only 1,146 people were actually tested&lt;/a&gt; on the first day of testing (the day after the opening of the hotline). Perhaps more importantly, only 5,748 appointments were set on June 1st. The situation was no doubt exacerbated by the overwhelming 323,000 people who called the hotline on its first day, prompting even the telephone operators to admit that &lt;a href="https://www.volkskrant.nl/nieuws-achtergrond/coronatestnummer-kampt-met-kinderziektes-maar-ggd-s-kunnen-de-drukte-goed-aan~b2f332d2/"&gt;they&amp;rsquo;d had troubles&lt;/a&gt; logging into the appointment system.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200704-01.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Bron: From &lt;a href="https://twitter.com/GGDGHORNL/status/1267351996379643906"&gt;@ggdghornl&lt;/a&gt;, Twitter&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;[&amp;ldquo;We see that there are many calls going to 0800-1202. You can call for an appointment until 8pm tonight. Please try your call later to avoid long wait times.&amp;rdquo;]&lt;/p&gt;
&lt;p&gt;On Twitter, users shared horror stories: one claimed to have &lt;a href="https://twitter.com/Ed_van_Iterson/status/1267429180347691011"&gt;waited on the line for 6 hours&lt;/a&gt;, only to be told that the system was down and no appointments could be made; another complained about &lt;a href="https://twitter.com/maticus_spazz/status/1267374692941418496"&gt;getting disconnected&lt;/a&gt; after getting in touch with an operator. Yet another &lt;a href="https://twitter.com/leovanlinden/status/1267408142813605888"&gt;posted a video&lt;/a&gt; of calling the hotline and a recorded message saying &amp;ldquo;Al onze medewekers zijn op dit moment in gesprek. We zullen u zo snel mogelijk te woord staan. [All of our operators are currently on other calls. We will answer you as soon as possible].&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The second day was somewhat better: &lt;a href="https://www.volkskrant.nl/nieuws-achtergrond/coronatestnummer-kampt-met-kinderziektes-maar-ggd-s-kunnen-de-drukte-goed-aan~b2f332d2/"&gt;there were 11,000 appointments made&lt;/a&gt;, partly because of the lower amount of phone calls and partly because of some fixes of technical problems. In the first week, the number of appointments increased to 50,000 (about 7,142 per day), which was still significantly lower than expected.&lt;/p&gt;
&lt;p&gt;There are some lessons that we can learn from this case study.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200704-02.jpeg" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Source: Coronavirus test procedure from &lt;a href="https://ggdhm.nl/thema-s/item/infectieziekten/testbeleid"&gt;GGD Hollands Midden&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;English translation:&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Do you have these (mild) symptoms?:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cough&lt;/li&gt;
&lt;li&gt;blocked or runny nose&lt;/li&gt;
&lt;li&gt;fever&lt;/li&gt;
&lt;li&gt;loss of smell or taste&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Step 1: Make an appointment&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Call the national number 0800-1202&lt;/li&gt;
&lt;li&gt;Have your BSN with you when you call&lt;/li&gt;
&lt;li&gt;Make an appointment to get tested at one of our locations&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Step 2: Test&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Go to the selected location at the scheduled time&lt;/li&gt;
&lt;li&gt;You will be tested at the test location&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Step 3: Results and eventual start of source and contact research&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You will be called with your results within 48 hours&lt;/li&gt;
&lt;li&gt;If you are infected with the coronavirus, the GGD will call you for source and contact research
*If you show more serious symptoms, or if you fall within a high-risk group, report to your doctor or to the emergency help line.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2 id="the-effect-of-fear-on-performance"&gt;The effect of fear on performance&lt;/h2&gt;
&lt;p&gt;This coronavirus has already shown us a side of humanity that we&amp;rsquo;d perhaps rather not see: &lt;a href="https://www.bbc.com/news/world-australia-51731422"&gt;fights over toilet paper&lt;/a&gt;, &lt;a href="https://snacks.robinhood.com/newsletters/rMxwcb7y7lMZoI5NY6qf7/"&gt;chaos on the stock market&lt;/a&gt; due to panic, and &lt;a href="https://www.volkskrant.nl/nieuws-achtergrond/nctv-waarschuwt-voor-extremistische-protestacties-door-5g-tegenstanders-die-vrezen-voor-coronavirus~bf1400b8/"&gt;sabotage of 5G cell towers&lt;/a&gt; based on a belief that they caused COVID-19. As much as we&amp;rsquo;d like to believe it, we&amp;rsquo;re not always the most rational beings. We all have the tendency to behave unpredictably, especially when we&amp;rsquo;re afraid.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s no wonder that the coronavirus testing line was so welcome. The fact that there were 323,000 callers on the first day is even more remarkable when we remember that majority of Dutch residents had been in self-isolation for months at that point, which lowered their chances of contracting the virus. In theory, the fear that drove these callers might have been somewhat irrational, but not unpredictable.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200704-03.jpeg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;In English, we call this FOMO (Fear of Missing Out). We&amp;rsquo;ve already clearly seen &lt;a href="https://www.flood.io/blog/fomo-and-performance-testing-why-robinhood-went-down"&gt;how FOMO can drive users&lt;/a&gt; en masse to an application, with effects on its performance. In this case, people were afraid that coronavirus test shortages would mean there weren&amp;rsquo;t enough tests to go around, and they wanted to be first in line to get tested.&lt;/p&gt;
&lt;p&gt;Another problem was that &lt;a href="https://www.trouw.nl/binnenland/de-balans-na-een-week-testen-het-plan-was-mooier-dan-de-praktijk~b86399b7/"&gt;one in four callers&lt;/a&gt; just wanted general information about COVID-19, despite government pleas to keep the hotline free for coronavirus test appointments only. It didn&amp;rsquo;t help that the hotline opened on a Dutch national holiday, White Monday, and more people were home than usual for a Monday. The high number of unrelated calls was unexpected, but nevertheless factored into system overload.&lt;/p&gt;
&lt;p&gt;What could we have done to improve this system?&lt;/p&gt;
&lt;h2 id="improvements-to-the-corona-hotline"&gt;Improvements to the corona hotline&lt;/h2&gt;
&lt;h3 id="better-estimation"&gt;Better estimation&lt;/h3&gt;
&lt;p&gt;As difficult as it is to predict FOMO&amp;rsquo;s effects, we can still try. We can make educated guesses based on related statistics.&lt;/p&gt;
&lt;p&gt;Just one month before the coronavirus test hotline was opened, &lt;a href="https://www.zwollenu.nl/500-000-tot-700-000-nederlanders-besmet-met-coronavirus/"&gt;Jaap van Dissel&lt;/a&gt;, the head of RIVM, estimated that there were up to 700,000 Dutch residents infected by the coronavirus. Why, then, was it such a surprise that more than 300,000 of them had called? Furthermore, the RIVM had encouraged people with a broad list of symptoms (such as colds, coughs, or fever) to call, and it&amp;rsquo;s reasonable to assume that some people with conditions other than COVID-19 might also have called.&lt;/p&gt;
&lt;p&gt;Even if we assume that 20% of the 700,000 people with the novel coronavirus did not have symptoms (&lt;a href="https://www.who.int/docs/default-source/coronaviruse/situation-reports/20200306-sitrep-46-covid-19.pdf?sfvrsn=96b04adf_4"&gt;according to WHO research&lt;/a&gt;), we still arrive at a predicted 140,000 calls, which is still 25 times what was the coronavirus testing system was able to process on the first day.&lt;/p&gt;
&lt;p&gt;If we have an educated estimate, we can start testing.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/20200704-04.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h3 id="injecting-load"&gt;Injecting load&lt;/h3&gt;
&lt;p&gt;When a resident calls the hotline, the call is routed to one of several operators working from home. This is often done with a telephony server that forwards calls based on some type of round-robin system. We can execute load tests on this server to determine how many phone calls a server can process and route successfully, with minimal delay and without message queueing.&lt;/p&gt;
&lt;p&gt;Then, the operator enters personal information from the caller into the appointment system, including their government identification number (BSN) and address. We can surmise that the system checks the identity to verify the validity of the BSN, and then sends some details to a database. The closest municipal clinic to the caller can then use the data to process and schedule an appointment. We can also inject load at this stage by simulating the calls that the appointment system creates with an API load testing tool like JMeter or Gatling.&lt;/p&gt;
&lt;h3 id="using-different-test-scenarios"&gt;Using different test scenarios&lt;/h3&gt;
&lt;p&gt;With such a public announcement of the hotline&amp;rsquo;s opening, a &lt;strong&gt;spike test&lt;/strong&gt; before release could have yielded some useful information. In a spike test, we simulate a sharp increase in users over a short period of time. For example, we could have simulated an increase in users from 0 to 700,000 on the telephony system over 10 minutes to see how the application would have handled that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Soak tests&lt;/strong&gt; could also have been useful in this case. The hotline&amp;rsquo;s opening hours were from 8 am to 8 pm, so it was open for 12 hours in total. With soak tests, we can generate load on an application for an extended amount of time. Soak tests can reveal memory leaks or other bottlenecks in the processing of data that might occur after hours.&lt;/p&gt;
&lt;p&gt;These are ways we could have tested the system as it is, but are there improvements that we could have made in the system to make it more resilient to reduce the FOMO factor?&lt;/p&gt;
&lt;h2 id="using-automation-to-lessen-fomo-risk"&gt;Using automation to lessen FOMO risk&lt;/h2&gt;
&lt;p&gt;The system had some manual parts of the process that may have exacerbated load issues. Here&amp;rsquo;s how this system could have been automated to reduce bottlenecks.&lt;/p&gt;
&lt;h3 id="interactive-voice-response"&gt;Interactive Voice Response&lt;/h3&gt;
&lt;p&gt;Telephony servers commonly use Interactive Voice Response (IVR), an automated menu system for voice calls that uses either voice recognition or keypress tones to navigate a user through a series of choices. We&amp;rsquo;re all familiar with it: &amp;ldquo;&lt;em&gt;For Dutch, press 1. For English, press 2&amp;hellip;&lt;/em&gt;&amp;rdquo; Such a system might have helped reduce the overall load by quickly filtering out callers in the 25% who weren&amp;rsquo;t interested in creating an appointment. &amp;ldquo;&lt;em&gt;If you&amp;rsquo;d like to book an appointment for a coronavirus test, press 1. Otherwise, please call the information hotline at&amp;hellip;.&lt;/em&gt;&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what an IVR system could look like:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200704-05.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;From: &lt;a href="http://vanguardnetworks.com.sg/IVR.html"&gt;Vanguard Networks&lt;/a&gt;&lt;/em&gt;
‍
Load testing IVR systems can be difficult, and it usually requires the use of highly specialized commercial tools. However, introducing a new tool may also increase the time required for load testing.&lt;/p&gt;
&lt;h3 id="building-a-web-app"&gt;Building a web app&lt;/h3&gt;
&lt;p&gt;Another approach would be to implement a web app to verify identity and capture personal information quickly. In the Netherlands, we already have &lt;a href="https://www.digid.nl/wat-is-digid/"&gt;DigiD&lt;/a&gt;, an identity verification system that is heavily used for governmental services. &lt;a href="https://mijn.overheid.nl/"&gt;Mijn Overheid&lt;/a&gt;, which is a central government portal accessible to every Dutch resident, already interfaces with DigiD as the sole method of logging in. Reusing these existing services could have saved a lot of the work on a web app— not to mention reducing the bottlenecks inherent in a more manual process like a telephone hotline.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/20200704-06.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Source: &lt;a href="https://mijn.overheid.nl/"&gt;Mijn Overheid&lt;/a&gt;&lt;/em&gt;
‍&lt;/p&gt;
&lt;h2 id="testing-the-system-end-to-end"&gt;Testing the system end-to-end&lt;/h2&gt;
&lt;p&gt;We&amp;rsquo;ve identified a few ways to load test various components of the coronavirus hotline, both in its current incarnation as well as in hypothetical improved versions. Isolating each component and running load tests at that level can help us resolve performance issues inherent in the component. However, there are still bottlenecks that are only revealed when the integrations between components is tested as well. That&amp;rsquo;s where end-to-end testing comes in.&lt;/p&gt;
&lt;p&gt;For the coronavirus hotline, end-to-end testing means being able to run load tests on the entire process and seeing how data flows from one to the other: the call forwarding from the telephony server, the identity verification system, the appointment system, the database of personal information, the servers of every municipal clinic, and the email/text notifications with appointment details. As modern applications grow more complex, it can be tempting not to run end-to-end tests, but we do so at great risk of functional or nonfunctional issues.&lt;/p&gt;
&lt;p&gt;An area of end-to-end testing that is often overlooked is the human factor, which can also be a bottleneck. Had hotline operators been trained to ask early on in the call whether the caller wanted to make an appointment, to filter out unrelated calls? Can the coronavirus testing and test result processing, heavily involving manual work from medical professionals, match the stated requirements (test within 24 hours, result within 48 hours) even when the digital components are performant? Some people waited for an hour in the cities of &lt;a href="https://www.ed.nl/eindhoven/in-de-file-voor-een-stukje-zekerheid-meteen-drukte-bij-teststraat-voor-corona-in-eindhoven~a27eec83/"&gt;Eindhoven&lt;/a&gt; and &lt;a href="https://www.pzc.nl/zeeuws-nieuws/drukte-bij-teststraat-in-goes-na-openstellen-nummer-voor-coronatest~aa8a6cb2/"&gt;Goes&lt;/a&gt; due to traffic congestion from cars near the test centers, leading to delays in the testing schedule.&lt;/p&gt;
&lt;p&gt;While it can be difficult to load test these logistical systems with automated tools, they may have significant effects on the overall performance of an application and should be considered.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Often, performance issues can lead to a tangible loss in profits or a more intangible loss in reputation. In this case study, poor performance had a direct impact on people&amp;rsquo;s health. Potentially sick people were unable to make appointments to get tested, and later treated. Delayed tests could have led to an increased infection rate as people waited for a confirmed diagnosis. Hotline operators also admitted that slowness in the system led to them sometimes &lt;a href="https://wnl.tv/2020/06/08/chaos-bij-de-coronalijn-personeel-slaat-alarm/"&gt;giving out test results&lt;/a&gt; against instructions to wait for trained medical professionals to do so.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/20200704-07.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Human psychological factors can make a system more complex to load test. &lt;a href="https://www.trouw.nl/binnenland/de-balans-na-een-week-testen-het-plan-was-mooier-dan-de-praktijk~b86399b7/"&gt;According to Andrea Evers&lt;/a&gt; (LUCM), a health psychological professor, &amp;ldquo;&lt;em&gt;Door de uitbraak van corona zijn mensen in een langdurige stresssituatie beland. Onzekerheid, onvoorspelbaarheid en oncontroleerbaarheid maken dat ze de behoefte hebben om zaken juist wel te controleren of voorspelbaar te maken&lt;/em&gt; [The coronavirus outbreak has put people in a situation of chronic stress. The uncertainty, unpredictability, and helplessness of the situation cause a need to make things controllable or predictable].&amp;rdquo;&lt;/p&gt;
&lt;p&gt;As performance testers, we can use statistics and a systematic attitude combined with knowledge of human factors in applications to try to predict the unpredictable.&lt;/p&gt;</description></item><item><title>Ask a Flooder 20: How can fear affect application performance?</title><link>https://nicolevanderhoeven.com/blog/20200806-aaf20/</link><pubDate>Thu, 06 Aug 2020 22:43:28 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200806-aaf20/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/ask-a-flooder-20-how-can-fear-affect-application-performance-video"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/ask-a-flooder-20-how-can-fear-affect-application-performance-video"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In this video, I talk about the power of fear, and how it can end up affecting performance test results.
‍&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/oeEFCrTYULE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;Or listen to the audio version here:&lt;/p&gt;
&lt;iframe src="https://open.spotify.com/embed-podcast/episode/2cOfQrrUwyIKWbztgNdoXR" width="100%" height="232" frameborder="0" allowtransparency="true" allow="encrypted-media"&gt;&lt;/iframe&gt;
&lt;p&gt;Hi everyone, I&amp;rsquo;m Nicole van der Hoeven, back with another Ask a Flooder, and today I want to talk about the effect of fear on your performance outcomes.&lt;/p&gt;
&lt;h2 id="the-dutch-coronalijn"&gt;The Dutch &amp;ldquo;coronalijn&amp;rdquo;&lt;/h2&gt;
&lt;p&gt;I currently live in Maastricht, in the Netherlands. At the beginning of this global pandemic, the only people getting tested actively for COVID-19 were either people who presented with serious symptoms of the disease, or health care professionals who were continually exposed to the disease and therefore at a higher risk of contracting it.&lt;/p&gt;
&lt;p&gt;Last month, on June 1st, the Dutch government made testing available to everybody. They set up a telephone hotline that any Dutch resident could call to set an appointment to get tested for a COVID-19 test. A task force was dispatched to make sure that they could test up to 30.000 people per day. Yet on the first day of testing, only 1.146 people were tested. So what happened?&lt;/p&gt;
&lt;p&gt;Well, it turned out that the bottleneck of the entire process wasn&amp;rsquo;t getting enough tests, registering the tests, or even processing the test results. The bottleneck actually occurred way before that, when people called up the hotline to get an appointment.&lt;/p&gt;
&lt;p&gt;323.000 people called on the first day that the hotline opened. And not even all of them had called to make an appointment. Some of them were just calling for general information on the coronavirus despite the fact that the government made it clear that that&amp;rsquo;s not what the line was for, and that there were other lines dedicated to information. There were reports on Twitter of people waiting up to 6 hours on the line just to talk to someone who would make an appointment for them. There were calls that got dropped. People said that sometimes it happened in the middle of a call. Even telephone operators that the appointment system was down or slow and unusable for a lot of it.&lt;/p&gt;
&lt;p&gt;As a result, only 5,500 people actually had appointments booked on a day where there were 323,000 that called. That&amp;rsquo;s 1.70%.&lt;/p&gt;
&lt;h2 id="what-does-that-have-to-do-with-performance"&gt;What does that have to do with performance?&lt;/h2&gt;
&lt;p&gt;As performance engineers, we like to believe that everything we do is reasoned. We design tests based on quantitative data. We look at historical trends and metrics to help us decide how to build a workload model. But the truth is that that&amp;rsquo;s often not enough.&lt;/p&gt;
&lt;p&gt;If anything, this pandemic has shown us just how wrong our guesses can be, whether or not they&amp;rsquo;re informed by facts, especially when it has to do with human behavior. We&amp;rsquo;ve seen violent fights erupt over toilet paper. We&amp;rsquo;ve seen peaks and troughs on the stock market that didn&amp;rsquo;t have anything to do with the underlying companies. We&amp;rsquo;ve seen arson on 5G cell towers. Because human beings are irrational, and it&amp;rsquo;s really hard to capture that irrationality in our model for how users are going to behave.&lt;/p&gt;
&lt;p&gt;We may never be able to accurate predict how irrationality is going to affect the load on our application in production. But that doesn&amp;rsquo;t mean that we shouldn&amp;rsquo;t try. There are still things that we can do to mitigate the risk. I think that any application that is public-facing should be assessed for exposure to the risk of fear or other human psychological factors.&lt;/p&gt;
&lt;h2 id="how-do-we-account-for-fear-in-our-performance-testing"&gt;How do we account for fear in our performance testing?&lt;/h2&gt;
&lt;p&gt;I actually wrote a whole blog post on this particular situation (the Dutch corona line), and how it might have been possible to predict (maybe not with 100% accuracy but with reasonable accuracy) how many people would have called the hotline.&lt;/p&gt;
&lt;p&gt;For example, we can look at statistics like the of the Netherlands or how many people normally get flu-like symptoms or at least report them at this time of the year. These are statistics that are readily available from the Department of Health, and we could have used them to inform our decisions on the workload model for such an application. We may not have gotten it exactly, but we would have at least bin in the same ballpark.&lt;/p&gt;
&lt;p&gt;If we have a good enough idea about the workload that our application would have to handle when it&amp;rsquo;s influenced by fear, we can start running load tests around that. Another good open-ended kind of test to run, especially for applications that are particularly susceptible to fear, is the stress test. In a stress test, you push your application to its limits and you find out what they are. You could, for instance, start with your peak work load, and then add a certain number of users every 30 minutes and see how much your application can actually handle. You can do the same with soak tests, where you&amp;rsquo;re exposing your application to the same amount of load for an extended period of time. Both of those kind of exploratory tests help you define the limits of your application and how it would respond if fear plays a role in the workload model in production.&lt;/p&gt;
&lt;p&gt;If we overlook this critical human element in our test design, then we leave ourselves, and our applications, vulnerable to performance degradation and, perhaps, outages.&lt;/p&gt;
&lt;p&gt;Till next time, happy flooding!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Read &lt;a href="https://nicolevanderhoeven.com/blog/20200813-dutch-coronavirus-hotline/"&gt;this blog post&lt;/a&gt; for more about the coronavirus hotline.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Ask a Flooder 18: How do I load test video streaming with JMeter?</title><link>https://nicolevanderhoeven.com/blog/20200722-aaf18/</link><pubDate>Wed, 22 Jul 2020 22:49:15 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200722-aaf18/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/ask-a-flooder-18-how-do-i-load-test-video-streaming-with-jmeter-video"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/ask-a-flooder-18-how-do-i-load-test-video-streaming-with-jmeter-video"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In this video, I answer the question: &amp;ldquo;How do I load test video streaming with JMeter?&amp;rdquo;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Q00briuogto?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;Or listen to the audio version here:&lt;/p&gt;
&lt;iframe src="https://open.spotify.com/embed-podcast/episode/69F5lmOeFfEJr6ZgVWFGOu" width="100%" height="232" frameborder="0" allowtransparency="true" allow="encrypted-media"&gt;&lt;/iframe&gt;
&lt;h2 id="http-live-streaming-hls-and-performance"&gt;HTTP Live Streaming (HLS) and performance&lt;/h2&gt;
&lt;p&gt;One of the most popular protocols for video streaming is &lt;a href="https://developer.apple.com/streaming/examples/"&gt;HTTP Live Streaming&lt;/a&gt;, or HLS, and that&amp;rsquo;s what I&amp;rsquo;m going to show you today. An HLS video ends with the [file extension .m3u8‍](&lt;a href="https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_4x3/bipbop_4x3_variant.m3u8%5D(https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_4x3/bipbop_4x3_variant.m3u8)"&gt;https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_4x3/bipbop_4x3_variant.m3u8](https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_4x3/bipbop_4x3_variant.m3u8)&lt;/a&gt;. According to the HLS protocol, when a video is streamed, the first request sent must be a manifest. A manifest is sometimes called a playlist, and it is a list of all the chunks or parts that make up the video. Then, each chunk is downloaded.&lt;/p&gt;
&lt;p&gt;To assess the performance of a video stream, we still want the response time of the manifest, the chunks, and the whole video. However, there are many more metrics that are important in video streaming which aren&amp;rsquo;t captured by just the response time. For example, how do you determine whether a video was played smoothly or if it stopped to buffer? A video that keeps pausing might just drive a user away, and it&amp;rsquo;s difficult to tell whether that is happening just from the response time.&lt;/p&gt;
&lt;h2 id="how-to-load-test-video-streaming-with-jmeter"&gt;How to load test video streaming with JMeter&lt;/h2&gt;
&lt;h3 id="downloading-and-installing-the-ubik-video-streaming-plugin"&gt;Downloading and installing the Ubik Video Streaming plugin&lt;/h3&gt;
&lt;p&gt;Luckily, there&amp;rsquo;s a plugin for that, created by a company called Ubik Ingénierie. The &lt;a href="https://ubikloadpack.com/"&gt;Ubik Load Pack&lt;/a&gt; is a set of enterprise-grade plugins for JMeter. One of those plugins is a &lt;a href="https://ubikloadpack.com/video-streaming-performance.php"&gt;Video Streaming Plugin&lt;/a&gt;, and it happens to be a really easy way to get started with video streaming. This is a paid plugin, but you can &lt;a href="https://ubikloadpack.com/video-streaming-performance.php#formulaire"&gt;sign up for a free 11-day trial&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Once you do that, you&amp;rsquo;ll get an email from Ubik with a link to download the bundle. Go to lib/ext and then copy this .jar file into the same directory on your JMeter installation. Start up JMeter, and it&amp;rsquo;ll ask you for the license file. Browse to the license file in the bundle you downloaded. JMeter will restart.&lt;/p&gt;
&lt;h3 id="using-the-jmeter-plugin-in-your-load-testing-script"&gt;Using the JMeter plugin in your load testing script&lt;/h3&gt;
&lt;p&gt;Now let&amp;rsquo;s start creating the Test Plan. Create a Thread group, and then right click on the thread group, go to Add &amp;gt; Sampler and then select the &amp;ldquo;ULP Video Streaming sampler&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Click on the sampler and then paste in the URL to the HLS file that you&amp;rsquo;d like to test. This should end in a .m3u8. This plugin supports several protocols for video streaming, but we can just leave it at auto and it&amp;rsquo;ll automatically detect which one it is.&lt;/p&gt;
&lt;p&gt;In Play Options, you can choose whether to play the entire video or just a part of it, or even whether you want to include the video subtitles in your test.&lt;/p&gt;
&lt;p&gt;This Network Options panel is fantastic because it allows you to limit your network speed. Slow networks, like mobile networks, really affect user experience, so it&amp;rsquo;s really important to take this into account when running load tests. You might even use a parameter here and do something like throttle to 3G speeds for 80% of your traffic, and leave it on Auto 20% of the time. But I&amp;rsquo;ll just leave this blank for now.&lt;/p&gt;
&lt;p&gt;Next, let&amp;rsquo;s add a View Results Tree listener. Then, let&amp;rsquo;s run the script once, just to see if it works.&lt;/p&gt;
&lt;p&gt;As you can see, we can see the manifest retrieved first, and then all the chunks. We didn&amp;rsquo;t get any errors, so let&amp;rsquo;s run this as a load test. We can disable this listener because it just consumes extra resources on our load generator.&lt;/p&gt;
&lt;h3 id="ramping-up-your-load-test-on-flood"&gt;Ramping up your load test on Flood&lt;/h3&gt;
&lt;p&gt;To ramp this up into a load test, we&amp;rsquo;ll have to go into Thread Group and change these settings. Ideally, we want to be able to change these values from the Flood UI later so we don&amp;rsquo;t have to go into the script whenever we change them, so I&amp;rsquo;ll type in these Flood-specific properties. I&amp;rsquo;ll leave a link in the description about these properties. I&amp;rsquo;ll also set it to run Forever so that we can change the duration and the video will just keep playing to fill that duration.&lt;/p&gt;
&lt;p&gt;To capture some of Ubik&amp;rsquo;s cool metrics, let&amp;rsquo;s add a Simple Data Writer listener here and write the results to a CSV file. On Flood, all flood results are stored on /data/flood/results, so we&amp;rsquo;ll add an output.csv file in that directory that we can download after the test.&lt;/p&gt;
&lt;p&gt;So that&amp;rsquo;s our script! Now we&amp;rsquo;ll have to include the plugin and related files so that Flood can access them as well.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s go back to the bundle we downloaded and go to the bin folder to look for &lt;a href="http://user.properties/"&gt;user.properties&lt;/a&gt;. Let&amp;rsquo;s open that up, and we&amp;rsquo;ll change the license path to &lt;code&gt;/data/flood/files&lt;/code&gt;, which is the directory that Flood saves files we upload to. To preserve this directory structure, we&amp;rsquo;ll compress just the lib and bin folders.&lt;/p&gt;
&lt;p&gt;On Flood, we&amp;rsquo;ll start a new stream here and upload three things: the jmx script, the license, and the compressed archive of the lib and bin folders from the bundle.&lt;/p&gt;
&lt;p&gt;Then we&amp;rsquo;ll go through the rest of the process here, setting the test parameters. Time to launch the test!&lt;/p&gt;
&lt;h3 id="analyzing-video-streaming-load-test-results"&gt;Analyzing video streaming load test results&lt;/h3&gt;
&lt;p&gt;Flood shows you results of your load test while it&amp;rsquo;s running as well as after the test. You can see metrics like concurrency, network throughput, transaction rate, and response time for the test. You can also see these metrics for each individual transaction, including the video or sampler as a whole, the manifest, and the chunks.&lt;/p&gt;
&lt;p&gt;To see the CSV that our script generated, we can download the Archived Results from a flood.&lt;/p&gt;
&lt;p&gt;In JMeter, click on Tools &amp;gt; Generate Report and fill in the fields, selecting the output.csv from the flood&amp;rsquo;s Archived Results, JMeter&amp;rsquo;s &lt;a href="http://user.properties"&gt;user.properties&lt;/a&gt; file, and then an output directory for the report.&lt;/p&gt;
&lt;p&gt;Ubik&amp;rsquo;s plugin creates a few custom graphs in the HTML report:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Buffer fill in Millis&lt;/li&gt;
&lt;li&gt;Lag ratio in percentage&lt;/li&gt;
&lt;li&gt;Lag ratio without buffer fill in percentage&lt;/li&gt;
&lt;li&gt;Lag time in Millis&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Using Ubik&amp;rsquo;s Video Streaming plugin is an easy and thorough way to load test video streaming with JMeter, and I highly recommend it. I used an HLS video to demonstrate it, but this plugin supports several protocols:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HLS&lt;/li&gt;
&lt;li&gt;Mpeg DASH&lt;/li&gt;
&lt;li&gt;Smooth&lt;/li&gt;
&lt;li&gt;Adobe HDS&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information, read Ubik&amp;rsquo;s tutorial on how to use their plugin with Flood &lt;a href="https://www.flood.io/blog/running-a-video-streaming-performance-test-using-flood-io-and-ubikloadpack"&gt;here&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Performance Testing FOMO</title><link>https://nicolevanderhoeven.com/blog/20200722-performance-testing-fomo/</link><pubDate>Wed, 22 Jul 2020 21:30:43 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200722-performance-testing-fomo/</guid><description>&lt;p&gt;On this episode of the &lt;a href="https://testguild.com/"&gt;TestGuild performance podcast&lt;/a&gt;, Joe Colantonio interviews me about how human factors are often not taken into consideration when designing load tests&amp;ndash; a mistake that can have serious consequences.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/M5l9Ba0ykpw?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Here&amp;rsquo;s the plain audio version:&lt;/p&gt;
&lt;iframe style="border: none" src="//html5-player.libsyn.com/embed/episode/id/15312620/height/90/theme/custom/thumbnail/yes/direction/backward/render-playlist/no/custom-color/87A93A/" height="90" width="100%" scrolling="no" allowfullscreen webkitallowfullscreen mozallowfullscreen oallowfullscreen msallowfullscreen&gt;&lt;/iframe&gt;</description></item><item><title>Performanceverbeteringen voor de coronalijn: de kracht van angst</title><link>https://nicolevanderhoeven.com/blog/20200704-performanceverbeteringen-voor-de-coronalijn/</link><pubDate>Sat, 04 Jul 2020 21:35:43 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200704-performanceverbeteringen-voor-de-coronalijn/</guid><description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://medium.com/@n_vanderhoeven/performanceverbeteringen-voor-de-coronalijn-de-kracht-van-angst-8c3713a3b7e0"&gt;Medium&lt;/a&gt;. English version &lt;a href="https://www.flood.io/blog/performance-testing-the-story-of-the-dutch-co2020ronavirus-hotline"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Op 1 juni heeft de landelijke GGD Ghor aangekondigd dat iedereen met klachten een coronatest zou kunnen aanvragen door de afsprakenlijn (0800–1202) te bellen. De belofte: vandaag het telefoongesprek, morgen de coronatest en over twee dagen de uitslag. Echter was het in werkelijkheid niet zo makkelijk. Op de eerste dag was er chaos en veel Nederlanders meldden verbindingsproblemen vanwege drukte op de overbelaste systemen.&lt;/p&gt;
&lt;p&gt;Dit had voorkomen kunnen worden door een beter begrip te hebben over de manier waarop de menselijke psychologie de performance van een systeem kan beïnvloeden.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200704-01.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Bron: &lt;a href="https://twitter.com/GGDGHORNL/status/1267351996379643906"&gt;@ggdghornl&lt;/a&gt;, Twitter&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="de-situatie"&gt;De situatie&lt;/h2&gt;
&lt;p&gt;“Voor die 30.000 tests per dag zijn we nu eindelijk klaar”, &lt;a href="https://nos.nl/collectie/13824/artikel/2335758-ggd-en-klaar-voor-massaal-testen-tijd-van-limiterende-factoren-voorbij"&gt;zei arts Ann Vossen&lt;/a&gt; op 31 mei. Dit aantal verwijst naar de &lt;a href="https://nos.nl/artikel/2335790-drukte-op-nieuw-telefoonnummer-voor-coronatests-0800-1202.html"&gt;landelijke capaciteit&lt;/a&gt; van alle GGD’s. In plaats daarvan werden volgens het AD maar 1146 mensen getest en, misschien belangrijker, een kleine 5478 afspraken gemaakt. De situatie werd erger gemaakt door de &lt;a href="https://www.ad.nl/binnenland/liefst-323-000-telefoontjes-naar-nieuw-nummer-voor-coronatest-systemen-overbelast~a16a9a50/"&gt;323.000 mensen&lt;/a&gt; die de afspraaklijn op de eerste dag hebben gebeld. Sommige medewerkers konden zelfs &lt;a href="https://www.volkskrant.nl/nieuws-achtergrond/coronatestnummer-kampt-met-kinderziektes-maar-ggd-s-kunnen-de-drukte-goed-aan~b2f332d2/"&gt;niet in de systemen inloggen&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Op Twitter vertelden gebruikers enkele horrorverhalen: één beweerde &lt;a href="https://twitter.com/Ed_van_Iterson/status/1267429180347691011"&gt;6 uur lang te hebben gewacht&lt;/a&gt;, alleen om een melding te horen dat het systeem geen afspraken kon aanmaken; een andere klaagde over &lt;a href="https://twitter.com/maticus_spazz/status/1267374692941418496"&gt;verbroken verbindingen&lt;/a&gt;, zelfs toen een medewerker al had geantwoord, en nog een andere &lt;a href="https://twitter.com/leovanlinden/status/1267408142813605888"&gt;een video had gepost&lt;/a&gt; van een gesprek dat beëindigd was zonder melding. Ik heb zelf ook de &lt;a href="https://twitter.com/n_vanderhoeven/status/1271054286483533825"&gt;coronalijn gebeld&lt;/a&gt;, en nieuwe problemen gevonden.&lt;/p&gt;
&lt;p&gt;Gelukkig was de tweede dag beter: er waren 11 duizend afspraken gemaakt, mede vanwege het lagere aantal telefoontjes en mede vanwege verholpen technische problemen. In de eerste week nam het aantal geteste mensen toe naar 50.000 (gemiddeld 7142 per dag), wat toch nog veel lager zat dan verwacht. Er zijn wat lessen die we kunnen trekken uit dit verhaal.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200704-02.jpeg" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Bron: &lt;a href="https://ggdhm.nl/thema-s/item/infectieziekten/testbeleid"&gt;GGD Hollands Midden&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="het-gevolgen-van-angst-op-performance"&gt;Het gevolgen van angst op performance&lt;/h2&gt;
&lt;p&gt;Dit virus heeft ons al een kant van de mensheid getoond die we liever niet willen zien: &lt;a href="https://www.bbc.com/news/world-australia-51731422"&gt;vechten over wc-papier&lt;/a&gt;, &lt;a href="https://snacks.robinhood.com/newsletters/rMxwcb7y7lMZoI5NY6qf7/"&gt;chaos op de beurs&lt;/a&gt;, en &lt;a href="https://www.volkskrant.nl/nieuws-achtergrond/nctv-waarschuwt-voor-extremistische-protestacties-door-5g-tegenstanders-die-vrezen-voor-coronavirus~bf1400b8/"&gt;sabotage van zendmasten&lt;/a&gt;. Hoewel we rationeel willen zijn, is het onmogelijk te zeggen dat dat altijd het geval is. In werkelijkheid hebben we allemaal de neiging gekke dingen te doen. Vooral als we angst hebben.&lt;/p&gt;
&lt;p&gt;Geen wonder dan dat de afspraaklijn zo welkom was. 323.000 telefoontjes werden er op de eerste dag verwerkt, wat bijzonder is als we bedenken dat het grootste deel van Nederland in zelfisolatie was, en dus maar een kleine kans had om het coronavirus opgelopen te hebben. In theorie lijkt dit gedrag irrationeel, maar niet onvoorspelbaar.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200704-03.jpeg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;In het Engels heet het &lt;strong&gt;FOMO&lt;/strong&gt;: Fear Of Missing Out. We hebben al &lt;a href="https://www.flood.io/blog/fomo-and-performance-testing-why-robinhood-went-down"&gt;duidelijk gezien&lt;/a&gt; hoe FOMO veel meer gebruikers naar een applicatie kan dwingen, met als gevolg bijwerkingen op de performance. Mensen hadden angst dat er niet genoeg coronatesten waren en wilden de eersten in de rij zijn voordat de voorraad helemaal op was.&lt;/p&gt;
&lt;p&gt;Ook was er het probleem dat &lt;a href="https://www.trouw.nl/binnenland/de-balans-na-een-week-testen-het-plan-was-mooier-dan-de-praktijk~b86399b7/"&gt;één op de vier telefoontjes niet over een afspraak ging&lt;/a&gt;, maar over algemene informatie over COVID-19. Dit werd verergerd door het feit dat de eerste dag van de coronalijn ook Tweede Pinksterdag was. Het teveel aan telefoontjes over andere zaken dan de coronatest was een bijkomende factor in de systeemoverbelasting.&lt;/p&gt;
&lt;p&gt;Wat hadden we kunnen doen om dit systeem te verbeteren?&lt;/p&gt;
&lt;h2 id="verbeteringen"&gt;Verbeteringen&lt;/h2&gt;
&lt;h3 id="beter-inschatten"&gt;Beter inschatten&lt;/h3&gt;
&lt;p&gt;Hoewel het moeilijk is om de gevolgen van FOMO precies te kennen, kunnen we het wel inschatten. &lt;a href="https://www.zwollenu.nl/500-000-tot-700-000-nederlanders-besmet-met-coronavirus/"&gt;Volgens RIVM-hoofd Jaap van Dissel&lt;/a&gt;, waren er begin mei tot 700.000 mensen in Nederland besmet met het coronavirus, een paar weken voor de coronalijn werd opgestart. Waarom was het dan een verrassing dat meer dan 300.000 mensen hadden gebeld? Ook zijn de cijfers van niet-COVID-gerelateerde klachten daar nog niet bij inbegrepen.&lt;/p&gt;
&lt;p&gt;Zelfs als we inschatten dat &lt;a href="https://www.who.int/docs/default-source/coronaviruse/situation-reports/20200306-sitrep-46-covid-19.pdf?sfvrsn=96b04adf_4"&gt;20% van die 700.000 mensen geen klachten had&lt;/a&gt;, komen we toch op een voorspelling van 140.000 telefoontjes uit, wat nog &lt;strong&gt;25 keer&lt;/strong&gt; meer is dan het werkelijke aantal gemaakte afspraken op de eerste dag.&lt;/p&gt;
&lt;p&gt;Zodra wij aantallen hebben, kunnen we testen.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200704-04.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Uit mijn eigen ervaring, toen ik het coronanummer belde, blijkt dat er een telefonieserver was die de oproepen heeft doorgeschakeld naar verschillende medewerkers (die thuis werkten). In deze stap konden loadtesten worden uitgevoerd om zeker te weten hoeveel gesprekken deze server aankon, en dat het snel genoeg was om geen of weinig message queueing te hebben.&lt;/p&gt;
&lt;p&gt;Medewerkers hebben dan vermoedelijk gegevens direct in een afsprakensysteem ingevoerd tijdens de oproep, waarop de gegevens waarschijnlijk naar een backend server en database gingen. Ook hier kunnen we testen via een load testing tool op protocol niveau, zoals JMeter.&lt;/p&gt;
&lt;p&gt;Met zo’n publieke startdatum zou ik spike testen hebben gevoerd met tot 700.000 gebruikers (misschien nog meer, als ik wat tijd had). In een spike test simuleren we een snelle toename van gebruikers op een kort tijdstip, bijvoorbeeld 1 tot 700.000 gebruikers in 10 minuten. Ook zouden soak testen heel nuttig zijn geweest, vooral omdat de coronalijn van 08.00 tot 20.00 was geopend, dus een stroom van 12 uur. In een soak test voeren we een constante aantal gebruikers voor een langere periode op.&lt;/p&gt;
&lt;h3 id="automatisering-gebruiken"&gt;Automatisering gebruiken&lt;/h3&gt;
&lt;p&gt;Het maken van een afspraak voor de coronatest had veel stappen. Eerst moesten mensen hun BSN en andere details aan de medewerkers geven. Dan moesten medewerkers vragen naar hun klachten. Alleen met de &lt;a href="https://www.zwollenu.nl/500-000-tot-700-000-nederlanders-besmet-met-coronavirus/"&gt;belangrijkste klachten&lt;/a&gt; die passen bij het coronavirus konden mensen verdergaan. Uiteindelijk moesten medewerkers adressen controleren en het dichtstbijzijnde testcentrum vinden om de afspraak te maken.&lt;/p&gt;
&lt;p&gt;Telefoniesystemen gebruiken soms Interactive Voice Response (IVR) technologie, een systeem van menu’s en keuzen. We hebben dit allemaal gebruikt: “Voor het Nederlands, toets 1. Voor het Engels, toets 2…” Zo’n systeem had het aantal niet afspraak-gerelateerde gesprekken kunnen verlagen met 25% (één op vier klanten belden niet voor een afspraak), en op een geautomatiseerde manier.&lt;/p&gt;
&lt;p&gt;Hier is een voorbeeld van een IVR-systeem:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200704-05.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Bron: &lt;a href="http://vanguardnetworks.com.sg/IVR.html"&gt;Vanguard Networks&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Op het niveau van het IVR-systeem kan het wel moeilijk zijn om load te simuleren. &lt;a href="https://www.empirix.com/products/hammer/"&gt;Empirix Hammer&lt;/a&gt; and &lt;a href="https://cyara.com/genesys-cloud/"&gt;Cyara&lt;/a&gt; zijn twee zeer gespecialiseerde tools die dit kunnen doen.&lt;/p&gt;
&lt;p&gt;Nog een optie voor de implementatie van een afsprakensysteem is een web app, met verplichte velden voor BSN, adressen, enz, en met een verbinding met DigiD, een identiteitsverificatiesysteem. &lt;a href="https://mijn.overheid.nl/"&gt;Mijn Overheid&lt;/a&gt; bestaat al, en ook met DigiD integratie. Er had een soort van beveiligde formulier kunnen worden gebruikt om klantengegevens snel op te nemen.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200704-06.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Bron: &lt;a href="https://mijn.overheid.nl/"&gt;Mijn Overheid&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="end-to-end-testing-uitvoeren"&gt;End-to-end testing uitvoeren&lt;/h3&gt;
&lt;p&gt;Vaak spreken we over de performance van één applicatieserver, maar in praktijk zijn er meerdere componenten. Als best practice is het goed om de performance van elk onderdeel van het hele systeem te testen, en dan ook de hele keten.&lt;/p&gt;
&lt;p&gt;Voor een afsprakenlijn zou het redelijk zijn geweest om het hele proces te testen: het oproepdoorschakelingssysteem, het afspraaksysteem, de database met gegevens en datums, de servers van elke GGD in het land, en het sturen van email en SMS-berichten met afspraak datums. Het is belangrijk om te weten of alle componenten snel samen kunnen werken.&lt;/p&gt;
&lt;p&gt;Ook is er de performance van niet-computer onderdelen. De menselijke component kan ook een bottleneck zijn. Wisten de medewerkers hoe snel ze moesten vragen of een klant een afspraak wilde maken? Kunnen de testen worden uitgevoerd en de uitslagen worden gegeven, zelfs met een snelstromend afspraaksysteem? Het teveel aan afspraken toegewezen aan GGD’s kan ook files veroorzaken (zoals in &lt;a href="https://www.ed.nl/eindhoven/in-de-file-voor-een-stukje-zekerheid-meteen-drukte-bij-teststraat-voor-corona-in-eindhoven~a27eec83/"&gt;Eindhoven&lt;/a&gt; en &lt;a href="https://www.pzc.nl/zeeuws-nieuws/drukte-bij-teststraat-in-goes-na-openstellen-nummer-voor-coronatest~aa8a6cb2/"&gt;Goes&lt;/a&gt;).&lt;/p&gt;
&lt;h2 id="conclusie"&gt;Conclusie&lt;/h2&gt;
&lt;p&gt;In dit geval had slechte performance een invloed niet op de winst maar op de gezondheid. Zieke personen die klachten hadden, konden niet allemaal een afspraak maken om getest te worden. Hoeveel andere mensen hadden ze inmiddels besmet? Slechte performance heeft medewerkers ook gedwongen om soms uitslagen te geven “&lt;a href="https://wnl.tv/2020/06/08/chaos-bij-de-coronalijn-personeel-slaat-alarm/"&gt;in verdekte termen&lt;/a&gt;”, wat tot een privacyschending kan leiden.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200704-07.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;De menselijke component kan een systeem lastiger maken om te testen. Aldus &lt;a href="https://www.trouw.nl/binnenland/de-balans-na-een-week-testen-het-plan-was-mooier-dan-de-praktijk~b86399b7/"&gt;Andrea Evers (LUMC)&lt;/a&gt;, hoogleraar gezondheidspsychologie:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Door de uitbraak van corona zijn mensen in een langdurige stresssituatie beland. Onzekerheid, onvoorspelbaarheid en oncontroleerbaarheid maken dat ze de behoefte hebben om zaken juist wel te controleren of voorspelbaar te maken.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Als performancetesters kunnen we statistieken en een systematische aanpak combineren met kennis van de menselijke factoren om te plannen voor het onvoorspelbare.&lt;/p&gt;</description></item><item><title>Entrevista con Señor Performo en PerfBytes Español</title><link>https://nicolevanderhoeven.com/blog/20200622-entrevista-con-senor-performo/</link><pubDate>Mon, 22 Jun 2020 21:56:02 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200622-entrevista-con-senor-performo/</guid><description>&lt;p&gt;Aquí está una entrevista que he hecho con Leando Melendez (Señor Performo) en su podcast, PerfBytes Español. Hablamos de performance testing, mis idiomas, y mis consejos para mujeres que quieren entrar en el mundo de tecnología.&lt;/p&gt;
&lt;a class="spreaker-player" href="https://www.spreaker.com/user/perfbytes/perfbytesesp-s02e04-entrevistanicole" data-resource="episode_id=31696383" data-theme="light" data-autoplay="false" data-playlist="false" data-cover="https://d3wo5wojvuv7l.cloudfront.net/images.spreaker.com/original/2aed331516599f75dd433a42006da511.jpg" data-width="100%" data-height="400px"&gt;Listen to "Entrevista Nicole van der Hoeven" on Spreaker.&lt;/a&gt;&lt;script async src="https://widget.spreaker.com/widgets.js"&gt;&lt;/script&gt;</description></item><item><title>Ask a Flooder 17: How do I use unique test data on Element?</title><link>https://nicolevanderhoeven.com/blog/20200618-aaf17/</link><pubDate>Thu, 18 Jun 2020 21:58:49 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200618-aaf17/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/ask-a-flooder-17-how-do-i-use-unique-test-data-on-element"&gt;
&lt;p&gt;&lt;em&gt;Originally posted on &lt;a href="https://www.flood.io/blog/ask-a-flooder-17-how-do-i-use-unique-test-data-on-element"&gt;Tricentis Flood&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In this video, I talk about how to ensure that Flood Element uses unique test data, using the example of a customer wanting to script unique logins for his application.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/qVpX7MX3jxE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Or listen to the audio version instead:&lt;/p&gt;
&lt;iframe src="https://open.spotify.com/embed-podcast/episode/7k5TXtoHnswJwBbKHXgJR7" width="100%" height="232" frameborder="0" allowtransparency="true" allow="encrypted-media"&gt;&lt;/iframe&gt;
&lt;h2 id="transcript"&gt;Transcript:&lt;/h2&gt;
&lt;p&gt;Hi everyone, Nicole van der Hoeven here again back with another Ask a Flooder, and this week&amp;rsquo;s question is a follow-up question from last week. That user had previously asked about test data in Flood Element. This week he&amp;rsquo;s asking: &amp;ldquo;How do I ensure that Flood Element uses unique test data?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;So this user is actually trying to script a login for an application. He has a list of usernames and corresponding passwords that he wants to use. He&amp;rsquo;s already set both of these up in a CSV file, and he&amp;rsquo;s also set up the Element script in the same way that I outline in my previous video. However, this user is seeing errors in the test due to the application not allowing a given user account to be used simultaneously in two or more devices. The problem is that the way that he&amp;rsquo;s set it up is that he has Element running on multiple nodes, and each node has the chance to pick the same user account.&lt;/p&gt;
&lt;p&gt;So how do you make sure that it&amp;rsquo;s a unique 1:1 ratio for an instance of Element and a user account in the CSV file? If you haven&amp;rsquo;t already watched the previous week&amp;rsquo;s video, you should pause this, watch that, and then come back here, so it makes a little more sense because the script that I&amp;rsquo;m using is building on what we already did in the previous week.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s talk about the differences between this script and the previous week&amp;rsquo;s.&lt;/p&gt;
&lt;p&gt;First, I&amp;rsquo;m declaring a global variable here called &lt;code&gt;globalBrowserID&lt;/code&gt;. The idea is to create a unique and globally identifiable string that I can attach to every account in the CSV file.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;globalBrowserID&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ENV&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;FLOOD_GRID_INDEX&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;_&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ENV&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;FLOOD_GRID_NODE_SEQUENCE_ID&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;_&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ENV&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;BROWSER_ID&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;toString&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The global browser ID consists of three parts:- The first is a grid index, which is a number assigned to every grid, and it&amp;rsquo;s also globally unique. So if there are three grids being used in the test, then the grid indexes would be 0, 1, and 2.- The second one is a grid node sequence ID, and this is unique within the grid. The node sequence ID is a number that is assigned to every node in a single grid.- The last one is a browser ID. The browser ID is a number assigned to an instance of Element running on a single node.&lt;/p&gt;
&lt;p&gt;These are all zero-based, so the very first instance of Element running on the very first node and on the very first grid in the entire test would be &lt;code&gt;0_0_0&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re going to have to modify our CSV file to make use of this browser ID. So whereas the user previously had username and password, I&amp;rsquo;ve added an ID column. From then, these will have to be sequential. So &lt;code&gt;0_0_0&lt;/code&gt;, &lt;code&gt;0_0_1...&lt;/code&gt; And &lt;code&gt;0_0_1&lt;/code&gt; would be the second instance of Element running still on the first node, on the first grid. And you can make as many of these as you need.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;id,username,password
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0_0_0,user1,password1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0_0_1,user2,password2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0_0_2,user3,password3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;1_0_0,user4,password4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;1_0_1,user5,password5
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I&amp;rsquo;ve also modified the interface &lt;code&gt;UserData&lt;/code&gt; to describe the fields in the CSV file. So there&amp;rsquo;s &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;username&lt;/code&gt;, and &lt;code&gt;password&lt;/code&gt;, and I&amp;rsquo;ve defined them all as strings.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;TestData&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;fromCSV&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;UserData&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;users_multiplegrids.csv&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;((&lt;span style="color:#a6e22e"&gt;line&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;index&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;browserID&lt;/span&gt;) =&amp;gt; &lt;span style="color:#a6e22e"&gt;line&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;id&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;globalBrowserID&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;circular&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This line is telling Element to take this data file with this filename and filter it based on the line, the index, and the browserID such that &lt;code&gt;id&lt;/code&gt; is equal to the browser ID. So what happens here is that Element will take the global browser ID, which let&amp;rsquo;s say is &lt;code&gt;0_0_0&lt;/code&gt; for the very first one. It&amp;rsquo;ll then take that &lt;code&gt;0_0_0&lt;/code&gt; and look at the CSV file for anything in the ID field that has the value &lt;code&gt;0_0_0&lt;/code&gt;. And then it will continue to use the rest of that line.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve also made the CSV file circular just because that&amp;rsquo;s always a good practice to get into.&lt;/p&gt;
&lt;p&gt;And as always, I think it&amp;rsquo;s a great idea to debug this, especially when you&amp;rsquo;re dealing with multiple grids and multiple nodes on that grid.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;step&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;Print to console&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;async&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Browser&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;data&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;UserData&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;global browser ID: &amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;globalBrowserID&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;| user: &amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;`&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;data&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;username&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39; | password: &amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;`&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;data&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;password&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;)    
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I&amp;rsquo;ve also added the username and password here, just in case we need to verify the state that that user is in.&lt;/p&gt;
&lt;p&gt;So let&amp;rsquo;s run the test. Since we&amp;rsquo;re just running this locally, we&amp;rsquo;ll see that the first value indeed is &lt;code&gt;0_0_0&lt;/code&gt;, and the user we&amp;rsquo;re selecting is &lt;code&gt;user1&lt;/code&gt; and &lt;code&gt;password1&lt;/code&gt;, which lines up with the username and password values corresponding to &lt;code&gt;0_0_0&lt;/code&gt; in the CSV file.&lt;/p&gt;
&lt;p&gt;I hope that helped, and until next time, happy flooding!&lt;/p&gt;
&lt;p&gt;Download the &lt;a href="https://github.com/flood-io/load-testing-playground/blob/master/element/test-data/example.ts"&gt;full script&lt;/a&gt; and the &lt;a href="https://github.com/flood-io/load-testing-playground/blob/master/element/test-data/users.csv"&gt;data file&lt;/a&gt; to follow along.&lt;/p&gt;</description></item><item><title>Ask a Flooder 16: How do I use test data with Element?</title><link>https://nicolevanderhoeven.com/blog/20200609-aaf16/</link><pubDate>Tue, 09 Jun 2020 22:18:41 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200609-aaf16/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/ask-a-flooder-16-how-do-i-use-test-data-with-element-video"&gt;
&lt;p&gt;&lt;em&gt;Originally posted on &lt;a href="https://www.flood.io/blog/ask-a-flooder-16-how-do-i-use-test-data-with-element-video"&gt;Tricentis Flood&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In this video, I discuss how to make your load testing scripts more realistic by including test data. The load testing tool I use is &lt;a href="https://element.flood.io/"&gt;Flood Element&lt;/a&gt;, but you can apply these principles to any tool. You&amp;rsquo;ll find a copy of the Element script I used below.&lt;/p&gt;
&lt;p&gt;‍&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/EGhVm-R12qI?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;And, if you prefer, here&amp;rsquo;s the audio version:&lt;/p&gt;
&lt;iframe src="https://open.spotify.com/embed-podcast/episode/4OW5slSCmAuBc9NPa1NKtk" width="100%" height="232" frameborder="0" allowtransparency="true" allow="encrypted-media"&gt;&lt;/iframe&gt;
&lt;h2 id="transcript"&gt;Transcript&lt;/h2&gt;
&lt;p&gt;Hi everyone, Nicole van der Hoeven here back with another Ask a Flooder, and this time the question is: How do I use test data with Flood Element?&lt;/p&gt;
&lt;p&gt;Now let&amp;rsquo;s talk about why you might want to use test data. In load testing, it&amp;rsquo;s important to make your scripts behave as similarly to real users as possible so that the load that you generate is production-like. The problem is that if you send the same data over and over again to the server, that server is probably going to cache that response. The response being cached means that the server will return the response way faster than it normally would if it had been a unique request. So we can use test data, instead of static data hardcoded in your scripts, to make sure that this doesn&amp;rsquo;t happen.&lt;/p&gt;
&lt;p&gt;Using test data can also help us test different responses. For example, let&amp;rsquo;s say we&amp;rsquo;re testing a loan application system, where a user inputs the application ID, the server looks it up, and returns the status of that loan application. Now, loan applications might be in different stages of the process. For instance, some might be saved but not submitted, or maybe they&amp;rsquo;ve been submitted but failed the identity verification check.&lt;/p&gt;
&lt;p&gt;If we used the same application ID every time, then the server would always return the same status and the same details. Instead, let&amp;rsquo;s create a CSV file that we can use as test data. It might look something like this.‍&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;applicationId
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;A100001
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;B100002
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;C100003
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;D100004
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We can have &lt;code&gt;applicationId&lt;/code&gt; as the single header here, and we can populate this with a list of different application IDs in different stages of the process. That way, when we run the script, the server will have to respond authentically to every request without it being cached.&lt;/p&gt;
&lt;p&gt;Now to create our script. This is an empty Element script. To start with, make sure you&amp;rsquo;re importing &lt;code&gt;TestData&lt;/code&gt; here in the first line of your script.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;step&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;TestSettings&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;Until&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;By&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;Browser&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;TestData&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;@flood/element&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The first thing we&amp;rsquo;re going to need to do is to create an interface for the CSV file. Let&amp;rsquo;s call it &lt;code&gt;AppData&lt;/code&gt;. Within this interface, we&amp;rsquo;ll need to define all the fields that we intend to use in our data file and what type of values we can expect to be in those fields. Looking at our CSV here, we&amp;rsquo;ve just got the application ID, so I&amp;rsquo;m just going to copy that, and it&amp;rsquo;s a mixture of characters and numbers, so I&amp;rsquo;m going to put that in as a string.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;AppData&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;applicationId&lt;/span&gt; &lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;string&lt;/span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now we need to tell Element how to find this test data. We&amp;rsquo;ll say that it&amp;rsquo;s from the CSV, using the interface we&amp;rsquo;ve just created. Now we&amp;rsquo;ll tell Element the filename. In this situation, the CSV file that I&amp;rsquo;m using is actually in the same directory, so I don&amp;rsquo;t need to specify a path here, but if you&amp;rsquo;re putting it somewhere else, then you&amp;rsquo;ll need to specify the folder and the path to it.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;TestData&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;fromCSV&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;AppData&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;applicationids.csv&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now let&amp;rsquo;s use the data in a step. In real life, you might want to use an application ID to type it into a text field, but for demonstration purposes, I&amp;rsquo;m just going to show you how to output it to the console log. Printing to the console is also a good way to debug your tests, especially if you&amp;rsquo;re dealing with test data.&lt;/p&gt;
&lt;p&gt;We need to let Element know that we want to use AppData. So now, let&amp;rsquo;s output this to the console. Since we&amp;rsquo;re just debugging, let&amp;rsquo;s output the application ID. To actually get the value from the data file, we&amp;rsquo;ll use this syntax:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;step&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;Print to console&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;async&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Browser&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;data&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;AppData&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;application ID: &amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;`&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;data&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;applicationId&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;) 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;‍By default, Element reads the data files sequentially. The problem with that is we only have a handful of application IDs. So if we wanted to run this one script 100 times, we&amp;rsquo;re going to run out of data. What we can do here is add &lt;code&gt;circular&lt;/code&gt;. That way, when the script reaches the very last value of the file, the next value it selects will be the first one, and it never runs out of test data.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;TestData&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;fromCSV&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;AppData&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;applicationids.csv&amp;#39;&lt;/span&gt;)    
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;circular&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Another thing you might be wondering is how to make it so that Element chooses a random value every time. To do that, we&amp;rsquo;ll also have to add &lt;code&gt;shuffle&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;TestData&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;fromCSV&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;AppData&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;applicationids.csv&amp;#39;&lt;/span&gt;)    
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;circular&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;‍Now let&amp;rsquo;s try to run the test.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;element run test-data.ts
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;As you can see, it&amp;rsquo;s been finished. The application ID that was selected was indeed a random one because the first one would have started with A. So, it actually chose the last one randomly.&lt;/p&gt;
&lt;p&gt;And that&amp;rsquo;s it for test data with Element. Now, this user actually had a follow-up question, which was about unique test data. I&amp;rsquo;m going to answer that in the next video. Until next time, happy Flooding!&lt;/p&gt;
&lt;h2 id="sample-script"&gt;Sample script&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;step&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;TestSettings&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;Until&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;By&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;Browser&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;TestData&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;@flood/element&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;assert&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;assert&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;settings&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TestSettings&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {    
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;loopCount&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,    
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;description&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;Test Data&amp;#39;&lt;/span&gt;,    
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;screenshotOnFailure&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;,    
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;disableCache&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;,    
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;clearCache&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;,    
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;clearCookies&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/*** Test Data * Version: 1.0 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;default&lt;/span&gt; () =&amp;gt; {    
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;AppData&lt;/span&gt; {        
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;applicationId&lt;/span&gt; &lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;string&lt;/span&gt;    }    
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;TestData&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;fromCSV&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;AppData&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;applicationids.csv&amp;#39;&lt;/span&gt;)    
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;circular&lt;/span&gt;()    
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;shuffle&lt;/span&gt;()    
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;step&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;Print to console&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;async&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Browser&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;data&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;AppData&lt;/span&gt;) =&amp;gt; {        
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;application ID: &amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;`&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;data&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;applicationId&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;)    
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Hybrid load testing: the best of testing using protocols and real browsers</title><link>https://nicolevanderhoeven.com/blog/20200602-hybrid-load-testing/</link><pubDate>Tue, 02 Jun 2020 22:21:11 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200602-hybrid-load-testing/</guid><description>&lt;p&gt;At &lt;a href="https://guildconferences.com/speaker/nicole-hoeven/"&gt;PerfGuild 2020&lt;/a&gt;, I spoke about hybrid load testing and how to mix two different approaches to load testing: protocol-based and browser-based.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200602-01.jpeg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Here’s the unlisted video from that presentation:&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/KwlU6unOD9E?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Load testing on the Google Cloud Platform</title><link>https://nicolevanderhoeven.com/blog/20200528-load-testing-on-google-cloud-platform/</link><pubDate>Thu, 28 May 2020 22:25:06 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200528-load-testing-on-google-cloud-platform/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/load-testing-on-the-google-cloud-platform"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/load-testing-on-the-google-cloud-platform"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re excited to welcome another cloud provider to the Flood lineup, giving you even more options for running your load tests. You can now use Flood to run load tests on the &lt;a href="https://cloud.google.com/"&gt;Google Cloud Platform (GCP)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Many of you have requested an integration with Google Cloud, citing many of its strengths:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Full &lt;a href="https://cloud.google.com/blog/products/open-source/bringing-the-best-of-open-source-to-google-cloud-customers"&gt;integrations with open-source tools&lt;/a&gt; like Influx and Redis&lt;/li&gt;
&lt;li&gt;World-class &lt;a href="https://cloud.google.com/security"&gt;security&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;High-performance &lt;a href="https://cloud.google.com/infrastructure"&gt;global network&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Seamless access to other apps in the Google ecosystem, such as Search and Maps&lt;/p&gt;
&lt;p&gt;We think that adding support for GCP instances opens up a lot of opportunities for flooders wanting to take advantage of these benefits.&lt;/p&gt;
&lt;h2 id="using-flood-with-google-cloud"&gt;Using Flood with Google Cloud&lt;/h2&gt;
&lt;p&gt;You&amp;rsquo;ll notice a new Google Cloud section in &lt;a href="https://app.flood.io/account/integrations"&gt;the Integrations page&lt;/a&gt; while you&amp;rsquo;re logged into Flood:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200528-01.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll need to add your GCP service account key to allow Flood to access your account on your behalf. Once you&amp;rsquo;ve done this, you&amp;rsquo;ll be able to start grids and floods right from the Flood interface you&amp;rsquo;re already using.&lt;/p&gt;
&lt;p&gt;For more details on how to set up Flood to use your GCP account, check out &lt;a href="https://guides.flood.io/infrastructure/host-your-own-infrastructure/using-your-own-google-cloud-account"&gt;our documentation&lt;/a&gt; or follow along with the video below:&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/oYTo0jwRfMo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Anyone with a Flood subscription, including a free one, can use Google Cloud instances at no extra cost from Flood; however, GCP usage may incur separate costs.&lt;/p&gt;
&lt;p&gt;GCP is the third cloud provider that we support at Flood, after &lt;a href="https://guides.flood.io/infrastructure/host-your-own-infrastructure/using-your-own-aws-account"&gt;Amazon Web Services&lt;/a&gt; and &lt;a href="https://guides.flood.io/infrastructure/host-your-own-infrastructure/using-your-own-azure-account"&gt;Microsoft Azure&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Ask a Flooder 15: How do I install Element?</title><link>https://nicolevanderhoeven.com/blog/20200512-aaf15/</link><pubDate>Tue, 12 May 2020 22:45:18 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200512-aaf15/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/ask-a-flooder-15-how-do-i-install-element-video"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/ask-a-flooder-15-how-do-i-install-element-video"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In this Flood Element tutorial, I demonstrate the steps required to install Flood Element, including dependencies it requires. Flood Element is an open-source browser-based load testing tool created by Tricentis Flood.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bit.ly/2YM1mnV"&gt;Learn more about Flood Element&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nodejs.org/en/download/current/"&gt;Installation instructions for NodeJS&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://classic.yarnpkg.com/en/docs/install/"&gt;Installation instructions for Yarn&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bit.ly/2yuYrWl"&gt;Installation instructions for Element&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=oWtnStKrh98"&gt;Video: Getting Started with Element&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bit.ly/2YJIQg5"&gt;Guides: Using Element with Flood‍&lt;/a&gt;&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/N7VLqqueqJE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Audio version here:&lt;/p&gt;
&lt;iframe src="https://open.spotify.com/embed-podcast/episode/6EZ97ImNGUiDAGcEyGGNYM" width="100%" height="232" frameborder="0" allowtransparency="true" allow="encrypted-media"&gt;&lt;/iframe&gt;
&lt;h2 id="transcript"&gt;Transcript&lt;/h2&gt;
&lt;p&gt;Hi everyone, Nicole van der Hoeven here again, back with another Ask a Flooder, and today&amp;rsquo;s question is: &amp;ldquo;How do I install Element?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Now, I already made a previous video on how to get started with Element, but I didn&amp;rsquo;t actually go into the details of how to install it, so that&amp;rsquo;s what I&amp;rsquo;m going to do in this video today. There are actually a few parts to installing Element, and all of these instructions are going to be on &lt;a href="http://element.flood.io/"&gt;element.flood.io&lt;/a&gt;. If you go onto the site and click on Install, you&amp;rsquo;ll see all of the instructions depending on which operating system you&amp;rsquo;re on.&lt;/p&gt;
&lt;p&gt;First, you need to install NodeJS. This is sort of like how, if you&amp;rsquo;re familiar with JMeter, you have to install Java before installing JMeter. NodeJS is what Element runs on. Secondly, you&amp;rsquo;ll need a package manager. You can use NPM or Yarn, but in this video, I&amp;rsquo;m going to take you through how to do it with Yarn. And thirdly, there&amp;rsquo;s installing Element itself.&lt;/p&gt;
&lt;p&gt;First, download NodeJS. I&amp;rsquo;m going to leave links in the description to all of the sites that I visit so that you can go through all of the instructions later. On the Node site, download whichever installer suits your operating system. Go through the installation steps, and afterwards, check to make sure that NodeJS is properly installed on your machine. You can do that by going into the terminal and typing:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;node -v
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Just make sure that the version that&amp;rsquo;s shown here is the same version that you&amp;rsquo;ve downloaded.&lt;/p&gt;
&lt;p&gt;Secondly, install the latest version of Yarn. On the Yarn site, you&amp;rsquo;re going to have to choose your operating system and the version. We recommend using the latest stable version. And then go through the instructions for your operating system. After you&amp;rsquo;ve done that, check your Yarn installation by typing:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;yarn --version
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And the last step is installing Element. On the Element site, you can find the exact code that you need to type into your terminal. It&amp;rsquo;s:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;yarn global add @flood/element-cli
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So you can just copy that into your terminal. As of the time of this recording, the latest version of Element is 1.2.3. Looks like that&amp;rsquo;s installed. To check the version of Element, type:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;element --version
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So that&amp;rsquo;s how to install Element. We&amp;rsquo;ve gotten a lot of questions recently about Element in particular, so I&amp;rsquo;m going to answering them in future videos. Hope this helped, and until next time, happy flooding!&lt;/p&gt;</description></item><item><title>On-premise load testing advantages and disadvantages</title><link>https://nicolevanderhoeven.com/blog/20200430-on-premise-load-testing/</link><pubDate>Thu, 30 Apr 2020 23:06:59 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200430-on-premise-load-testing/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/on-premise-load-testing-advantages-and-disadvantages"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/on-premise-load-testing-advantages-and-disadvantages"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Where you run your load test can affect the results that you get as well as your project&amp;rsquo;s bottom line. In general, there are two infrastructure options to consider for load testing your apps: on-premise and cloud. Which type of environment is best for load testing both web or mobile apps?&lt;/p&gt;
&lt;h2 id="differences-between-on-premise-and-cloud-load-testing"&gt;Differences between on-premise and cloud load testing&lt;/h2&gt;
&lt;h3 id="what-is-on-premise-load-testing"&gt;What is on-premise load testing?&lt;/h3&gt;
&lt;p&gt;On-premise load testing is running your performance or load testing scripts on load generators you physically control. Typically, these load generators are machines that are either in your office or data center. In on-premise load testing, you are responsible for all aspects of the maintenance of the load generators, including hardware upgrades and software installations such as testing tools, but that also comes with increased control and security.&lt;/p&gt;
&lt;h3 id="what-is-cloud-load-testing"&gt;What is cloud load testing?&lt;/h3&gt;
&lt;p&gt;In cloud load testing, you run your load tests on a service provider&amp;rsquo;s machines, effectively outsourcing the provisioning and maintenance of your load generators. Running &amp;ldquo;on the cloud&amp;rdquo; means you&amp;rsquo;re paying someone else to be responsible for these machines. In cloud load testing, you don&amp;rsquo;t &amp;ldquo;own&amp;rdquo; the machines your test is running on; it&amp;rsquo;s more like renting some time on someone&amp;rsquo;s data center whenever you need it. Cloud-based infrastructure isn&amp;rsquo;t necessarily less secure than on-premise infrastructure, but there are certainly more security considerations to keep in mind.&lt;/p&gt;
&lt;h3 id="pros-and-cons-of-on-premise-load-testing"&gt;Pros and cons of on-premise load testing&lt;/h3&gt;
&lt;p&gt;On-premise load testing is no better or worse than cloud load testing; it just depends on what you need. There&amp;rsquo;s a meme that the cloud is just a fancy term for someone else&amp;rsquo;s computer— but &lt;a href="https://www.zdnet.com/article/stop-saying-the-cloud-is-just-someone-elses-computer-because-its-not/"&gt;that&amp;rsquo;s an oversimplification&lt;/a&gt; that glosses over nuances that might make a difference to your bottom line.&lt;/p&gt;
&lt;p&gt;Here are some questions to ask yourself when deciding between load testing on the cloud or on-premise.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/20200430-01.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Test infrastructure can make or break your load tests.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="cloud-vs-on-premise-load-testing-how-do-you-decide"&gt;Cloud vs. on-premise load testing: how do you decide?&lt;/h3&gt;
&lt;h4 id="why-are-you-running-a-load-test"&gt;Why are you running a load test?&lt;/h4&gt;
&lt;p&gt;If your intention for running load tests is to test your web application&amp;rsquo;s load balancing, the source of the web traffic, and the location of your environment, may not be as important. If you intend to do stress testing, you may want the scalability of a cloud setup.&lt;/p&gt;
&lt;h4 id="who-is-the-intended-audience-of-your-application"&gt;Who is the intended audience of your application?‍&lt;/h4&gt;
&lt;p&gt;Load testing is most accurate when it is as realistic to the production workload and user base as possible. Running a load test on-premises means that the traffic comes from one location, which could be ideal if your application is an internal one.&lt;/p&gt;
&lt;h5 id="do-you-have-the-resources-in-your-teamcompany-to-maintain-load-generators"&gt;Do you have the resources in your team/company to maintain load generators?&lt;/h5&gt;
&lt;p&gt;All machines need to be provisioned, set up, and maintained to function correctly. Depending on how many machines you need, you may even need a team of trained professionals to monitor your environment.&lt;/p&gt;
&lt;h4 id="what-is-your-budget"&gt;What is your budget?&lt;/h4&gt;
&lt;p&gt;Both cloud and on-premise load testing have costs. Cloud load testing requires a smaller outlay of cash initially but may cost more to maintain as you continue to pay for the computing time. On-premise load testing requires more money upfront but may cost less to maintain in the long run.&lt;/p&gt;
&lt;h4 id="how-many-virtual-users-do-you-want-to-run"&gt;How many virtual users do you want to run?&lt;/h4&gt;
&lt;p&gt;The number of virtual users you intend to test your application against correlates to the number of load generators you require. In general, the more machines you need, the more expensive it becomes (for both cloud and on-premise load testing), but if you only need a handful of users, perhaps you can find a machine or two on-premise that could do the trick.&lt;/p&gt;
&lt;h3 id="advantages-of-on-premise-load-testing"&gt;Advantages of on-premise load testing&lt;/h3&gt;
&lt;p&gt;‍
&lt;img src="https://nicolevanderhoeven.com/assets/20200430-02.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h4 id="increased-control"&gt;Increased control&lt;/h4&gt;
&lt;p&gt;Since you own the machines you&amp;rsquo;re testing on, you can set your environment up with your exact specifications in mind. You&amp;rsquo;ll be able to make hardware upgrades or update versions of operating systems and load testing tools whenever you want, without needing to liaise with a third-party provider. This option can come in handy if you routinely use non-standard configurations or legacy software. If you&amp;rsquo;re also doing other types of non-functional testing, like security testing, it may be easier to change the configuration on on-premise machines.&lt;/p&gt;
&lt;h4 id="greater-data-security"&gt;Greater data security&lt;/h4&gt;
&lt;p&gt;The question of cloud vs. on-premises may be a business decision. Some industries or businesses with stringent compliance and regulatory requirements may have no choice but to run tests on-premise because owning the load generators also means controlling who has access to the data that&amp;rsquo;s on them. An on-premise environment lets you lock down access if necessary. With cloud load testing, you&amp;rsquo;d need to have security arrangements with the cloud provider that you choose so that any test data or identifying client information seen or accessed by your test scripts remains confidential.&lt;/p&gt;
&lt;h4 id="lower-cost-and-lower-barrier-to-entry-in-some-situations"&gt;Lower cost and lower barrier to entry in some situations&lt;/h4&gt;
&lt;p&gt;If you don&amp;rsquo;t intend to run too many users of your test script and you already have a spare machine or two at the office, on-premise load testing may be the easiest and most cost-effective way to get started. This way, you avoid having to request the budget for a new tool and needing to train your team on a new interface.&lt;/p&gt;
&lt;h4 id="fewer-variations-due-to-latency"&gt;Fewer variations due to latency&lt;/h4&gt;
&lt;p&gt;Controlling your own load generators means controlling the network they run on. If your corporate network is generally stable, and your test scenarios don&amp;rsquo;t involve testing from different geographical locations, reported response times (and user experience) more closely reflect server processing time rather than latency and travel time.&lt;/p&gt;
&lt;h3 id="disadvantages-of-on-premise-load-testing"&gt;Disadvantages of on-premise load testing&lt;/h3&gt;
&lt;p&gt;‍
&lt;img src="https://nicolevanderhoeven.com/assets/20200430-03.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h4 id="higher-cost-in-some-situations"&gt;Higher cost in some situations&lt;/h4&gt;
&lt;p&gt;Maintaining your own load generators comes with a higher up-front cost, which may be a showstopper for smaller projects or companies. The more concurrent users you require for your load test, the more machines you need, the more licenses you need for your testing tool (unless it&amp;rsquo;s open source), and the longer it takes to recover your investment.&lt;/p&gt;
&lt;h4 id="geographical-limitations"&gt;Geographical limitations&lt;/h4&gt;
&lt;p&gt;Since all your machines are in one place, you can&amp;rsquo;t accurately simulate the user experience for customers who might access your web app from another location. You also can&amp;rsquo;t fully test the effect of CDNs and other tools that your application might employ to keep response times low. Web apps that can be accessed by anyone on the internet might require performance tests that take into account customers from different regions.&lt;/p&gt;
&lt;h4 id="more-setup"&gt;More setup&lt;/h4&gt;
&lt;p&gt;You need to do all the setup yourself for both hardware and software components. You also need a way to coordinate your test, so that load generators start and end when you want them to. You may want to divert some resources towards environment management.&lt;/p&gt;
&lt;h4 id="less-flexibility"&gt;Less flexibility&lt;/h4&gt;
&lt;p&gt;With on-premise load generators, you can&amp;rsquo;t add, remove, or scale up nodes on the fly according to your test— something cloud load testing excels at.&lt;/p&gt;
&lt;h2 id="on-premise-load-testing-best-practices"&gt;On-premise load testing best practices&lt;/h2&gt;
&lt;p&gt;The environment you&amp;rsquo;re testing in is especially important when you&amp;rsquo;re using your own infrastructure. Here are some best practices for a performance testing strategy that involves on-premise load generation.&lt;/p&gt;
&lt;h3 id="run-baseline-tests"&gt;Run baseline tests&lt;/h3&gt;
&lt;p&gt;Treat load testing like a scientific experiment. Before you begin changing variables to improve performance, spend some time figuring out your test configuration so that it&amp;rsquo;s repeatable. Pay attention to things like workloads, business processes, the number of users you&amp;rsquo;re running per load generator, test environment configuration values, script pacing and think time set in your testing tool, and test script transactions. Make sure that the resource utilization on your machines remains healthy during a test; otherwise, you&amp;rsquo;re load testing the load generators themselves rather than your application servers.&lt;/p&gt;
&lt;p&gt;Then, run a few tests against your application servers without making any changes. This way, you create a &amp;ldquo;control group&amp;rdquo; or control test against which to compare future tests.&lt;/p&gt;
&lt;p&gt;This process is called &lt;em&gt;baselining&lt;/em&gt; your application performance.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/20200430-04.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Flood&amp;rsquo;s Project View lets you track an application&amp;rsquo;s performance over time and compare recent tests to a baseline&lt;/em&gt;
‍&lt;/p&gt;
&lt;h3 id="consider-using-containers-or-virtual-machine-images"&gt;Consider using containers or virtual machine images&lt;/h3&gt;
&lt;p&gt;Along the lines of reducing variables, it&amp;rsquo;s especially important to use load generators that are as identical as you can make them. You can manually check that you&amp;rsquo;re installing the same software and tools on each one, or you can do as cloud providers do and automate this process.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s easy to miss software that are necessary for monitoring or the load testing tool you&amp;rsquo;re using. For example, JMeter and Gatling require certain versions of Java. Test automation or browser-level load testing tools might require web browsers.&lt;/p&gt;
&lt;p&gt;You can use &lt;a href="https://www.docker.com/resources/what-container"&gt;containers such as Docker&lt;/a&gt; to create a standalone package of everything you need for your test. Alternatively, if you&amp;rsquo;re using virtual machines, you can also create a full system image that you can use for every virtual machine.&lt;/p&gt;
&lt;p&gt;The difference between the two is that a container lets you be more granular about what is included in the package that you then deploy to all your load generators. Virtual machines include hardware components that you can set, whereas containers are software-only, decreasing package sizes.&lt;/p&gt;
&lt;p&gt;Using containers or images allows you to keep your load generators as identical as possible (in terms of hardware and software) so that you can assume similar results from each one.&lt;/p&gt;
&lt;p&gt;‍‍&lt;img src="https://nicolevanderhoeven.com/assets/20200430-05.jpg" alt="" loading="lazy" decoding="async"&gt;
‍&lt;/p&gt;
&lt;h3 id="dont-neglect-monitoring"&gt;Don&amp;rsquo;t neglect monitoring&lt;/h3&gt;
&lt;p&gt;It&amp;rsquo;s easy to forget that your application servers aren&amp;rsquo;t the only ones that need monitoring. Your load generators need monitoring as well, so that they don&amp;rsquo;t end up being the bottleneck in your tests. Here&amp;rsquo;s &lt;a href="https://flood.io/blog/load-testing-tutorial-server-monitoring"&gt;a starter list of server metrics&lt;/a&gt; that you should consider monitoring.&lt;/p&gt;
&lt;p&gt;You might also consider how you can integrate &lt;a href="https://stackify.com/mistakes-evaluating-application-performance-management/"&gt;performance management&lt;/a&gt; tools you already use into your monitoring strategy.&lt;/p&gt;
&lt;h3 id="spend-time-on-a-framework-for-gathering-data"&gt;Spend time on a framework for gathering data&lt;/h3&gt;
&lt;p&gt;One of the biggest challenges in on-premise load testing is figuring out how to get data from your tests. Each machine runs your test script independently of the others, so at the end of your test, you&amp;rsquo;re likely to end up with several results files. After you download these off every machine, how do you combine them into a single summary?&lt;/p&gt;
&lt;p&gt;Manually collating results is an option, but it&amp;rsquo;s a tedious one. You can copy all the files into one directory and then concatenate them so that you end up with one giant one. Depending on the size of those results files and how long you ran the test, however, this may not be feasible. For larger files, you might consider aggregating the data and increasing the granularity, so that instead of seeing raw response time for every transaction, you only see the average response time for every 15 seconds. You can use a tool like &lt;a href="https://www.elastic.co/logstash"&gt;Logstash&lt;/a&gt; for this.&lt;/p&gt;
&lt;p&gt;It takes some time and technical expertise to set up a framework for results gathering that works for your purposes, especially if you want to go a step further and have real-time results.&lt;/p&gt;
&lt;p&gt;Of course, you can also skip this part by just using the framework we&amp;rsquo;ve already set up on Flood. Tim Koopmans, our co-founder, created the first prototype of what would become Flood specifically because he got tired of having to set up this framework for every engagement.&lt;/p&gt;
&lt;h2 id="how-to-run-an-on-premise-load-test-with-flood-agent"&gt;How to run an on-premise load test with Flood Agent&lt;/h2&gt;
&lt;p&gt;‍
The easiest way to get started with an on-premise load test is by using &lt;a href="https://flood.io/blog/introducing-flood-agent-standalone-infrastructure-for-load-testing"&gt;Flood Agent&lt;/a&gt;. Flood Agent is an executable that you can install onto a machine that effectively turns it into a full-fledged load generator. Then, you can start a test from the Flood web interface and have your test script start running on your machines.&lt;/p&gt;
&lt;p&gt;Agent takes care of a few typical problems we&amp;rsquo;ve discussed so far:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It uses containers to ensure that load generators are identically provisioned.&lt;/li&gt;
&lt;li&gt;It automatically gathers CPU, memory, and network metrics on load generators.&lt;/li&gt;
&lt;li&gt;It coordinates the execution of the load test so that you only need to start it from one central place.&lt;/li&gt;
&lt;li&gt;It enables real-time monitoring of results while the test is running.&lt;/li&gt;
&lt;li&gt;It aggregates and collates all the results for you into a dashboard.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We think Agent addresses pain points that we&amp;rsquo;ve seen over and over again in our own on-premise performance testing projects as well as in our customers&amp;rsquo;. Agent is a &lt;a href="https://github.com/flood-io/flood-agent/releases/latest"&gt;free download&lt;/a&gt; and works with &lt;a href="https://guides.flood.io/scripting-and-tools/choosing-a-tool"&gt;all performance testing tools that Flood supports&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;On-premise load testing is still a valid option despite the growth in popularity of cloud-based infrastructure, and it has its advantages and disadvantages. This type of load testing trades a little bit of flexibility for increased data security and control, which is a tradeoff that some companies may be willing to make.&lt;/p&gt;
&lt;p&gt;On-premise load testing has traditionally included a lot of tedious setup and maintenance. Still, you can reduce maintenance effort by creating an internal load testing framework upfront that automates coordination, monitoring, and results collection. Using Flood Agent can mitigate time spent on this initial setup.&lt;/p&gt;</description></item><item><title>Ask a Flooder 13: How do you do mobile load testing?</title><link>https://nicolevanderhoeven.com/blog/20200428-aaf13/</link><pubDate>Tue, 28 Apr 2020 23:21:08 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200428-aaf13/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/ask-a-flooder-13-how-do-you-do-mobile-load-testing"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/ask-a-flooder-13-how-do-you-do-mobile-load-testing"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;How do you load test a native mobile app? I discuss the general approach to mobile load testing, what a device farm is, and why a device farm isn&amp;rsquo;t necessary for load testing. I also discuss the best mobile load testing tools to use.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/y_rRu0cDey4?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Or listen to the audio version here:&lt;/p&gt;
&lt;iframe src="https://open.spotify.com/embed-podcast/episode/2fevtJd7pPIAUDkMpdnzkV" width="100%" height="232" frameborder="0" allowtransparency="true" allow="encrypted-media"&gt;&lt;/iframe&gt;
&lt;p&gt;Hi everyone, Nicole here again, back with another Ask a Flooder, and today&amp;rsquo;s question is:&lt;/p&gt;
&lt;h2 id="how-do-you-do-mobile-load-testing"&gt;How do you do mobile load testing?&lt;/h2&gt;
&lt;p&gt;Now, this question came from a customer who was under the misconception that in order to do mobile load testing, they would need to use what we call a device farm. A device farm is a collection of different kinds of mobile phones. You would ideally have the most popular makes of mobile phones (the hardware models) and the operating systems and system versions. You can imagine that this can very easily get a little out of hand to coordinate because of fragmentation. There are just so many devices out on the market, and then there&amp;rsquo;s the question of how you actually generate the load from that.&lt;/p&gt;
&lt;p&gt;You would somehow need some sort of test automation script that was running and then coordinate os that they all run at the same time, and you would use that as a load test. As you can imagine, whether you use real devices or simulators, this kind of thing would get complicated and expensive very quickly. But the good news is that it&amp;rsquo;s unnecessary if it&amp;rsquo;s load testing that you want to do. Now I say that because, for functional testing or compatibility testing, you ARE going to want to test your application on a variety of different browsers. But with load testing, you&amp;rsquo;re really more concerned about the back end part of the equation. You want to generate load on your application servers. In reality, most mobile apps work by sending API requests to that server, usually by some sort of restful API. Luckily, API load testing has been around for a while, so we do have some industry-tested ways to run this.&lt;/p&gt;
&lt;h2 id="what-are-the-best-tools-for-api-load-testing"&gt;What are the best tools for API load testing?&lt;/h2&gt;
&lt;p&gt;Essentially, you&amp;rsquo;re going to want to test protocol-level tools. That means that you don&amp;rsquo;t want to be using browser-level tools in which you&amp;rsquo;re using scripts to drive a full browser. All you really need is something that sends requests on the protocol-level. That&amp;rsquo;s great because it&amp;rsquo;s actually way more efficient.&lt;/p&gt;
&lt;p&gt;You have two really good open-source options for this, JMeter and Gatling. I&amp;rsquo;ve already gone a little bit into the differences between these two in my previous video on how you choose a tool for load testing, which I will leave a link to.&lt;/p&gt;
&lt;p&gt;And here are some other resources that will help you get started with mobile load testing. I also have another video about how to record network traffic from a native mobile app on JMeter, which sounds a little complicated, but I promise it&amp;rsquo;s not. In that video, I go over the steps with you, and I&amp;rsquo;m actually doing it in real-time with you as well. I show you the screen recording from my mobile and from JMeter on my laptop, so you can always pause and watch it at your own pace.&lt;/p&gt;
&lt;p&gt;The second thing is that I already wrote a blog post, which is sort of a guide for mobile load testing, which goes into the steps into way more detail than I can here.&lt;/p&gt;
&lt;p&gt;And lastly, I have written blog posts about two real-life examples of mobile load testing. The first one was the Iowa Caucus Reporter app. I ran through it from the workload modeling to the scripting and then the actual execution. More recently, I also wrote about the Robinhood app. Be sure to check out the links in the description to find out more.&lt;/p&gt;
&lt;p&gt;Until next time, happy flooding!&lt;/p&gt;</description></item><item><title>Browser-based load testing in 2020</title><link>https://nicolevanderhoeven.com/blog/20200423-browser-based-load-testing-2020/</link><pubDate>Thu, 23 Apr 2020 16:48:09 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200423-browser-based-load-testing-2020/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/browser-based-load-testing-in-2020"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/browser-based-load-testing-in-2020"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We &lt;a href="https://flood.io/blog/level-up-your-load-testing-with-browser-level-users"&gt;first announced&lt;/a&gt; our open-source browser-based load testing tool based on Puppeteer, &lt;a href="https://element.flood.io/"&gt;Flood Element&lt;/a&gt;, in February 2018. Despite our decision to make it an entirely separate tool from Flood, we&amp;rsquo;ve enjoyed using it so much as a team that several of us have written about it:&lt;/p&gt;
&lt;p&gt;Tim Koopmans: &lt;a href="https://flood.io/blog/load-testing-for-devops-with-browser-level-users-blu"&gt;Load testing for DevOps&amp;hellip; with Browser Level Users (BLU)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Kevin Dunne: &lt;a href="https://flood.io/blog/a-new-approach-to-load-testing-with-browser-level-users"&gt;A new approach to load testing with browser level users&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;me: &lt;a href="https://flood.io/blog/prepare-for-viral-videos-with-flood-element"&gt;Prepare for viral videos with Flood Element&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Lachie Cox: &lt;a href="https://flood.io/blog/why-you-should-load-test-with-browsers"&gt;Why should you load test with real browsers?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;our friend Eduardo Riol, as translated by Antonio Jimenez: &lt;a href="https://flood.io/blog/selenium-vs-puppeteer-for-test-automation-is-a-new-leader-emerging"&gt;Puppeteer vs. Selenium for test automation: is a new leader emerging?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Clearly, we&amp;rsquo;re huge fans of load testing a web application with real browsers. But does the wider software testing industry share that sentiment?&lt;/p&gt;
&lt;h2 id="browser-based-load-testing-in-2020"&gt;Browser-based load testing in 2020&lt;/h2&gt;
&lt;p&gt;Browser-level load testing is still pretty new, and there aren&amp;rsquo;t too many providers offering it right now. Luckily, we just so happen to have access to a database of load tests run on Flood since 2013. Here&amp;rsquo;s a bar chart visualizing data we&amp;rsquo;ve collected about the load testing tools flooders have used (we support Selenium, JMeter, Gatling, and Element).&lt;/p&gt;
&lt;h3 id="load-tests-executed-on-flood-over-time-grouped-by-load-testing-tool"&gt;Load tests executed on Flood over time, grouped by load testing tool&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200423-01.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h3 id="browser-level-load-testing-is-increasing-in-popularity"&gt;Browser-level load testing is increasing in popularity&lt;/h3&gt;
&lt;h4 id="in-2020-almost-35-of-the-load-tests-run-on-flood-are-browser-based-load-tests"&gt;In 2020, almost 35% of the load tests run on Flood are browser-based load tests.&lt;/h4&gt;
&lt;p&gt;While the total number of load tests run across all tools increased across the board, the percentage of tests that utilized Selenium and Element, as compared to JMeter and Gatling, has also increased from 2018. Both Selenium and Element are browser-based load testing tools.&lt;/p&gt;
&lt;p&gt;By contrast, JMeter, a protocol-level load testing tool which previously enjoyed a 70% share of the traffic on Flood, now accounts for only a bit over 50% of usage. JMeter&amp;rsquo;s share of the protocol-level pie is higher than Gatling&amp;rsquo;s, but the percentage of usage for both tools appears to be contracting when compared to that of browser-based tools.&lt;/p&gt;
&lt;h3 id="element-use-is-increasing-faster-than-selenium-use"&gt;Element use is increasing faster than Selenium use&lt;/h3&gt;
&lt;p&gt;Despite the fact that Selenium has been around longer, &lt;strong&gt;25% of all floods today are run using Element&lt;/strong&gt;. This is a significant increase in just two years, and one that bodes well for the future. While we&amp;rsquo;re still fans of Selenium and still support it, one reason we see for the dominance of Element in today&amp;rsquo;s market is resource efficiency.&lt;/p&gt;
&lt;p&gt;In our baseline tests, we&amp;rsquo;ve seen that Element can run from 20-50 users per Flood node (an &lt;a href="https://aws.amazon.com/blogs/aws/m5-the-next-generation-of-general-purpose-ec2-instances/"&gt;AWS m5.xlarge instance&lt;/a&gt;), whereas Selenium can only run up to 5. This leads to some significant cost savings, as running the same number of users with Element requires fewer load generators than with Selenium.&lt;/p&gt;
&lt;p&gt;Another reason might be the fact that Element uses Puppeteer in the background. Puppeteer, developed by Google, understandably shines when driving Google Chrome (and recently, Firefox). Puppeteer load testing is growing in popularity due to the wealth of metrics it has access to.&lt;/p&gt;
&lt;h2 id="how-browser-based-load-testing-works"&gt;How browser-based load testing works&lt;/h2&gt;
&lt;p&gt;Traditional load testing is done on the protocol level by sending messages directly to the web server. These messages are sent without simulating the application interface, and the responses that are received from the server are not visualized, either. &amp;ldquo;Users&amp;rdquo; in protocol-level load testing scripts are actually threads, with each one sending a list of messages at predefined intervals, and we refer to these users as Protocol-Level Users (PLU). JMeter and Gatling use PLU to generate load.&lt;/p&gt;
&lt;p&gt;The screenshot below shows what one request for a single action might look like in a JMeter test plan.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200423-02.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Example of an HTTP request with parameters on JMeter&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In browser-based load testing, real browser instances are opened on load generators, and the load testing tool plays the part of a real user in navigating the web application using the GUI. We refer to the virtual users in browser-based load testing as Browser-Level Users (BLU).&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s an example of the same action in the JMeter example above, but this time in an Element test script:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;step&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;Step 1&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;async&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Click Start button
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;startButton&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;findElement&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;.btn-default&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;startButton&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;click&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This version simply describes the button to be found and clicked, whereas the protocol-level version needs to be more precise in what exactly is passed to the server.&lt;/p&gt;
&lt;p&gt;Both types of load testing tools can apply the same load on an application (as long as it supports both methods— see the next section). The main difference is in how the load is generated.&lt;/p&gt;
&lt;p&gt;A protocol-level script will contain instructions on which messages to send, which protocols to use, which headers to include, and other information that a typical end-user would not see.&lt;/p&gt;
&lt;p&gt;A browser-level script will contain instructions on how to &lt;em&gt;interact&lt;/em&gt; with the application: which buttons to click, what to type in text fields, which links to follow, and other on-screen elements that an end-user would be familiar with. This leads us to one of the big advantages of browser-based load testing.&lt;/p&gt;
&lt;h2 id="pros-and-cons-of-browser-based-load-testing"&gt;Pros and cons of browser-based load testing&lt;/h2&gt;
&lt;h3 id="pros"&gt;Pros&lt;/h3&gt;
&lt;h4 id="simple-scripting-or-no-scripting-at-all"&gt;Simple scripting— or no scripting at all&lt;/h4&gt;
&lt;p&gt;Protocol-level tools require in-depth knowledge about how an application works, what format it expects requests to be in, and how it responds. On the browser-level, you don&amp;rsquo;t need to know any of that. When scripting a login process, for instance, you just need to tell the script to type a username and password in the right fields and then click Log In. The script doesn&amp;rsquo;t need to know that the form submits an encrypted request using the Auth0 API (something you&amp;rsquo;d need to know for a protocol-level script).&lt;/p&gt;
&lt;p&gt;In some cases, you might be able to get away with using something like our &lt;a href="https://flood.io/blog/record-load-tests-in-flood-element-using-qtest-explorer"&gt;qTest Explorer plugin&lt;/a&gt; to record a business process, generating a script without any scripting at all. Even when you have to write or modify the script, though, it&amp;rsquo;s a lot less intimidating than most protocol-level scripts.&lt;/p&gt;
&lt;p&gt;They&amp;rsquo;re also easier to troubleshoot. In addition to opening a real browser instance on your computer when you run a script locally, Element can also display this information on the console (shown here on iTerm):&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/20200423-03.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Screenshots upon execution on Element using iTerm&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;‍This allows you to understand what&amp;rsquo;s going on in the script and in the application, letting you detect bottlenecks faster.&lt;/p&gt;
&lt;h4 id="reduced-test-complexity"&gt;Reduced test complexity&lt;/h4&gt;
&lt;p&gt;The streamlined requirements for scripting lead to a straightforward test. There&amp;rsquo;s no chance of getting request parameters or values wrong.&lt;/p&gt;
&lt;h4 id="ability-to-test-entire-stack-from-the-user-perspective"&gt;Ability to test entire stack from the user perspective&lt;/h4&gt;
&lt;p&gt;Unlike testing APIs, you don&amp;rsquo;t need to decide which server you want to hit or make sure you have the appropriate requests to hit all the servers. A browser-level test script interacts with page elements like a real user would, so all underlying application servers are tested. Pair this with &lt;a href="https://guides.flood.io/infrastructure/demand-infrastructure/advantages-of-testing-in-the-cloud"&gt;cloud-based infrastructure on Flood&lt;/a&gt;, and you&amp;rsquo;ve got a compact package for testing your application.&lt;/p&gt;
&lt;h4 id="capable-of-testing-any-user-behavior"&gt;Capable of testing any user behavior&lt;/h4&gt;
&lt;p&gt;Protocol-level load test tools struggle with some types of applications, such as single-page apps (SPAs), where a lot of the processing is done on the client side. Browser-level load testing tools shine here, because scripted interactions for these apps are no different for SPAs than other web apps.&lt;/p&gt;
&lt;h4 id="record-network-and-user-interaction-times-for-front-end-optimization"&gt;Record network and user interaction times for front-end optimization&lt;/h4&gt;
&lt;p&gt;Browser-level tools show you response times from the user&amp;rsquo;s perspective: how long after a user clicks the log in button does the user see his or her account balance? This metric is a practical one that may differ wildly from the traditional response times that a protocol-level tool reports. Measuring real user experience is a great value add for your test.&lt;/p&gt;
&lt;h4 id="easier-to-maintain"&gt;Easier to maintain&lt;/h4&gt;
&lt;p&gt;Lower script complexity means that a browser-based test script is more resilient to changes in the codebase. A change in the underlying requests sent will not require a change in the test script, making it perfect for regression testing.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s also easier to pass on to other members of the team due to high readability. Here&amp;rsquo;s an example of how to select a value from a dropdown menu in Element:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;selectByValue&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;#challenger_age&amp;#39;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#39;34&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It&amp;rsquo;s easy to see that the script is looking for an element with the ID &amp;ldquo;challenger_age&amp;rdquo; and selecting the value &amp;ldquo;34&amp;rdquo;. This step could correspond to dozens of requests that need to be scripted if testing on the protocol level, which makes those scripts harder to understand without a proper handover.&lt;/p&gt;
&lt;h3 id="cons"&gt;Cons&lt;/h3&gt;
&lt;p&gt;Browser-based load testing tools have a higher CPU and memory footprint than protocol-based tools. Test scripts in JMeter and Gatling send messages to and record responses from a server without really needing to parse responses. By contrast, browser-based tools parse the server response in order to access the Domain Object Model (DOM) elements on the page.&lt;/p&gt;
&lt;p&gt;Using real browsers might be closer to the real user experience, but it also takes its toll on node resources. It is possible to run in headless mode, where browsers are started &amp;ldquo;invisibly&amp;rdquo; without actually graphically rendering them. However, even then, a browser-level tool can run fewer concurrent users on a node than a protocol-level tool.&lt;/p&gt;
&lt;h2 id="best-tools-and-applications-for-browser-based-load-testing"&gt;Best tools and applications for browser-based load testing&lt;/h2&gt;
&lt;p&gt;While other commercial tools exist for this, we&amp;rsquo;re partial to open source tools at Flood.&lt;/p&gt;
&lt;h3 id="selenium"&gt;Selenium&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200423-04.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Selenium load testing is appealing because Selenium is already well-known for test automation and functional testing, and a lot of companies already have full test suites in Selenium. The possibility of reusing those resources and just running them at scale as load tests is, by far, the most compelling reason to use Selenium.&lt;/p&gt;
&lt;h3 id="puppeteer"&gt;Puppeteer&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200423-05.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Google&amp;rsquo;s just getting started with Puppeteer, and the amount of metrics it exposes is exciting: it seems like anything in Chrome Developer Tools can be accessed by Puppeteer. Imagine running a load test on ONE tool that gives you statistics about back-end performance (response times, the effect of bandwidth restrictions, resources returning errors) AND front-end performance (client-side script console logs, render times, time to first paint, etc). It&amp;rsquo;s hard to imagine a future where this ISN&amp;rsquo;T a valuable tool in the performance arsenal.&lt;/p&gt;
&lt;p&gt;Under Puppeteer, of course, is &lt;a href="https://element.flood.io/"&gt;Element&lt;/a&gt;— our load-flavored version of Puppeteer.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200423-06.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="is-protocol-based-load-testing-dead"&gt;Is protocol-based load testing dead?&lt;/h2&gt;
&lt;p&gt;No. Testing on the protocol-level may have its drawbacks, but it&amp;rsquo;s popular for a reason. If you&amp;rsquo;re testing mobile apps or API endpoints, protocol-level testing tools allow you to focus on hitting what you want to test and only what you want to test. Sometimes you don&amp;rsquo;t want to test the whole stack. It really depends on your test scenarios.&lt;/p&gt;
&lt;p&gt;Plus, protocol-level tools tend to be really resource efficient. We&amp;rsquo;ve been able to easily run about 1000 users per Flood node with JMeter and Gatling, easily outstripping browser-level tools. It makes sense, since JMeter and Gatling don&amp;rsquo;t need to start browser instances to generate load.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s significantly cheaper to generate very high loads with protocol-level tools. This efficiency makes protocol-level tools a good choice for high concurrency load testing and especially stress testing.&lt;/p&gt;
&lt;h2 id="what-are-we-doing-to-support-blu"&gt;What are we doing to support BLU?&lt;/h2&gt;
&lt;p&gt;Clearly, our usage metrics show that browser-based load testing is on the rise, and we&amp;rsquo;re planning to ramp up our offerings in this area while also maintaining support for protocol-level tools. Here&amp;rsquo;s what you can look forward to from us:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New releases
&lt;ul&gt;
&lt;li&gt;We just released &lt;a href="https://element.flood.io/docs/1.0/install"&gt;version 1.2.3 of Element&lt;/a&gt; a few weeks ago, which addresses some bugs and improve stability for certain actions.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Dedicated Element team
&lt;ul&gt;
&lt;li&gt;We&amp;rsquo;ve put together a team of developers who will be focusing on improving Element exclusively. Despite Element being an open source tool, we&amp;rsquo;re putting our own resources behind it to improve it faster.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Partnering with consulting services
&lt;ul&gt;
&lt;li&gt;It can be difficult to get started on a new tool, and Element is no exception. While we provide a load testing platform to run Element scripts, some companies want help to create the scripts in the first place. To this end, we&amp;rsquo;ve partnered with expert consultants who have already been using Element with great success: &lt;a href="https://foulkconsulting.com/"&gt;Foulk Consulting&lt;/a&gt; and &lt;a href="https://www.planittesting.com/"&gt;Planit Testing&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;When choosing a performance testing tool, it&amp;rsquo;s important to consider the advantages and disadvantages of protocol-level and browser-level testing tools. We think both types of tools deserve to be in a solid performance and load testing strategy. They can also be used in tandem in a hybrid load testing approach, improving overall application performance and scalability.&lt;/p&gt;
&lt;p&gt;In 2018, we predicted that testing web-based applications with real browsers would increase in popularity, so we&amp;rsquo;re thrilled to see our theory validated in 2020. Browser-based load testing is increasing in usage, and our open source tool, Element, is leading the charge. It&amp;rsquo;s exciting to be at the forefront of this revolution, and we intend to increase support for load testing with real browsers even more this year.&lt;/p&gt;</description></item><item><title>Ask a Flooder 12: Puppeteer vs Selenium: which one is better for load testing?</title><link>https://nicolevanderhoeven.com/blog/20200421-aaf12/</link><pubDate>Tue, 21 Apr 2020 17:36:28 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200421-aaf12/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/ask-a-flooder-12-puppeteer-vs-selenium-which-one-is-better-for-load-testing"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/ask-a-flooder-12-puppeteer-vs-selenium-which-one-is-better-for-load-testing"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;When it comes to software testing, the debate of Puppeteer vs Selenium is a hot one. Nicole tackles it here to determine which one is better for load testing in particular. Spoiler: The answer is still &amp;ldquo;it depends&amp;rdquo;.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/K61W7ivhsuE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Or catch the audio version here:&lt;/p&gt;
&lt;iframe src="https://open.spotify.com/embed-podcast/episode/76u25lI7sFx5SwgbsFLU5Z" width="100%" height="232" frameborder="0" allowtransparency="true" allow="encrypted-media"&gt;&lt;/iframe&gt;
&lt;p&gt;Hi everyone, Nicole here again, back for another Ask a Flooder, and today, the question is: &amp;ldquo;Puppeteer vs. Selenium: which one is better for load testing?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re actually getting this quite a bit now as Puppeteer grows in popularity, but first, let&amp;rsquo;s discuss the similarities. They&amp;rsquo;re tools that you can use to drive browsers. The work by identifying and interacting with elements on a website in the same way that a user would. They are also both open-source, and both can be used for load testing. This is a great strategy because instead of writing tests for an automation suite and then tests for load testing, you can just write the one test suite and re-use it, so it saves a lot of resources in the end. To answer this question, I&amp;rsquo;m going to focus on load testing because that&amp;rsquo;s what my experience is in.&lt;/p&gt;
&lt;h2 id="difference-between-selenium-and-puppeteer"&gt;Difference between Selenium and Puppeteer&lt;/h2&gt;
&lt;h3 id="pros-and-cons-of-selenium"&gt;Pros and cons of Selenium&lt;/h3&gt;
&lt;p&gt;Now for the difference. Selenium supports more browsers than does Puppeteer. It supports Chrome, Firefox, IE, Safari, and Opera, so there are a lot more options to choose from depending on your application.&lt;/p&gt;
&lt;p&gt;Selenium is also what I would call automation-first. It was built with automation in mind, which means it&amp;rsquo;s very good at that. It&amp;rsquo;s very robust, and if you have a complicated test scenario, Selenium is an excellent choice.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s also been around for much longer than Puppeteer, which is important because that means it&amp;rsquo;s had more time to build up a community. There are way more resources and tutorials for Selenium than for Puppeteer.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s also, unfortunately, very resource-intensive. That&amp;rsquo;s not something that you would typically care too much about from a test automation perspective, but when you&amp;rsquo;re running thousands of users on the cloud, it IS important to keep in mind that Selenium, just because of how it&amp;rsquo;s built and its complexity, can only run about five users per node. We&amp;rsquo;ve found that out at Flood, after baselining specifically an AWS m5.xlarge instance. So you can look at the specs of that and compare it with the machines that you&amp;rsquo;re wanting to run Selenium on, to see how that would equate for you.&lt;/p&gt;
&lt;h3 id="pros-and-cons-of-puppeteer"&gt;Pros and cons of Puppeteer&lt;/h3&gt;
&lt;p&gt;Puppeteer is a NodeJS library developed by Google, which means it plays very well with Chrome. There are a whole lot of things that you have access to with Puppeteer, and if you&amp;rsquo;re using it with Chrome, pretty much anything in Chrome, including rendering times, you can see and access with a Puppeteer script. So that&amp;rsquo;s a huge advantage.&lt;/p&gt;
&lt;p&gt;Unfortunately, that also means it supports fewer browsers. Obviously, it supports Chrome very well, and they recently came out with support for Firefox, although they do have plans to incorporate support for more browsers in the future.&lt;/p&gt;
&lt;p&gt;One of Puppeteer&amp;rsquo;s advantages is that we at Flood actually created a tool on top of Puppeteer. It&amp;rsquo;s also open-source. It&amp;rsquo;s called Flood Element, and Element is built to be performance-first because obviously, that&amp;rsquo;s what we had in mind when we were building it. It takes everything that&amp;rsquo;s good about Puppeteer and makes it really easy to set parameters that you normally would expect to need for load testing, like users and ramp-up.&lt;/p&gt;
&lt;p&gt;This also means that it&amp;rsquo;s way less resource-intensive. I said that with Selenium, you can run up to five users on an AWS m5.xlarge instance, and for the same instance type, you can run, from our experiments, anywhere from 30-50 Element scripts/users. That is a huge saving when you&amp;rsquo;re running a really large-scale test.&lt;/p&gt;
&lt;h2 id="should-you-choose-selenium-or-puppeteer-for-load-testing"&gt;Should you choose Selenium or Puppeteer for load testing?&lt;/h2&gt;
&lt;p&gt;I would say that if you already have a large Selenium automation suite, if you have a complex test scenario, or if you aren&amp;rsquo;t running that many users for your load test, then Selenium is a great choice. If you ARE running thousands of users, though, and resource efficiency, and therefore cost efficiency, is really important to you, then choose Element.&lt;/p&gt;
&lt;p&gt;My advice is always to try both. If you have the time, do a proof of concept with both of them. That way, your whole team can better understand what the pros and cons are for each one and decide which one is best going forward. Or maybe you don&amp;rsquo;t even decide on one. At Flood, we support both of them at the same price, so it depends on what you prefer.&lt;/p&gt;
&lt;p&gt;Until next time, happy flooding!&lt;/p&gt;</description></item><item><title>Ask a Flooder 11: What are the best JMeter plugins?</title><link>https://nicolevanderhoeven.com/blog/20200414-aaf11/</link><pubDate>Tue, 14 Apr 2020 19:47:53 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200414-aaf11/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/ask-a-flooder-11-what-are-the-best-jmeter-plugins"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/ask-a-flooder-11-what-are-the-best-jmeter-plugins"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In this video, I talk about how to install the JMeter Plugin Manager as well as other plugins, what the best JMeter plugins are, and why you need them. JMeter is an open-source load testing tool that is already robust, but there are some fantastic plugins that have been developed for it that you might want to use in your next load test.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/eYyLoH-FQrk?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Audio version here:&lt;/p&gt;
&lt;iframe src="https://open.spotify.com/embed-podcast/episode/36GUgvf17bRwmJxg8CNkvy" width="100%" height="232" frameborder="0" allowtransparency="true" allow="encrypted-media"&gt;&lt;/iframe&gt;
&lt;p&gt;Hi everyone, Nicole here, back again for another Ask a Flooder, and I hope everybody is staying alert, not anxious, during these crazy times. In today&amp;rsquo;s Ask a Flooder, our customer asks: &amp;ldquo;What are the best JMeter plugins?&amp;rdquo;&lt;/p&gt;
&lt;h2 id="what-is-a-jmeter-plugin"&gt;What is a JMeter plugin?&lt;/h2&gt;
&lt;p&gt;So first, I want to talk about what a JMeter plugin is and how you can actually install one. Apache JMeter is a really great, robust load testing that is one of my personal favorites. There are still some things that could be done better or could be extended, and the great thing about being an open-source tool is that anybody, pretty much, can just jump in and develop these plugins for JMeter to extend functionality, so that it supports more protocols or to customize load profiles in a way that is easier. We already have &lt;a href="https://flood.io/blog/jmeter-plugins-the-top-10-plugins-and-how-they-help"&gt;a blog post on this&lt;/a&gt;, and I will leave a link to that article as well in the description because it goes into a lot more detail. However, I still want to give you my personal top 3 JMeter plugins.&lt;/p&gt;
&lt;h2 id="how-do-you-install-a-jmeter-plugin"&gt;How do you install a JMeter plugin?&lt;/h2&gt;
&lt;p&gt;You can install a plugin for JMeter in two ways.&lt;/p&gt;
&lt;p&gt;One is to download it from &lt;a href="https://jmeter-plugins.org/"&gt;JMeter Plugins&lt;/a&gt;, which I will give you a link to, and then you paste that into either the lib — it&amp;rsquo;s usually in the lib folder, but it could be in the ext (extensions) folder. Each plugin is going to differ as to what you need to copy into what folder, but that&amp;rsquo;s why I prefer the second method, which is the &lt;a href="https://jmeter-plugins.org/wiki/PluginsManager/"&gt;Plugin Manager&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The Plugin Manager is a plugin itself, so you will initially need to do that copy and pasting of the jar file. Once you have the JMeter Plugin Manager installed, downloading and installing a plugin is as simple as choosing which ones you want and then clicking install. JMeter restarts, and that&amp;rsquo;s pretty much it. So I do recommend that the Plugin Manager be the first plugin that you install. But that&amp;rsquo;s still not my top 3 favorite - that&amp;rsquo;s just an optional step.&lt;/p&gt;
&lt;h2 id="what-are-the-top-3-jmeter-plugins"&gt;What are the top 3 JMeter plugins?&lt;/h2&gt;
&lt;h3 id="custom-thread-groups"&gt;Custom Thread Groups&lt;/h3&gt;
&lt;p&gt;Now for the actual plugins. My #1 favorite is the Custom Thread Groups. See, with JMeter, you get the standard default thread group, and all that does is it asks you how many users you want to run, how many loops, the duration, and the ramp-up. That&amp;rsquo;s it. So that&amp;rsquo;s good for a lot of uses, but it doesn&amp;rsquo;t really help you in cases where maybe you want to plan a spike test, and you want to make sure that all the users have fully ramped up and gotten to a certain point, and then all hit the server at once. Or maybe you want to do a step load. Previously I&amp;rsquo;ve discussed stress testing and how a step load can be useful for that. In that case, the Thread Group doesn&amp;rsquo;t quite cut it because it only ramps up a user, and then it continues at the same level of load for the duration of the test.&lt;/p&gt;
&lt;p&gt;So, if you want any sort of variation in the middle (increasing users or decreasing), then you&amp;rsquo;re going to want something else.The Custom Thread Groups plugin has a lot of different types of thread groups. My favorite is the Ultimate One because you can probably do almost anything on that one. It also has the Stepping, Concurrency, Arrivals, and Free-Form Arrivals, so you have quite a few options.&lt;/p&gt;
&lt;h3 id="throughput-shaping-timer"&gt;Throughput Shaping Timer&lt;/h3&gt;
&lt;p&gt;Plugin #2 is the Throughput Shaping Timer. I love it because not a lot of load testing tools, even the proprietary ones, actually have this. This is really handy when you have a project where you&amp;rsquo;re given a requirement that isn&amp;rsquo;t in terms of the number of users; it&amp;rsquo;s in terms of hits per second, or requests per second, or something to do with the actual throughput of the test.&lt;/p&gt;
&lt;p&gt;The problem with that is that the throughput tends to change, so you can&amp;rsquo;t actually take as a given that it&amp;rsquo;ll remain constant for the duration of the test. Things like response time or latency are going to affect that throughput. For instance, when you have one user or one thread that&amp;rsquo;s running, and it sends a request and receives the response back in one second, you can&amp;rsquo;t necessarily say that that&amp;rsquo;s going to be the same when there are a thousand threads doing the same thing. The server&amp;rsquo;s under more load, so maybe it&amp;rsquo;ll take five seconds instead of one second— but that&amp;rsquo;s already changed your throughput. Before, one thread was doing one request per second, and now it&amp;rsquo;s doing one request every five seconds.&lt;/p&gt;
&lt;p&gt;So it can get a little complicated, and the Throughput Shaping Timer is one of my favorites because it promises to solve all that. The Throughput Shaping Timer dynamically changes the think time, so at the beginning of a test, for instance, when there are no response time issues and requests are being returned really quickly, it might increase the think time so that it slows down your load test. So you&amp;rsquo;re not going over that throughput that you wanted to maintain. And then later on in the test, when all the users are ramped up, then it&amp;rsquo;ll decrease the think time that it uses. So it&amp;rsquo;s great because you just have this consistent throughput throughout your test. It&amp;rsquo;s a really intelligent way to test.&lt;/p&gt;
&lt;p&gt;I do want to say, though, that you do also want to play around with this a bit and make sure you understand how this works. One page could have several requests in it, and you&amp;rsquo;ll want to take that into consideration when you&amp;rsquo;re choosing what to set in that timer.&lt;/p&gt;
&lt;h3 id="http2-request-sampler"&gt;HTTP/2 Request Sampler&lt;/h3&gt;
&lt;p&gt;My #3 is the HTTP/2 Sampler. If you don&amp;rsquo;t know what HTTP/2 is, it&amp;rsquo;s an upgraded or next-generation protocol to the normal HTTP that we already use. The HTTP/2 protocol is supposed to be faster and more efficient, so more and more web apps are switching to it because of that.&lt;/p&gt;
&lt;p&gt;The problem is that JMeter&amp;rsquo;s HTTP request sampler is only really for HTTP sites, so the HTTP/2 sampler is an upgraded version of the HTTP sampler. It&amp;rsquo;s really easy to use. The experience is pretty much going to be the same for you, but in the background, it uses the faster HTTP/2 protocol rather than the slower one.&lt;/p&gt;
&lt;p&gt;My colleague, Jason Rizio, actually &lt;a href="https://flood.io/blog/jmeter-tutorial-http2-test"&gt;wrote a whole blog post about this&lt;/a&gt;, so if you want to learn more, I will put a link in the description.&lt;/p&gt;
&lt;p&gt;I hope that answered your question, and until next time, happy flooding!&lt;/p&gt;</description></item><item><title>Introducing Flood Agent: standalone infrastructure for load testing</title><link>https://nicolevanderhoeven.com/blog/20200407-introducing-flood-agent/</link><pubDate>Tue, 07 Apr 2020 19:03:42 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200407-introducing-flood-agent/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/introducing-flood-agent-standalone-infrastructure-for-load-testing"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/introducing-flood-agent-standalone-infrastructure-for-load-testing"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Working from home during this pandemic and wondering how to start load tests from the office? Today, we&amp;rsquo;re officially introducing Flood Agent, a way to turn your own physical or virtual machines into load generators that you can control from anywhere with an internet connection.&lt;/p&gt;
&lt;h2 id="tldr"&gt;TL;DR:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Installing Flood Agent on a machine lets you start load tests on it remotely from Flood—even if it&amp;rsquo;s within a corporate VPN.&lt;/li&gt;
&lt;li&gt;Flood Agent is a simple binary that you can install on Linux, macOS, and Windows machines.&lt;/li&gt;
&lt;li&gt;Once you&amp;rsquo;ve installed Flood Agent, your machines show up on the Flood web app to use as load generators or grids.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="boldly-going-where-no-one-has-gone-before"&gt;Boldly going where no one has gone before&lt;/h2&gt;
&lt;p&gt;Load testing within your company&amp;rsquo;s VPN and trying to coordinate it from home is like being on a maintenance pod trying to contact your starship, but a Mazarite ship is broadcasting a jamming signal, so comms are down. That Mazarite ship is your company&amp;rsquo;s firewall, and it can make testing difficult.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/20200407-01.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;The easiest way around this is to provision load generators in the cloud. However, because your application servers are still behind a firewall, you&amp;rsquo;d need to convince IT security to &lt;a href="https://guides.flood.io/test-execution/infrastructure/static-ip-addresses#hosted-grids"&gt;whitelist the IP addresses&lt;/a&gt; of the load generators. Depending on how tight security policies are, this may not be an option even in this new world of remote working.&lt;/p&gt;
&lt;p&gt;Flood Agent is a way to start load tests on Flood from the load generators you already have. It&amp;rsquo;s a cross-platform agent that you can install on your regular load generators, allowing you to control them on Flood.&lt;/p&gt;
&lt;p&gt;‍‍&lt;img src="https://nicolevanderhoeven.com/assets/20200407-02.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Flood Agent is kind of like the &lt;a href="https://en.wikipedia.org/wiki/Borg#Borg_Collective"&gt;Borg Collective&lt;/a&gt;. Each machine that you install Flood Agent on is assimilated into the Borg. A hive mind (you, on the Flood site) controls all Borgs, coordinating test execution with robotic efficiency.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://media.giphy.com/media/J6P7vFEQ6PcgE/giphy.gif" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Check out this video to follow along as I walk you through the process of setting up Flood Agent, or you can keep reading for the text version.&lt;/p&gt;
&lt;p&gt;‍&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/6VFn96aKSU8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
‍&lt;/p&gt;
&lt;h2 id="installing-and-configuring-flood-agent"&gt;Installing and configuring Flood Agent&lt;/h2&gt;
&lt;p&gt;Flood Agent is a free binary, and it runs on Linux, Mac, or Windows machines. You can &lt;a href="https://github.com/flood-io/flood-agent/releases/latest"&gt;download the appropriate version&lt;/a&gt; for your operating system and then follow the installation instructions here for more information:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://guides.flood.io/infrastructure/standalone-infrastructure/getting-started-on-linux"&gt;Getting started on Linux&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://guides.flood.io/infrastructure/standalone-infrastructure/getting-started-on-macos"&gt;Getting started on macOS&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://guides.flood.io/infrastructure/standalone-infrastructure/getting-started-on-windows"&gt;Getting started on Windows&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;After installing Flood Agent, you can configure it according to how you want to use it. Start Flood Agent in your terminal and use the configure functionality. Here&amp;rsquo;s what that command looks like on macOS, but you can follow the links above for other operating systems:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./flood-agent configure
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="linking-your-flood-account"&gt;Linking your Flood account&lt;/h3&gt;
&lt;p&gt;The command above yields a prompt for a token like this:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200407-03.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;This token allows Flood to run load tests on the load generator that you&amp;rsquo;ve installed Flood Agent in. To get the token, go to the &lt;a href="https://app.flood.io/account/api"&gt;API Access page&lt;/a&gt; on your Flood account (&lt;a href="https://app.flood.io/sign-up"&gt;you already have one, don&amp;rsquo;t you?&lt;/a&gt;) and click REVEAL token.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200407-04.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;You should see a string of characters like this:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200407-05.jpg" alt="" loading="lazy" decoding="async"&gt;
‍&lt;/p&gt;
&lt;p&gt;Copy your token (anything after the = sign) and paste it into the Flood Agent terminal window.&lt;/p&gt;
&lt;h3 id="choosing-load-testing-tools"&gt;Choosing load testing tools&lt;/h3&gt;
&lt;p&gt;Next, you can choose which tools you&amp;rsquo;d like to set up and which version of those tools Flood Agent uses to run your tests.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/20200407-06.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Starting with JMeter, Flood Agent asks you which of the tools you&amp;rsquo;d like to configure. You can choose to set up your tools at the beginning so that you don&amp;rsquo;t have to set them up again, or you can go back to this configuration wizard at any point to add another tool. Either way, you need to provide the tools that you select in one of two ways: via a Docker image supplied by Flood, or via a &lt;a href="https://guides.flood.io/infrastructure/standalone-infrastructure/getting-started-local-jmeter-and-gatling"&gt;local installation&lt;/a&gt; that you already have.&lt;/p&gt;
&lt;p&gt;For this example, I chose to configure JMeter and to use a local installation. Local installations give you the most flexibility because you can use the version of the tool that you prefer, along with any special plugins. However, if you already have Docker installed or don&amp;rsquo;t want to manually install JMeter separately, you can also use our Docker image for JMeter.&lt;/p&gt;
&lt;p&gt;Selecting a local installation prompts you to provide the location of that directory:&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/20200407-07.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;For JMeter, this looks something like &lt;code&gt;/Users/nvanderhoeven/jmeter/apache-jmeter-5.1.1.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;After you enter this file path, Flood Agent checks to make sure the directory is valid. You can also set the configuration for other tools in this dialog.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200407-08.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;After you finish the configuration, the wizard writes to a config.yaml file in your Flood Agent directory. You can also edit this configuration file directly in the future if you prefer.&lt;/p&gt;
&lt;h2 id="verifying-flood-agent-configuration"&gt;Verifying Flood Agent configuration&lt;/h2&gt;
&lt;p&gt;To run a final check on whether Flood Agent has been installed correctly, type &lt;code&gt;./flood-agent check&lt;/code&gt;. You should see a summary of the configuration options you selected as well as some connectivity and validity checks, like this:&lt;/p&gt;
&lt;p&gt;‍
&lt;img src="https://nicolevanderhoeven.com/assets/20200407-09.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;These green check marks mean you&amp;rsquo;re good to go! If you&amp;rsquo;re running Flood Agent from within a corporate network, though, you may see some errors here.&lt;/p&gt;
&lt;h2 id="troubleshooting-network-connectivity-within-a-corporate-network"&gt;Troubleshooting network connectivity within a corporate network&lt;/h2&gt;
&lt;p&gt;If your company already has a web proxy, check out &lt;a href="https://guides.flood.io/infrastructure/standalone-infrastructure/deployment/integrating-with-a-web-proxy"&gt;our guide on running floods through this proxy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Please ensure that the load generator that you&amp;rsquo;ve installed Flood Agent on has access to the following endpoints:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;https://drain.flood.io&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;https://beacon.flood.io&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;https://vault.flood.io&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;https://flood-archives.s3-accelerate.amazonaws.com&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;https://logs.us-east-1.amazonaws.com&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;https://sns&amp;gt;.*.amazonaws.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;https://sqs&amp;gt;.*.amazonaws.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You may need to request these from your IT department.&lt;/p&gt;
&lt;p&gt;If you get stuck, please contact us at &lt;a href="mailto:support@flood.io"&gt;support@flood.io&lt;/a&gt;. We&amp;rsquo;d love to go over your specific situation and get you up and running.&lt;/p&gt;
&lt;p&gt;Once Flood Agent returns a successful check, you can start up your own grid!&lt;/p&gt;
&lt;h2 id="turning-your-machine-into-a-flood-grid"&gt;Turning your machine into a Flood grid&lt;/h2&gt;
&lt;p&gt;A grid, in Flood terminology, is a group of machines to be used for load generation. To make your machine a grid, run this command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./flood-agent --grid askaflooder
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;where &lt;code&gt;askaflooder&lt;/code&gt; is the name of your grid.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/20200407-10.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Once you see those [agent] ready and awaiting next job messages, you&amp;rsquo;re ready to run your test!&lt;/p&gt;
&lt;h2 id="running-a-load-test-on-your-own-infrastructure"&gt;Running a load test on your own infrastructure&lt;/h2&gt;
&lt;p&gt;Log into your account on Flood, if you aren&amp;rsquo;t already, and &lt;a href="https://guides.flood.io/overview-of-flood/scripting-your-load-test#creating-a-stream"&gt;create a new stream&lt;/a&gt; like you normally would, uploading your load testing script and data files. When &lt;a href="https://guides.flood.io/overview-of-flood/launching-your-test"&gt;launching your test&lt;/a&gt;, though, select the option for Hosted infrastructure and then choose the grid with Flood Agent running on it.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/20200407-11.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Go ahead and launch your test. Congratulations, you&amp;rsquo;re now set up to run a load test on your on-premise load generators!&lt;/p&gt;
&lt;h2 id="giving-it-a-go"&gt;Giving it a go&lt;/h2&gt;
&lt;p&gt;Flood Agent is a free download, so you&amp;rsquo;ll only need to pay when you run load tests on Flood. However, we also have a free tier— perfect for a proof-of-concept while you&amp;rsquo;re working from home.&lt;/p&gt;
&lt;p&gt;If you have any questions about Flood Agent, check out &lt;a href="https://guides.flood.io/infrastructure/standalone-infrastructure/flood-agent"&gt;our documentation&lt;/a&gt; or &lt;a href="mailto:support@flood.io"&gt;email us&lt;/a&gt;. We&amp;rsquo;d be happy to get you started!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/flood-io/flood-agent/releases"&gt;Download Flood Agent for free here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/20200407-12.gif" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;</description></item><item><title>Ask a Flooder 10: What is the difference between load testing and stress testing?</title><link>https://nicolevanderhoeven.com/blog/20200406-aaf10/</link><pubDate>Mon, 06 Apr 2020 20:26:24 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200406-aaf10/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/ask-a-flooder-10-what-is-the-difference-between-load-testing-and-stress-testing-video"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/ask-a-flooder-10-what-is-the-difference-between-load-testing-and-stress-testing-video"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;What&amp;rsquo;s the difference between load testing and stress testing? When should you choose to run a load test on your application, and when is a stress test more appropriate? Well, it&amp;rsquo;s all in the intention.&lt;/p&gt;
&lt;p&gt;‍&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/igP2q__zMcc?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;Hi everyone, Nicole here again, back with another Ask a Flooder, and this time the question is:&lt;/p&gt;
&lt;h2 id="what-is-the-difference-between-load-testing-and-stress-testing"&gt;What is the difference between load testing and stress testing?&lt;/h2&gt;
&lt;p&gt;Okay, again, this is a matter of semantics, but I think the difference is in the intention. Load testing and stress testing are both types of back-end performance testing, and I did also make a video on it that I&amp;rsquo;ll link in the description down below.&lt;/p&gt;
&lt;h3 id="load-testing-is-about-seeing-how-your-server-reacts-to-finite-load"&gt;Load testing is about seeing how your server reacts to finite load&lt;/h3&gt;
&lt;p&gt;Now, with load testing, you usually have to start with a specific idea of the load profile that you want to test. You get to this number by looking through your Google Analytics or other analytics on your site to see what load you need to test at, and then the intention is to see how your server responds to that load. So the load is fixed: you know WHAT you want to test, and you just want to see how the server reacts to it. So it&amp;rsquo;s more finite in scope. In general, it&amp;rsquo;s also more about how your server reacts to normal or expected load, whether that&amp;rsquo;s now or in the future.&lt;/p&gt;
&lt;h3 id="stress-testing-explores-your-applications-upper-limits"&gt;Stress testing explores your application&amp;rsquo;s upper limits&lt;/h3&gt;
&lt;p&gt;Stress testing, on the other hand, is a little bit more open-ended and a little bit more destructive. So instead of starting with how much load you want to put on [your server], in stress testing, what you generally do is you increase the load. You usually use a step load profile: so you start a certain number of users, you wait maybe 30 minutes, and then you increase it again. And you end up with this staircase kind of load profile. What you&amp;rsquo;re doing there is you just let it increase until your server fails because the intention of stress testing is to get your server to fail. And, once it fails, does it fail gracefully? Does it show an error message? These are really things that test the upper limits of your server, and that&amp;rsquo;s what stress testing really is.&lt;/p&gt;
&lt;h3 id="they-can-be-interchangeable"&gt;They can be interchangeable&lt;/h3&gt;
&lt;p&gt;At Flood, we tend to use the word &amp;ldquo;load&amp;rdquo; testing to refer to both kinds of testing because both of them entail applying load on your application server. It&amp;rsquo;s not really that important to distinguish between one or another; what&amp;rsquo;s [important] is that your team uses the same definition so that when YOU say &amp;ldquo;load testing,&amp;rdquo; they know what you mean.&lt;/p&gt;
&lt;p&gt;Until the next time, happy flooding!&lt;/p&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://nicolevanderhoeven.com/blog/20200324-aaf07"&gt;Video on performance testing vs load testing&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Real-life stress testing in action: &lt;a href="https://nicolevanderhoeven.com/blog/20200309-fomo-and-performance-testing"&gt;Robinhood app failure&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Ask a Flooder 09: What are the best tools for load testing?</title><link>https://nicolevanderhoeven.com/blog/20200331-aaf09/</link><pubDate>Tue, 31 Mar 2020 20:35:36 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200331-aaf09/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/ask-a-flooder-09-what-are-the-best-tools-for-load-testing-video"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/ask-a-flooder-09-what-are-the-best-tools-for-load-testing-video"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;One of our most commonly-asked questions is: &amp;ldquo;What are the best tools for load testing?&amp;rdquo; The answer will depend on a few things: your reason for load testing, the application you want to test, what kind of load testing you want to carry out, your team&amp;rsquo;s experience with scripting, and how many virtual users you want to run.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: In this video, I say that traditional load testing tools can&amp;rsquo;t simulate requests that are triggered by interactions on the client-side. This isn&amp;rsquo;t technically true: if you know what the requests are, you can build those requests manually on a protocol-level tool (like JMeter or Gatling). However, this takes more work compared to browser-level tools that just do this natively.&lt;/em&gt;
‍
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/I5Wo6x2OoZU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;Transcript:&lt;/p&gt;
&lt;p&gt;Hi everyone, Nicole back again with another Ask a Flooder, and this time I&amp;rsquo;m tackling one of the questions we get asked A LOT, which is:&lt;/p&gt;
&lt;h2 id="what-are-the-best-tools-for-load-testing"&gt;What are the best tools for load testing?&lt;/h2&gt;
&lt;h3 id="why-open-source-load-testing-tools-are-awesome"&gt;Why open-source load testing tools are awesome&lt;/h3&gt;
&lt;p&gt;Now, I want to preface this by saying that we really love open-source tools here at Flood, because 1) they&amp;rsquo;re really pretty full-fledged these days. You don&amp;rsquo;t have to make any compromises on features, and, in fact, some of these open-source tools have more features than some newer load testing tools just because they&amp;rsquo;ve been out longer. And secondly, they have large communities. Because they&amp;rsquo;re open-source, lots of people are using it, and lots of people are developing for it. So there are lots of plugins normally, and they support any kind of protocol that you can think of. And lastly, cost. It&amp;rsquo;s hard not to mention cost because it can be a really important factor depending on the budget of your project. And if you&amp;rsquo;re starting out as a load tester, I think that it might even be the best way to start with load testing, because you can take that knowledge with you and apply it to other projects and other companies regardless of the budget that they have.&lt;/p&gt;
&lt;h3 id="questions-to-ask-yourself-in-choosing-a-load-testing-tool"&gt;Questions to ask yourself in choosing a load testing tool&lt;/h3&gt;
&lt;h4 id="why-are-you-doing-load-testing"&gt;Why are you doing load testing?&lt;/h4&gt;
&lt;p&gt;I always advocate starting with WHY. Why are you actually load testing? Is there a particular production defect that you noticed that you&amp;rsquo;re trying to solve? Is there already a problem, or are you just preparing to launch? These are things that are going to inform the type of tool that you use because you might want to make sure that that tool supports the protocols that you need.&lt;/p&gt;
&lt;h4 id="what-are-you-load-testing"&gt;What are you load testing?&lt;/h4&gt;
&lt;p&gt;Secondly, what type of app are you testing? Because if you have a single-page app, where your end-user is interacting with the page and client-side scripts are running to make requests to servers, then that&amp;rsquo;s something that most traditional load testing tools aren&amp;rsquo;t going to be able to do.&lt;/p&gt;
&lt;p&gt;There are two general types of load testing tools: there&amp;rsquo;s browser-based, and there&amp;rsquo;s protocol-based. I&amp;rsquo;ll leave a link in the description talking about the differences between the two, but in general, if you want to go for browser-level testing, I would suggest Selenium and Element. Now, they&amp;rsquo;re both very good options. Selenium is probably the more robust in terms of automation of the two, but Element is better one in terms of efficiency because it was built with performance in mind. So Selenium&amp;rsquo;s automation-first and Element is really performance-first.&lt;/p&gt;
&lt;p&gt;Now, for protocol-level tools, you can&amp;rsquo;t go wrong with either JMeter or Gatling.&lt;/p&gt;
&lt;h4 id="what-experience-does-your-team-have-with-scripting"&gt;What experience does your team have with scripting?&lt;/h4&gt;
&lt;p&gt;Thirdly, what&amp;rsquo;s the level of technical expertise that your team has? I think it&amp;rsquo;s important to be realistic about what your team can do, given the amount of time that they have. So if you have a team that has never done load testing and has never done any scripting before, then I would suggest using our Test Builder or something similar. On Flood, we have a Test Builder that is really just an easy interface that actually runs JMeter under the hood, but it just kind of simplifies JMeter and boils it down to what are the URLs that you want to test. That is a really easy way to get started, and it&amp;rsquo;s also a great [way to run a] proof of concept. If you have some automation testers on your team that are trying to do the load testing, well, maybe you should stick to tools that they already use. So it might be easier for them to get up and running with either Selenium or Element rather than learning a new tool. And if you have developers on your team, you might consider Ruby JMeter rather than the vanilla JMeter because Ruby JMeter is a lot easier to deal with&amp;mdash; because you don&amp;rsquo;t have to deal with the XML files of a JMeter file (a normal JMX script). You can just plan out your load tests in Ruby. Or, Gatling is also a really good option because it allows you to write scripts in Scala. Scala is really really powerful, and you can create an entire framework with Gatling, which is also something to keep in mind.&lt;/p&gt;
&lt;h4 id="how-many-virtual-users-do-you-want-to-run-in-your-load-tests"&gt;How many virtual users do you want to run in your load tests?&lt;/h4&gt;
&lt;p&gt;And lastly, how many users do you want to simulate? Now protocol-level tools are going to really shine here because Element and Selenium both require a higher usage of resources on your load generators just because of the complexities involved in starting a browser instance, whereas protocol-level tools are just super efficient at sending these requests. So I would suggest that if you&amp;rsquo;re talking about thousands of users, I would use the protocol-level tools unless there&amp;rsquo;s a really good reason why that&amp;rsquo;s not going to give you the results that you&amp;rsquo;re looking for. Between JMeter and Gatling&amp;ndash; well, they&amp;rsquo;re both excellent tools, but Gatling has been shown to particularly be good for really high levels of usage. But JMeter is also a good alternative, and you can run thousands of users of JMeter without any problem.&lt;/p&gt;
&lt;h2 id="just-get-started"&gt;Just get started!&lt;/h2&gt;
&lt;p&gt;As always, I&amp;rsquo;d suggest just getting started. Pick whatever tool sounds like it might be the best for you, do a proof of concept on that one, and you can always try the other ones as well. On Flood, we don&amp;rsquo;t restrict you to just using one tool, so you can use one; you can use all four; you can run them at the same time if you want. It all depends on what you need for your testing.&lt;/p&gt;
&lt;p&gt;Till next time, happy flooding!&lt;/p&gt;</description></item><item><title>Ask a Flooder 08: Why is concurrent users an ambiguous measure of throughput?</title><link>https://nicolevanderhoeven.com/blog/20200326-aaf08/</link><pubDate>Thu, 26 Mar 2020 20:41:22 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200326-aaf08/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/ask-a-flooder-08-why-is-concurrent-users-an-ambiguous-measure-of-throughput-video"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/ask-a-flooder-08-why-is-concurrent-users-an-ambiguous-measure-of-throughput-video"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;What is the meaning of concurrent users in performance testing? You might have seen concurrent users in JMeter or other tools, but what does it mean and how can you use the term properly?&lt;/p&gt;
&lt;p&gt;&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/uJE2hm50TIw?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
‍&lt;/p&gt;
&lt;p&gt;Transcript:&lt;/p&gt;
&lt;p&gt;Hi everyone! Nicole here again for another Ask a Flooder, except this time it&amp;rsquo;s not really a question&amp;ndash; it&amp;rsquo;s just something I want to talk about.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200326-01.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Source: The &lt;a href="https://twitter.com/flood_io/status/1224284942932332544"&gt;Flood Twitter account&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;So I&amp;rsquo;m going to put the tweet up here, but last month I actually tweeted about something that somebody else posted. Netflix actually reported some of their viewership figures, and one thing that they reported was that 76 million households watched their new show, The Witcher, which is a large amount of people. So I posted something about why concurrent users is actually an ambiguous way to measure throughput, and I want to expound a little bit more on that.&lt;/p&gt;
&lt;h2 id="concurrent-users-in-performance-testing---limitations"&gt;&amp;ldquo;Concurrent users&amp;rdquo; in performance testing - limitations&lt;/h2&gt;
&lt;p&gt;In load testing, the number of concurrent users is a pretty standard measure of throughput, and generally, it means the number of users that are accessing an application at any one point in time. And even on Flood, we use it because it&amp;rsquo;s a really good rule of thumb. When we want to get a feel for how big a test is, load testers generally ask, &amp;ldquo;How many users?&amp;rdquo; However, we should be aware, as load testers, that that doesn&amp;rsquo;t always give us the full picture.&lt;/p&gt;
&lt;h3 id="what-type-of-user-is-it"&gt;What type of user is it?&lt;/h3&gt;
&lt;p&gt;For instance, the type of user that it is can really change the traffic. Sometimes mobile browsers will optimize requests so that they send fewer because they realize that mobile networks are slower.&lt;/p&gt;
&lt;h3 id="what-is-the-user-doing"&gt;What is the user doing?&lt;/h3&gt;
&lt;p&gt;Secondly, what is the user doing? Are they browsing on different tabs all the time? Or are they just refreshing the content on the same tab? Because if they&amp;rsquo;re just using the same page and fetching it over and over again, then caching could come into play, so that would create a different load on the system.&lt;/p&gt;
&lt;h3 id="how-long-is-the-user-doing-it"&gt;How long is the user doing it?&lt;/h3&gt;
&lt;p&gt;And thirdly, how long is the user doing it? Are we talking about a sustained load for an hour, or is it a shorter time period, like a spike test of five minutes where all the users just ram a system? There are things like the number of requests per second that you need to take into account, which is affected by the think time and the delays that you set in your script. Perhaps your script has a user that just sends a request, then waits for a minute, and then sends another request. That&amp;rsquo;s very different from a user just sending one request after another as fast as possible.&lt;/p&gt;
&lt;h3 id="when-does-the-user-do-it"&gt;When does the user do it?&lt;/h3&gt;
&lt;p&gt;Lastly, it&amp;rsquo;s also important to take into account the seasonality of the request. When does the user do it? If you have a timesheeting application, for instance, then it might only get traffic on Fridays and a little bit on Monday, so you need to specify, when you report these numbers, whether it&amp;rsquo;s for the peak time period on Friday - you know, around 3 pm or something - or you&amp;rsquo;re reporting on figures from a Wednesday when there really wouldn&amp;rsquo;t be that many people accessing it.&lt;/p&gt;
&lt;p&gt;In the case of Netflix, what they counted as a view was only a two-minute watch time. So if you&amp;rsquo;re one of those people who went into The Witcher and didn&amp;rsquo;t watch past two minutes, that still counted as a view. So the 76 million users is still not completely accurate, because not all of those people would have watched the entire thing.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Concurrent users is a good way in order to get a quick feel of the throughput that a test outputs, but it really needs to be examined in context along with things like requests per second and the network throughput (kbps) in order to get a really good understanding of how much load a test is generating.&lt;/p&gt;
&lt;p&gt;Till next time, happy flooding!&lt;/p&gt;</description></item><item><title>Ask a Flooder 07: What is the difference between performance testing and load testing?</title><link>https://nicolevanderhoeven.com/blog/20200324-aaf07/</link><pubDate>Tue, 24 Mar 2020 20:31:06 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200324-aaf07/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/ask-a-flooder-07-what-is-the-difference-between-performance-testing-and-load-testing-video"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/ask-a-flooder-07-what-is-the-difference-between-performance-testing-and-load-testing-video"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In a two-for-one Ask a Flooder, I answer two questions: What is the difference between performance testing and load testing and in which situations is performance testing a better option than load testing?&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/8CueAkDY5yE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Transcript:&lt;/p&gt;
&lt;p&gt;Hi again, it&amp;rsquo;s Nicole back for another Ask a Flooder. And this time, the question from one of our customers is:&lt;/p&gt;
&lt;h2 id="what-is-the-difference-between-performance-testing-and-load-testing"&gt;What is the difference between performance testing and load testing?&lt;/h2&gt;
&lt;p&gt;Now, this is really a matter of semantics, and it kind of depends on whom you ask, but in general, performance is how quickly an application responds. So when you&amp;rsquo;re doing performance testing, you&amp;rsquo;re doing one of two things: there&amp;rsquo;s front-end performance, and then there&amp;rsquo;s back-end performance.&lt;/p&gt;
&lt;p&gt;In front-end performance, you&amp;rsquo;re looking at things like how quickly does the application render for the customer on the client-side. It&amp;rsquo;s how fast something renders on the screen, so it&amp;rsquo;s how page resources can be rearranged or optimized so that the experience is a lot faster for the end customer. So the focus is on the client-side on the end user&amp;rsquo;s actual device.&lt;/p&gt;
&lt;p&gt;On the back-end performance side, you&amp;rsquo;re looking at the server. How quickly does the server send a response to a request that&amp;rsquo;s sent by the browser?&lt;/p&gt;
&lt;p&gt;So those are really two different things because back-end performance really looks at everything outside - everything beyond - the device of the customer. Both kinds of performance testing are important. A solid, holistic performance testing strategy will incorporate both front-end and back-end performance.&lt;/p&gt;
&lt;p&gt;There are different types of back-end performance testing. You might have heard of load testing, stress testing, volume testing. At Flood, we kind of refer to all of those under the bracket of load testing. They do have some semantic differences between them, but in general, we talk about load testing to refer to simulating traffic against an application server to see how that server responds.&lt;/p&gt;
&lt;p&gt;Now the type of the testing that you want to do will also affect the kind of performance testing tool that you choose. For instance, a tool like Flood Element can do both front-end and back-end testing, but a tool like JMeter is only going to be useful for the back-end performance testing. So you need to choose your test according to the testing type that you&amp;rsquo;d like to carry out.&lt;/p&gt;
&lt;p&gt;This customer also had a follow-up question:&lt;/p&gt;
&lt;h2 id="in-which-situations-is-performance-testing-a-better-option-than-load-testing"&gt;In which situations is performance testing a better option than load testing?&lt;/h2&gt;
&lt;p&gt;And one answer to this is when front-end performance is required. So if what you&amp;rsquo;re after is trying to speed up how quickly your application renders on a mobile device, for instance, you might be better off looking at tools like GTMetrix or WebPageTest in order to measure and improve that side of it.&lt;/p&gt;
&lt;p&gt;I really want to stress here that neither front-end performance nor back-end performance is better than the other. If you&amp;rsquo;re asking me which type of testing you should do, my answer would be both. Till next time, happy flooding!&lt;/p&gt;</description></item><item><title>Ask a Flooder 06: How to record traffic from a mobile app with JMeter</title><link>https://nicolevanderhoeven.com/blog/20200319-aaf06/</link><pubDate>Thu, 19 Mar 2020 20:50:44 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200319-aaf06/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/ask-a-flooder-06-how-to-record-traffic-from-a-mobile-app-with-jmeter-video"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/ask-a-flooder-06-how-to-record-traffic-from-a-mobile-app-with-jmeter-video"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;How do you record the traffic from your native mobile app using Apache JMeter? In this video, I explain step-by-step how to begin load testing a native mobile app.&lt;/p&gt;
&lt;p&gt;‍&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/VVUyYF1VPlo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;You might want to be doing this because you&amp;rsquo;re load testing a mobile app but either you don&amp;rsquo;t have access to your developers right now so they can&amp;rsquo;t help you with how the requests are made or what the requests are, or maybe you just want to verify what you&amp;rsquo;ve already been told. Either way, I&amp;rsquo;m going to show you how using my Android device (it&amp;rsquo;s a Samsung Galaxy Note 10+) and a Macbook Pro 13&amp;quot;. However, the same principles should apply to other mobile devices and laptops.&lt;/p&gt;
&lt;h2 id="step-1-download-and-install-the-mobile-app"&gt;Step 1: Download and install the mobile app&lt;/h2&gt;
&lt;p&gt;The first thing you&amp;rsquo;ll want to do is download and install the app. Now, if the app has already been released, then that&amp;rsquo;s no problem. You just go to the Google Play Store and download it. However, if it hasn&amp;rsquo;t been released yet and you&amp;rsquo;ve been given an APK file for the app, then you&amp;rsquo;ll have to tweak your settings a little bit in order to get your phone to allow you to download it.&lt;/p&gt;
&lt;p&gt;And I&amp;rsquo;m going to do this right with you. So go into Settings: pull down the little notification screen and hit the little gear icon, and you&amp;rsquo;ll see a bunch of settings there. Scroll down all the way to the bottom until you see About phone. Click that and then click Software Information. You&amp;rsquo;ll see the Build number halfway through the screen here&amp;ndash; and I know this is weird, but click on it seven times. You have to draw your pattern if you have one set up, but you&amp;rsquo;ll see here that it says Developer Mode has been enabled. That&amp;rsquo;s all you need to do; from now on you can install any APK, but be careful, because if you don&amp;rsquo;t trust the source, you know, they could do some damage to your phone.&lt;/p&gt;
&lt;h2 id="step-2-set-up-the-https-test-script-recorder-on-jmeter"&gt;Step 2: Set up the HTTP(S) Test Script Recorder on JMeter&lt;/h2&gt;
&lt;p&gt;The second step is setting up an HTTP recorder on JMeter. So let&amp;rsquo;s head over to our laptop. Make sure you&amp;rsquo;re connected to a wifi network. Now, this is a completely new JMeter test plan here. So just right-click on Test Plan and then hover over Add, and then you&amp;rsquo;re going to go down to Non-Test Elements. Select the HTTP(S) Test Script Recorder. You&amp;rsquo;ll see here that the port it uses is 8888. We&amp;rsquo;ll need that for later. Now right-click on the Test Script Recorder, hit Add, and then Listener. We&amp;rsquo;ll add a View Results Tree to be able to capture the results that we need later. Now we&amp;rsquo;ll click on the Test Plan - right-click - and then we&amp;rsquo;re going to Add a Thread Group. Now let&amp;rsquo;s right-click on the Thread Group and go to Add &amp;gt; Logic Controller &amp;gt; Recording Controller. This is where the requests that we&amp;rsquo;re going to send are going to be recorded, and we&amp;rsquo;ll see both the requests and the responses in View Results Tree.&lt;/p&gt;
&lt;h2 id="step-3-set-up-your-mobile-to-use-the-https-test-script-recorder-as-a-proxy"&gt;Step 3: Set up your mobile to use the HTTP(S) Test Script Recorder as a proxy&lt;/h2&gt;
&lt;p&gt;Now, the third step is to set up your mobile to use a proxy. So, back on the mobile, go back to Settings and hit Connections. And then click on Wifi. Now verify that the wifi network that you&amp;rsquo;re connected to on your mobile is the same one as the wifi network that you&amp;rsquo;re connected to on your laptop. If it&amp;rsquo;s the same, click the gear icon. And then hit Advanced all the way at the bottom. Now the Proxy settings are on the second option here so hit the down menu here and then hit Manual. Now, for the Proxy host name we&amp;rsquo;ll have to go back to the computer to see what our local IP address is.&lt;/p&gt;
&lt;p&gt;So, in order to do that, you just have to go to System Preferences. I&amp;rsquo;m doing it from the Apple menu here and from System Preferences, click on Network. And once you&amp;rsquo;ve selected the wifi network, hit Advanced, and then TCP/IP. So what you&amp;rsquo;re looking for will be this IPv4 Address. Now you&amp;rsquo;re going to type that into the Host name field on your mobile. So let me just type that in.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll note that this is actually a local IP address. It&amp;rsquo;s not your public IP address. Now for our proxy port, we&amp;rsquo;ll go and look at the laptop to see the Test Script Recorder Settings and it was 8888, so that&amp;rsquo;s what we&amp;rsquo;re going to put in here. All right. And then click on Save.&lt;/p&gt;
&lt;h2 id="step-4-start-recording"&gt;Step 4: Start recording&lt;/h2&gt;
&lt;p&gt;Step 4 is recording the traffic. Now, go back to your laptop on JMeter and click on the Test Script Recorder. Now we&amp;rsquo;re going to click on Start. It&amp;rsquo;ll come up with this popup box here and you can just click OK since we already trust the source. You&amp;rsquo;ll see this little popup here to confirm that we are recording traffic. Now let&amp;rsquo;s see if we&amp;rsquo;ve actually configured it correctly.&lt;/p&gt;
&lt;p&gt;On our mobiles, let&amp;rsquo;s go back and open the app that you want to use. So I&amp;rsquo;m going to be using the IowaReporterApp. I just did an article on this on The New Stack (link in the description below) about how I would load test the Iowa Caucus Reporter App. So that&amp;rsquo;s what I&amp;rsquo;m going to be using for this tutorial as well. So I&amp;rsquo;m going to open that (&amp;ldquo;getting ready to caucus&amp;rdquo;) and I don&amp;rsquo;t have a valid precinct ID so I&amp;rsquo;m just going to put flood.io and I&amp;rsquo;m going to click Login. So it&amp;rsquo;s telling me that the connection isn&amp;rsquo;t private. I don&amp;rsquo;t actually expect this to work, because the app has been taken down and I don&amp;rsquo;t have valid login credentials, but I&amp;rsquo;m still just going to go forward. So, Proceed. You might have to do this as well if your certificates haven&amp;rsquo;t been set up correctly.&lt;/p&gt;
&lt;p&gt;Okay, so now we&amp;rsquo;ve gotten this error here and it says, &amp;ldquo;Oops, something went wrong&amp;rdquo;. So it&amp;rsquo;s handy to know what it looks like on your mobile so that you can go into JMeter and see if that&amp;rsquo;s what you see as well.&lt;/p&gt;
&lt;p&gt;So on JMeter let&amp;rsquo;s go to the View Results Tree and it looks like Google Play tried to do a few things beforehand but what we&amp;rsquo;re really looking for is this IDP caucus thing. So, these are the requests that my phone made and these are the responses. So this is where we got the certificate error because it says &amp;ldquo;certificate unknown&amp;rdquo;. Now this is the actual request we sent for login. You can see the request here - the full request - and also the full response. Now, just to check we&amp;rsquo;ll make sure we got the same response in the body here on JMeter that we saw on our mobile phones.&lt;/p&gt;
&lt;p&gt;And here it is; it says &amp;ldquo;Oops!, something went wrong&amp;rdquo;. You can of course just search for this. So we&amp;rsquo;ll stop the recording now because we&amp;rsquo;ve confirmed that we&amp;rsquo;ve gotten what we wanted. So in the recording controller, we can see the requests that were recorded from our mobile app and the first one looks like it was one to Google so that&amp;rsquo;s not one we want. If we were doing this again, we could actually go into the Test Script Recorder, go into this Requests Filtering tab, and we could just filter out or exclude the domains that we don&amp;rsquo;t want to test, like Google. But this looks like the request that we were actually looking for. You&amp;rsquo;ll see the full request here with all the parameters and the values.&lt;/p&gt;
&lt;h2 id="whats-next"&gt;What&amp;rsquo;s next?&lt;/h2&gt;
&lt;p&gt;And that&amp;rsquo;s how you record traffic from a native mobile app on JMeter. From here, you can then play around with the request. Like we saw, there were a lot of dynamic values that were recorded in the request. We would probably want to correlate those and make sure that we&amp;rsquo;re doing those correctly. But this is a really great starting point for testing a mobile app.&lt;/p&gt;
&lt;p&gt;Till the next Ask a Flooder, happy Flooding!&lt;/p&gt;</description></item><item><title>Ask a Flooder 05: How do I get started with Flood Element?</title><link>https://nicolevanderhoeven.com/blog/20200317-aaf05/</link><pubDate>Tue, 17 Mar 2020 20:58:12 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200317-aaf05/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/ask-a-flooder-05-how-do-i-get-started-with-flood-element-video"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/ask-a-flooder-05-how-do-i-get-started-with-flood-element-video"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;On this Ask a Flooder, I talk about getting started with Flood Element. Element is an open-source tool that is a good Selenium alternative for browser-based load testing. It runs Puppeteer under the hood to drive real browsers at scale and can be paired with Flood for cloud load testing.&lt;/p&gt;
&lt;p&gt;‍&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/oWtnStKrh98?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;TRANSCRIPT:&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re sold on browser-based load testing and want to get started on Element, I think the easiest way to do that is by going to &lt;a href="http://element.flood.io"&gt;element.flood.io&lt;/a&gt; and clicking on Install on the upper left corner. You can follow those instructions to get started, and you can also click on the links on the left side if you get stuck.&lt;/p&gt;
&lt;p&gt;Once Element is installed, open up the directory and look at the examples folder. There you&amp;rsquo;ll find a lot of sample scripts that we&amp;rsquo;ve already made up for you. The easiest way to get started is to just modify some of these slightly so that you&amp;rsquo;re testing your site. For example, you could just change the URL and step names to make it appropriate for what you&amp;rsquo;re testing.&lt;/p&gt;
&lt;p&gt;Then, you can run it locally using the command element run the name of your test script, like test.ts, and then I also like to include the no-headless flag.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;element run test.ts --no-headless&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The no-headless flag is going to run a real browser, a Chromium browser, on your machine, so that you can see what the script is actually doing. This is a great way to debug and troubleshoot.&lt;/p&gt;
&lt;p&gt;Once you&amp;rsquo;re ready to run your load test on the cloud, you can simply drag and drop your Element script into the Flood stream editor and then start your load test as usual.&lt;/p&gt;
&lt;p&gt;Check out the links in the description below for more information about Element, how to get started, and how to run an Element script on Flood.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://element.flood.io/"&gt;More about Element&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://guides.flood.io/scripting-and-tools/flood-element/getting-started-with-element"&gt;Getting started with Element&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Ask a Flooder 04: Why would your load testing tool report higher response times than you expect?</title><link>https://nicolevanderhoeven.com/blog/20200311-aaf04/</link><pubDate>Wed, 11 Mar 2020 21:02:48 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200311-aaf04/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/why-would-your-load-testing-tool-report-higher-response-times-than-you-expect-video"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/why-would-your-load-testing-tool-report-higher-response-times-than-you-expect-video"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In this Ask a Flooder, I tackle a question we get all the time from users regarding results, particularly for cloud load testing. Sometimes you might notice that response times that are reported in by your load testing tool do not match up with the response time you see from your own browser. What causes this, and how can we fix it?&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/goKK2aACZZY?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Transcript:&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s always confusing when your load testing tool reports higher average response times than what you can see while you&amp;rsquo;re manually accessing your application on your browser. There are many things that might cause this, but one of the most common causes for it is that you&amp;rsquo;re overloading your node generators.&lt;/p&gt;
&lt;p&gt;As a general rule of thumb, you&amp;rsquo;ll want to keep your CPU utilization at 80% or less throughout the duration of the test. It is normal for it to spike in the beginning, but it should ideally come to a more stable spot below 80%. If your node&amp;rsquo;s CPU utilization is going over 80% for most of the test, then what that means is that your node is struggling to get those requests out, which may lead to some inaccurate results.&lt;/p&gt;
&lt;p&gt;You can confirm whether or not this is the cause of your high response times by checking the logs and checking the resource utilization on your nodes.If you&amp;rsquo;re running on Flood, you can do this while the flood is running by going over to Grids, selecting the grid, and then scrolling down on the panel on the right to see the CPU and memory as well as the network throughput.&lt;/p&gt;
&lt;p&gt;There are a couple of things you can do to fix this. The first one is to increase any sort of delays or think times in your script — and, if you don&amp;rsquo;t already have any, you should add some. Think times make the script a lot more realistic and a lot closer to what real users would do. If these values are too low, then your load testing tool is just going to run the script as fast as possible, consuming more resources than necessary.&lt;/p&gt;
&lt;p&gt;The second thing you can do is reduce the number of users you&amp;rsquo;re running per node. This will free up more resources per node and make it a lot easier to scale up your load tests more effectively.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Check out &lt;a href="https://guides.flood.io/results-analysis/troubleshooting-results-analysis/reported-response-times-higher-than-observed"&gt;this article&lt;/a&gt; for more detailed information on resource over-utilization and other possible reasons for differences between response times in a test and on a browser.&lt;/p&gt;</description></item><item><title>FOMO and performance testing: Why Robinhood went down</title><link>https://nicolevanderhoeven.com/blog/20200309-fomo-and-performance-testing/</link><pubDate>Mon, 09 Mar 2020 20:29:40 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200309-fomo-and-performance-testing/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/fomo-and-performance-testing-why-robinhood-went-down"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/fomo-and-performance-testing-why-robinhood-went-down"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Angry customers flocked to the internet when the Robinhood investment brokerage app went down last Monday and part of Tuesday, leaving them unable to trade stocks on a day where Wall Street reported historic gains. Could this have been prevented?&lt;/p&gt;
&lt;p&gt;The answer is yes. Applications should always be assessed for risk and tested accordingly. Risk-based load testing helps unearth problems that would otherwise only surface in production. Testing applications end-to-end as a system instead of just as a collection of isolated components allows us to build software that is more resilient. The problem is that this type of testing can be difficult to carry out. In this article, I&amp;rsquo;ll go through the entire process.&lt;/p&gt;
&lt;h2 id="what-is-robinhood"&gt;What is Robinhood?&lt;/h2&gt;
&lt;p&gt;Robinhood is an app I&amp;rsquo;ve personally had my eye on since it opened a waiting list about five years ago for Australians wanting to see the American company come to our shores. It &lt;a href="https://australianfintech.com.au/local-start-stake-beats-us-giant-robinhood-bring-australians-free-share-trading/"&gt;doesn&amp;rsquo;t look like it&amp;rsquo;s happening&lt;/a&gt; now, but if that waiting list still exists, I&amp;rsquo;m on it.&lt;/p&gt;
&lt;p&gt;Robinhood is a brokerage app that takes inspiration from the legend it was named after to &amp;ldquo;give to the poor,&amp;rdquo; bring zero-commission trading to its customers. Instead of earning from commissions, Robinhood makes its money from &lt;a href="https://www.investopedia.com/articles/active-trading/020515/how-robinhood-makes-money.asp"&gt;a variety of other methods&lt;/a&gt;, including premium platform fees, interest on customers&amp;rsquo; uninvested capital, and payments received in exchange for coursing customers&amp;rsquo; orders through third-party market-makers. It&amp;rsquo;s an enticing premise, and one that the company has used in conjunction with mobile apps to appeal to millennials and technophiles.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200309-01.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Source: From &lt;a href="https://robinhood.com/us/en/"&gt;Robinhood&amp;rsquo;s homepage&lt;/a&gt;&lt;/em&gt;
‍&lt;/p&gt;
&lt;h2 id="what-caused-the-robinhood-app-to-fail"&gt;What caused the Robinhood app to fail?&lt;/h2&gt;
&lt;p&gt;Unfortunately, its wild success with the tech-savvy crowd also meant that when it went down last Monday morning in the US, its customers took to the internet in droves to draw attention to the failure. In a &lt;a href="https://blog.robinhood.com/news/2020/3/3/an-update-from-robinhoods-founders"&gt;blog post from Robinhood&lt;/a&gt;, the company&amp;rsquo;s co-founders, Baiju Bhatt and Vladimir Tenev, admitted that the outage was due to &amp;ldquo;stress on [their] infrastructure— which struggled with unprecedented load.&amp;rdquo;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The outages you have experienced over the last two days are not acceptable and we want to share an update on the current situation. Our team has spent the last two days evaluating and addressing this issue. We worked as quickly as possible to restore service, but it took us a while. Too long. - &lt;a href="https://blog.robinhood.com/news/2020/3/3/an-update-from-robinhoods-founders"&gt;Baiju Bhatt and Bladimir Tenev&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Bhatt and Tenev went on to explain that the load on their servers had caused a &amp;ldquo;thundering herd&amp;rdquo; effect. This effect describes a situation in which a backend server receives a large number of concurrent requests and, instead of different threads processing these requests simultaneously, all threads attempt to process the same request.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve ever played four-player Overcooked, it&amp;rsquo;s like having everyone sprint to a fire extinguisher to try to put out a fire from overcooked pasta, but instead, the constant button mashing means you just pass the extinguisher around and yell at each other while the fire rages on. Before you know it, the entire kitchen is on fire.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200309-02.jpeg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Source: From &lt;a href="https://twitter.com/csac0425/status/963053160259510277"&gt;Twitter user @csac0425&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;So the technical cause of the outage was an infrastructure problem.&lt;/p&gt;
&lt;p&gt;But I think the REAL cause was FOMO.&lt;/p&gt;
&lt;h2 id="what-is-fomo"&gt;What is FOMO?&lt;/h2&gt;
&lt;p&gt;FOMO is the Fear Of Missing Out, and it&amp;rsquo;s a phenomenon that&amp;rsquo;s been particularly exacerbated by social media. Instead of only hearing news from people you interact with in the physical world, it just takes a few seconds to open up Twitter on your smartphone and see what thousands of people are talking about. Twitter will even helpfully tell you what&amp;rsquo;s &amp;ldquo;trending&amp;rdquo; in your country, and other social networks also employ algorithms to determine what messages to show you.&lt;/p&gt;
&lt;h2 id="how-does-fomo-affect-application-performance"&gt;How does FOMO affect application performance?&lt;/h2&gt;
&lt;p&gt;We can see FOMO in how people have reacted to the coronavirus COVID-19. Despite pleas to leave masks for medical professionals at real risk, people have bought out the stock for these masks despite living in countries with little to no sign of the coronavirus. In Sydney, Australia, residents are stockpiling toilet paper (of all things) in large quantities, clearing out shelves from supermarkets, and &lt;a href="https://www.bbc.com/news/world-australia-51731422"&gt;getting into knife fights over toilet paper&lt;/a&gt; due to their panic at the thought of doing without.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200309-03.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This photo of an empty toilet paper aisle was taken by our Principal Engineer, &lt;a href="https://github.com/lachie"&gt;Lachie Cox&lt;/a&gt;, in a supermarket in Sydney last week.&lt;/em&gt;
‍
FOMO of this magnitude ultimately also manifests itself in the stock market. The Dow Jones Industrial Average, which represents the performance of the top 30 largest companies in the US, dropped by 3,500 points last week amidst fears that the coronavirus would stall production in countries most affected by COVID-19, leading to lower returns across the board.&lt;/p&gt;
&lt;p&gt;Then, an abrupt about-face. The Dow went from recording its &lt;a href="https://nypost.com/2020/03/09/dow-loses-over-2000-points-worst-single-day-drop-ever-as-oil-prices-crash/"&gt;biggest &lt;em&gt;ever&lt;/em&gt; loss in a single day on Thursday&lt;/a&gt; to posting a record gain of 1,200 points on Monday.&lt;/p&gt;
&lt;p&gt;Guess who gets to adjust to all this volatility.&lt;/p&gt;
&lt;p&gt;Robinhood&amp;rsquo;s founders reported that the &amp;ldquo;highly volatile and historic market conditions; record volume; and record sign-ups&amp;rdquo; contributed to the infrastructure issues they faced. We can only imagine just how many users they saw on their systems during this period.&lt;/p&gt;
&lt;p&gt;FOMO creates mass hysteria and panic, both of which cause customers to behave irrationally and likely very differently than previously recorded. So how do you create a workload model that accounts for this volatility? How do you tailor your load tests for FOMO? I&amp;rsquo;ll run you through the process, using Robinhood as an example.&lt;/p&gt;
&lt;h2 id="does-your-application-require-fomo-load-testing"&gt;Does your application require FOMO load testing?&lt;/h2&gt;
&lt;p&gt;All testing should be risk-based. Start with why: why should you test an application component? Why does your application require this kind of testing or that one?&lt;/p&gt;
&lt;p&gt;In Robinhood&amp;rsquo;s case, there were a few indicators that pointed to the necessity of FOMO testing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;A customer base made up of a younger, tech-savvy generation&lt;/strong&gt;. ‍This demographic is very likely to take to social media with complaints, making negative publicity a real risk.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Complexity&lt;/strong&gt;. ‍Robinhood&amp;rsquo;s systems must receive customers&amp;rsquo; orders, forward and place those orders to market makers, and display real-time market data. Robinhood customers can also purchase options on stocks as well as cryptocurrency, further increasing the complexity.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Financial component&lt;/strong&gt;. ‍Anything that involves taking people&amp;rsquo;s money should have a high priority for any testing.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;When it comes to your money, we know how important it is for you to have answers. - &lt;a href="https://blog.robinhood.com/news/2020/3/3/an-update-from-robinhoods-founders"&gt;Baiju Bhatt and Bladimir Tenev&lt;/a&gt;, co-founders of Robinhood&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Record-breaking growth&lt;/strong&gt;. ‍Robinhood had 1 million users in 2016, 6 million in 2018, and 10 million last December, &lt;a href="https://www.cnbc.com/2019/12/04/start-up-robinhood-tops-10-million-accounts-even-as-industry-follows-in-free-trading-footsteps.html"&gt;according to CNBC&lt;/a&gt;. Exponential growth brings some major growing pains.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Industry history of expensive failures&lt;/strong&gt;. ‍&lt;a href="https://qz.com/1812086/robinhood-brokerage-app-suffers-second-day-of-outages/"&gt;Quartz points out&lt;/a&gt; that software or infrastructure failures have cost the financial industry millions in recent years.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Recent legal action&lt;/strong&gt;. The regulatory body FINRA &lt;a href="https://www.cnn.com/2019/12/19/investing/robinhood-trading-app-fine-finra/index.html"&gt;fined Robinhood&lt;/a&gt; US$1.25 million just last December for placing orders for customers without looking for the lowest price. While this isn&amp;rsquo;t a huge fine for a company that was &lt;a href="https://www.bloomberg.com/news/articles/2019-07-22/robinhood-is-worth-7-6-billion-after-new-funding-round"&gt;valued at US$7.6 billion last July&lt;/a&gt;, any legal action should make a company tread more carefully.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are solid reasons to warrant load testing Robinhood&amp;rsquo;s systems beyond just &amp;ldquo;expected&amp;rdquo; load.&lt;/p&gt;
&lt;h2 id="planning-for-fomo"&gt;Planning for FOMO&lt;/h2&gt;
&lt;p&gt;Once you&amp;rsquo;ve determined that your application is susceptible to FOMO, the next thing to do is plan how to structure your load tests to include its effect in your test runs.&lt;/p&gt;
&lt;h3 id="what-type-of-app-is-it"&gt;What type of app is it?&lt;/h3&gt;
&lt;p&gt;Robinhood consists of three apps: two for mobile (iOS and Android) and one for the web. It is currently only available to US residents, which means that getting mobile apps downloaded is problematic as it would entail changing countries in the app stores to get access. Since I live in the Netherlands and I don&amp;rsquo;t want to do that, I&amp;rsquo;ll focus on the web app specifically when scripting the load test, and I&amp;rsquo;ll assume that the same underlying application servers service both web and mobile apps.&lt;/p&gt;
&lt;h3 id="workload-modeling"&gt;Workload modeling&lt;/h3&gt;
&lt;h4 id="business-processes-to-test"&gt;Business processes to test&lt;/h4&gt;
&lt;p&gt;Given that the app went down on a day where markets were &lt;em&gt;up&lt;/em&gt;, we can assume that most of the people on Robinhood&amp;rsquo;s apps were doing one of two things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Signing up&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Buying shares&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We should ideally test both, but let&amp;rsquo;s focus on signups here because it&amp;rsquo;s easier to test without access to the actual app (which requires a US social security number).&lt;/p&gt;
&lt;h4 id="number-of-virtual-users-at-peak-load"&gt;Number of virtual users at peak load&lt;/h4&gt;
&lt;p&gt;Let&amp;rsquo;s try to come up with a number of users that we can use as Robinhood&amp;rsquo;s peak hourly load. This task would be easier if Robinhood shared their analytics, but we can still make some educated guesses with what &lt;em&gt;has&lt;/em&gt; been made public.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200309-04.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Source: Image from &lt;a href="https://blog.apptopia.com/robinhood-now-has-more-mobile-monthly-active-users-than-the-top-legacy-providers-combined"&gt;Apptopia&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.apptopia.com/robinhood-now-has-more-mobile-monthly-active-users-than-the-top-legacy-providers-combined"&gt;According to Apptopia&lt;/a&gt;, Robinhood&amp;rsquo;s highest number of mobile installations was in 2018, when it saw 2 million downloads of its mobile app in a quarter. This period coincides with when Robinhood released cryptocurrency trading support, which looks like increased signups—in the third quarter of 2019, this figure was about 1.5 million. 2 million quarterly downloads translates to about 666,666 downloads per month. Let&amp;rsquo;s call that 700,000 and take this number of mobile downloads as a starting figure.&lt;/p&gt;
&lt;p&gt;The stock market is only open on the weekdays, so we can divide 700,000 signups a month by 20 days, and we get 35,000 signups a day. The markets are also only open for about 7 hours a day, but the load probably isn&amp;rsquo;t evenly spread out across the 7 hours— I would expect that people would have more time during lunch to sign up for Robinhood. So let&amp;rsquo;s say that the majority of those signups would happen within three hours (from 11 am to 2 pm, for example). By dividing 35,000 signups per day by 3 hours, we get about 11,667 users per hour. Let&amp;rsquo;s round that up to 12,000.&lt;/p&gt;
&lt;p&gt;How do we translate this to the number of virtual users we need to run? Let&amp;rsquo;s think about how long each user stays on the app. The signup process does require approval, so that&amp;rsquo;s a hard stop— new users won&amp;rsquo;t be able to sign up and then start trading immediately afterwards. &lt;a href="https://robinhood.com/us/en/support/articles/360001213123/open-my-account/"&gt;This approval could take up to a day&lt;/a&gt;, or up to seven days if documents are required.&lt;/p&gt;
&lt;p&gt;Looking at the application form itself, we can see it is relatively standard and requires only information that most people are likely to have handy (social security number and contact details). I timed how long it took me to go through the part of it I could access, and I estimated that 10 minutes would be sufficient time to go through all the tabs.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200309-05.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Source: &lt;a href="https://signup.robinhood.com/?"&gt;Robinhood&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We want to spread out users evenly across the hour— that is, we don&amp;rsquo;t want 12,000 users to sign up and leave, all within 10 minutes. We want equal portions of those users to be signing up throughout the entire hour. Dividing 12,000 by 6 (the number of 10-minute intervals in an hour), we get 2,000. 2,000 is the number of threads we need active at any one point of time. Each of those threads signs up one user for 10 minutes, then signs up 5 more users until the hour is up.&lt;/p&gt;
&lt;p&gt;So we have our figure: we need 2,000 &lt;em&gt;virtual&lt;/em&gt; users per hour to simulate 12,000 signups in an hour.&lt;/p&gt;
&lt;h3 id="test-scenarios"&gt;Test scenarios&lt;/h3&gt;
&lt;p&gt;In addition to running the standard battery of load tests, testing for FOMO requires exploring the upper limits of the application. Assuming the peak load testing goes well, we can use the 2,000 virtual users per hour figure from our peak load calculations as a starting point for these more destructive tests. To this end, here are some test scenarios I&amp;rsquo;d consider running if I were testing the Robinhood app:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Soak testing&lt;/strong&gt;. ‍Soak testing means running typically a little less than the peak load profile, but over a longer amount of time. In Robinhood&amp;rsquo;s case, perhaps we could run 1,000 virtual users for 8 hours. We would expect that the response times reported during this test would be the same; otherwise, there is likely a performance bottleneck, such as a memory leak.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Stress testing&lt;/strong&gt;. ‍Stress testing means increasing the number of users on an application at regular increments until the application crashes. We can start with 2,000 virtual users per hour, and then add 500 users every 30 minutes to see how the application handles it. This test helps determine how much room there is for growth.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200309-06.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Source: Stepped load profile for stress testing, generated in JMeter&lt;/em&gt;
‍&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Resilience testing&lt;/strong&gt;. ‍Resilience testing involves running the peak load test and then simulating an outage by turning off key components to see how the application behaves. If two servers share the load, for instance, we could turn one off and check to make sure that the user sessions on the terminated node are moved over onto the remaining node. This test shows whether the application recovers gracefully from an unforeseen event.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All these tests help us prepare for the unexpected, and they might have identified the &amp;ldquo;thundering herd&amp;rdquo; problem that contributed to Robinhood&amp;rsquo;s outage.&lt;/p&gt;
&lt;h2 id="scripting-for-fomo"&gt;Scripting for FOMO&lt;/h2&gt;
&lt;h3 id="tool-selection"&gt;Tool selection&lt;/h3&gt;
&lt;p&gt;To test mobile as well as web apps, I would typically use a protocol-level load testing tool like JMeter to simulate the load. However, &lt;a href="https://thenewstack.io/how-id-load-test-the-iowa-caucus-app/"&gt;I&amp;rsquo;ve already done that&lt;/a&gt;. I also noticed that Robinhood makes use of some dynamic parameters, such as a csrf token:&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/20200309-07.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Source: Chrome Developer Tools on &lt;a href="https://signup.robinhood.com/?"&gt;Robinhood&lt;/a&gt;&lt;/em&gt;
‍
We can usually find the value of this token in the response of the previous page. It is a security feature to allow Robinhood to verify that the same users make all requests in the same session. Tokens can be scripted around in a tool like JMeter, but it can be time-consuming. So for this article, I decided to show another tool that makes this problem go away. I used &lt;a href="https://element.flood.io/"&gt;Flood Element&lt;/a&gt;, which is an open-source tool we created based on Puppeteer. One of its advantages is that it runs on the browser level. Instead of diving into HTTP requests and tokens, I just told Element which buttons to click.&lt;/p&gt;
&lt;p&gt;I wanted a script that would do the following things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Navigate to Robinhood&amp;rsquo;s home page.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click on &amp;ldquo;Sign Up&amp;rdquo;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click on the &amp;ldquo;Get Your Free Stock&amp;rdquo; button.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fill out the signup form.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Note that I stopped short of actually submitting the form because I don&amp;rsquo;t want to create dummy accounts on Robinhood&amp;rsquo;s database— I just want to show how this flow can be scripted with Element.&lt;/p&gt;
&lt;p&gt;To help me identify the elements on the page that I wanted the script to interact with, I used Chrome&amp;rsquo;s built-in Developer Tools. Specifically, I used the Inspect Element button (in orange below) to click on a field and find where it was in the code.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/20200309-08.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;For instance, to find out how to identify the email field, I right-clicked on the code on the right, hovered over Copy, and then clicked Copy selector.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/20200309-09.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;This gave me the value &lt;code&gt;#signup_email_field&lt;/code&gt;, which I then used in the script like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//Type Email address
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;By&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;signup_email_field&amp;#39;&lt;/span&gt;),&lt;span style="color:#e6db74"&gt;&amp;#39;nicole@flood.io&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here&amp;rsquo;s the script that I ended up with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;step&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;TestSettings&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;Until&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;By&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;MouseButtons&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;Device&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;Driver&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;ENV&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;@flood/element&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;assert&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;assert&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;settings&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TestSettings&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;loopCount&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;clearCache&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;disableCache&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;actionDelay&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;stepDelay&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;screenshotOnFailure&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;userAgent&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;flood-element-test&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;default&lt;/span&gt; () =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;step&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;01_Home&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;async&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Navigate to Robinhood homepage
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;visit&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;lt;https://robinhood.com&amp;gt;&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Validate text
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;validation&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;By&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;visibleText&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;It’s Time to Do Money&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;wait&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;Until&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;elementIsVisible&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;validation&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;takeScreenshot&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;step&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;02_Signup&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;async&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Click &amp;#34;Sign Up&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;signupBtn&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;findElement&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;By&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;xpath&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;//a[@href=&amp;#34;&amp;lt;https://signup.robinhood.com&amp;gt;&amp;#34;]&amp;#39;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;signupBtn&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;click&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Validate text
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;validation&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;By&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;visibleText&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;Free Stock Waiting For You&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;wait&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;Until&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;elementIsVisible&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;validation&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;takeScreenshot&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;step&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;03_GetFreeStock&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;async&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Click Get Your Free Stock
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;freestockBtn&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;findElement&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;By&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;xpath&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;//a[@href=&amp;#34;&amp;lt;https://signup.robinhood.com/?&amp;#34;&amp;gt;]&amp;#39;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;freestockBtn&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;click&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Validate text
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;validation&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;By&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;visibleText&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;Make Your Money Move&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;wait&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;Until&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;elementIsVisible&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;validation&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;takeScreenshot&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;step&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;04_FillForm&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;async&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Type First name
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;By&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;xpath&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;//input[@name=&amp;#34;first_name&amp;#34;]&amp;#39;&lt;/span&gt;),&lt;span style="color:#e6db74"&gt;&amp;#39;Nicole&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Type Last name
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;By&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;xpath&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;//input[@name=&amp;#34;last_name&amp;#34;]&amp;#39;&lt;/span&gt;),&lt;span style="color:#e6db74"&gt;&amp;#39;van der Hoeven&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Type Email address
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;By&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;signup_email_field&amp;#39;&lt;/span&gt;),&lt;span style="color:#e6db74"&gt;&amp;#39;nicole@flood.io&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Type password
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;By&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;xpath&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;//input[@name=&amp;#34;password&amp;#34;]&amp;#39;&lt;/span&gt;),&lt;span style="color:#e6db74"&gt;&amp;#39;demo123456&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;takeScreenshot&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In every step, I also added a &lt;code&gt;takeScreenshot()&lt;/code&gt; , which is one of my very favorite features of Element. It&amp;rsquo;s so useful to be able to save these screenshots and use them to determine exactly what&amp;rsquo;s happening in the script. Here&amp;rsquo;s what it looks like running my Element script locally. The automated browser is on the left, and my terminal (iTerm) is on the right, running Element.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/20200309-10.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="running-a-fomo-test"&gt;Running a FOMO test&lt;/h2&gt;
&lt;p&gt;Now we&amp;rsquo;ve got a script that runs locally. How do we run it at scale? Additionally, Robinhood won&amp;rsquo;t allow users outside the US to sign up. How do we make sure that our virtual users are allowed to sign up?&lt;/p&gt;
&lt;p&gt;The answer is a load testing platform like &lt;a href="https://flood.io/"&gt;Flood&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;With Flood, running our script is a matter of uploading the script and selecting some options.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200309-11.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The Flood test design interface&lt;/em&gt;
‍
Flood also lets us choose which regions to generate load from. Below I&amp;rsquo;ve got it set up to run for an hour from four different US cities, with each one starting 500 users. This configuration gives us our 2,000 virtual user figure.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/20200309-12.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;If this peak load test goes well, we could then go on to run the other test scenarios that we described earlier. Each one puts pressure on application servers in different ways, identifying performance bottlenecks.&lt;/p&gt;
&lt;h2 id="results-and-reruns"&gt;Results and reruns&lt;/h2&gt;
&lt;p&gt;Since Robinhood is a live application, I didn&amp;rsquo;t run the test— it&amp;rsquo;s never a good idea to load test a domain you don&amp;rsquo;t own when you&amp;rsquo;re talking about thousands of users. However, &lt;a href="https://api.flood.io/pfQuAGz3"&gt;here&amp;rsquo;s a shareable link&lt;/a&gt; to another small Element test I ran previously.&lt;/p&gt;
&lt;p&gt;Real-time dashboards like that one on Flood allow you to get a quick look into how the load test is running and to make any changes if necessary. When testing for FOMO, I think they&amp;rsquo;re invaluable. For example, during a stress test where users are added at regular intervals, a real-time dashboard would help you identify increases in response time as a result of the increased number of users. It would also let you monitor the test and stop it when necessary.&lt;/p&gt;
&lt;p&gt;From the link above, click on the right arrow on the lone transaction.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200309-13.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;That will take you to the Transaction Detail page. Remember those screenshots from Element? If you have any in your script, you&amp;rsquo;ll see them here, arranged according to time.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200309-14.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;This lets you troubleshoot issues during FOMO testing and react quickly.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Even with sound load testing strategies in place, it&amp;rsquo;s challenging to plan for the massive spike in traffic that FOMO can bring, yet it&amp;rsquo;s necessary to do so. FOMO, as a phenomenon, is only going to increase in magnitude as social networks make it easier to spread fear, uncertainty, and doubt as well as information.&lt;/p&gt;
&lt;p&gt;We may not be able to determine precisely what will break, or when, but what we can do is put systems into place to plan for it. We can assess an application&amp;rsquo;s susceptibility to FOMO and plan for end-to-end performance engineering of the system as a whole. We can start with the assumption that applications will fail and then determine the most likely candidates for that failure. We can routinely expose systems to traffic and circumstances that are extraordinary, and in doing so, we can improve our preparedness for something like FOMO.&lt;/p&gt;
&lt;p&gt;FOMO is irrational and unpredictable— but that doesn&amp;rsquo;t mean it needs to be unexpected.&lt;/p&gt;</description></item><item><title>Load Testing Lessons from the Iowa Caucus</title><link>https://nicolevanderhoeven.com/blog/20200306-load-testing-lessons/</link><pubDate>Fri, 06 Mar 2020 21:59:02 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200306-load-testing-lessons/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/load-testing-lessons-from-the-iowa-caucus"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/load-testing-lessons-from-the-iowa-caucus"&gt;here&lt;/a&gt; and &lt;a href="https://thenewstack.io/how-id-load-test-the-iowa-caucus-app/"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TL;DR? Here are the highlights in this article:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Shadow, Inc. created a mobile app for the Iowa Caucus in February 2020, and the app failed, causing reported results to be delayed.
The app reported different vote totals due to a system integration bug where the output was in a different format than what it needed to be.
Here are the steps to load testing a mobile app:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Test planning: Does the app require load testing? If yes, what is the underlying technology? How do we create a workload model?&lt;/li&gt;
&lt;li&gt;Scripting: Which mobile load testing tool should we use? How do we record traffic from a mobile device?&lt;/li&gt;
&lt;li&gt;Execution: What load test scenarios should we have? How can we scale up the load generated?
Conclusion: While the Iowa Reported App failure was not due entirely to load testing, load testing could have helped make it more robust.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;A company called Shadow, Inc. made headlines earlier this week when they developed an app to count and report votes during the Iowa Democratic Caucus in the US. This app, called IowaReporterApp, ended up failing on several fronts, resulting in a &lt;a href="https://www.nytimes.com/2020/02/06/upshot/iowa-caucuses-errors-results.html"&gt;days-long delay&lt;/a&gt; in publishing the total votes, during which manual methods had to be employed.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200306-01.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Source: &lt;a href="https://twitter.com/ShadowIncHQ/status/1224773796307050497"&gt;@ShadowIncHQ on Twitter&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This delay led to significant criticism from the software testing industry as well as from the general public. Some developers raised questions about the &lt;a href="https://www.vice.com/en_us/article/3a8ajj/an-off-the-shelf-skeleton-project-experts-analyze-the-app-that-broke-iowa"&gt;code quality of the app&lt;/a&gt;. The app &lt;a href="https://twitter.com/iowademocrats/status/1225170253778444291"&gt;inaccurately reported voting totals&lt;/a&gt; that differed from the Democratic Party&amp;rsquo;s own manual reports, suggesting an issue with functional testing, particularly system integration testing. Shadow&amp;rsquo;s &lt;a href="https://thehill.com/policy/cybersecurity/481409-dhs-chief-says-offer-to-vet-iowa-caucus-app-was-declined"&gt;refusal to accept the Department of Homeland Security&amp;rsquo;s help with security testing&lt;/a&gt; also raised eyebrows. What was perhaps the most damning, though, was the question of &lt;a href="https://twitter.com/zeynep/status/1224545350364672001"&gt;whether such an app was necessary in the first place&lt;/a&gt;, when cheaper and more effective solutions existed.&lt;/p&gt;
&lt;p&gt;What I&amp;rsquo;m most interested in, however, are the load issues that the app faced. Let&amp;rsquo;s rewind a little to before the caucus. How would I have load tested an app like the IowaReporterApp?&lt;/p&gt;
&lt;h2 id="planning-a-mobile-load-testing"&gt;Planning a mobile load testing&lt;/h2&gt;
&lt;p&gt;One of the first things to figure out when planning a load test is whether a load test is even necessary.&lt;/p&gt;
&lt;h3 id="do-you-even-need-to-load-test-your-mobile-app"&gt;Do you even need to load test your mobile app?&lt;/h3&gt;
&lt;p&gt;To answer that, I had to find out more about the app.&lt;/p&gt;
&lt;p&gt;In the caucus, residents of Iowa who registered themselves as Democratic voters gathered to vote on whom they thought should be the party&amp;rsquo;s candidate for the presidential elections later this year.&lt;/p&gt;
&lt;p&gt;There are a few things that I think make this app the perfect candidate for load testing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;It was highly publicized.&lt;/strong&gt; The caucuses would always have been an event of international interest, but the hype surrounding electronic voting increased media attention on the caucus even further.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;It was mission-critical&lt;/strong&gt;. The precinct chairs would use the app as the primary device for capturing votes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;It needed to handle significant simultaneous load&lt;/strong&gt;. There were &lt;a href="https://en.wikipedia.org/wiki/2020_Iowa_Democratic_caucuses"&gt;over a thousand precinct caucuses&lt;/a&gt; organized, each with a precinct chair that would be using the app.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For these reasons, the answer is a resounding &amp;ldquo;Yes.&amp;rdquo;&lt;/p&gt;
&lt;h3 id="what-type-of-app-is-it"&gt;What type of app is it?&lt;/h3&gt;
&lt;p&gt;The best way to learn about an app is to ask its developers. In this case, I opted to do a little research on my own by &lt;a href="https://www.vice.com/en_us/article/z3b3g9/here-is-a-link-to-the-shadow-inc-app-that-blew-up-the-iowa-caucus"&gt;downloading the .apk file that Motherboard (Vice) made available&lt;/a&gt; and looking through the code myself.&lt;/p&gt;
&lt;p&gt;The app is a mobile-only app for Android and iOS devices, written mostly using Facebook&amp;rsquo;s React Native package. The primary function of the app was to sent the vote totals to Shadow Inc.&amp;rsquo;s &lt;a href="https://cloud.google.com/functions/?utm_source=google&amp;amp;utm_medium=cpc&amp;amp;utm_campaign=emea-nl-all-en-dr-bkws-all-all-trial-e-gcp-1008073&amp;amp;utm_content=text-ad-none-any-DEV_c-CRE_253510459861-ADGP_Hybrid+%7C+AW+SEM+%7C+BKWS+~+EXA_M:1_NL_EN_General_Cloud+Functions_ETL+Warehouse-KWID_43700019207359819-kwd-135583196912-userloc_9065312&amp;amp;utm_term=KW_google%20functions-ST_google+functions&amp;amp;ds_rl=1242853&amp;amp;ds_rl=1245734&amp;amp;ds_rl=1245734&amp;amp;gclid=EAIaIQobChMI6bKKzNi_5wIVk-R3Ch04HA1XEAAYASAAEgKTcPD_BwE"&gt;Google Cloud Functions&lt;/a&gt; server.&lt;/p&gt;
&lt;p&gt;The technology involved is worth noting because it can help determine which load testing tool to use. Since the Iowa Reporter App, like most mobile apps, sends requests to a RESTful API, JMeter or Gatling, both well-tested, robust, and open-source protocol-level tools with large user bases, were perfect for the job. I decided to go with JMeter, my personal tool of choice.&lt;/p&gt;
&lt;h3 id="how-do-we-create-a-workload-model"&gt;How do we create a workload model?&lt;/h3&gt;
&lt;p&gt;Now let&amp;rsquo;s talk about the workload model, which is a plan for how the load we generate needs to look. The objective here is to simulate the load that matches the expected real-life load as closely as possible.&lt;/p&gt;
&lt;p&gt;At this point, I would typically look at historical data to try to see the amount of load and the load profile. If I had metrics on the server traffic after previous releases of the app using something like Google Analytics or an APM tool, I would have used that data as a starting point for the workload model of this release. However, in this case, the app hadn&amp;rsquo;t been publicly released before, so I needed to make some educated guesses.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/2020_Iowa_Democratic_caucuses"&gt;According to Wikipedia&lt;/a&gt;, there were a total of 1,777 Iowa precinct caucuses, of which 99 were global satellite caucuses set up for Iowa residents temporarily not able to attend the local caucuses.&lt;/p&gt;
&lt;p&gt;In a Democratic caucus, the actual voting process generally takes &lt;a href="https://www.theguardian.com/us-news/2020/feb/03/iowa-caucuses-2020-elections-candidates"&gt;about two hours&lt;/a&gt;. In the Iowa caucus, the precinct chairs would have used the app twice - once for each round of voting. Around the end of the two hours, each chair&amp;rsquo;s app would have sent the main payload, containing total votes for each candidate, to the backend server. All this is done simultaneously across all 1,777 precincts.&lt;/p&gt;
&lt;p&gt;At a minimum, there are two main events here:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The login - Precinct chairs needed to log in to the app, which would presumably have happened around the same time across all precincts towards the beginning of the voting process, because the app also contained instructions on how to run a caucus.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The submission - This is the transmission of the total vote counts for each candidate, sent to Google Cloud Functions, and would also have happened around the same time.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It&amp;rsquo;s possible that the app also sent other requests between these two events, but since most of the app is inaccessible without a valid login, I&amp;rsquo;ll focus on the initial login request.&lt;/p&gt;
&lt;p&gt;In a situation like this where I don&amp;rsquo;t have previous data to show how spread out those requests was, it&amp;rsquo;s prudent to err on the side of caution. Assuming the precinct chairs triggered those requests within 10 minutes of each other and rounding up the number of requests for some wiggle room, I estimated that there would have been 1,800 login requests within 10 minutes.&lt;/p&gt;
&lt;p&gt;I decided to test this as a gradual ramp-up of users within 10 minutes.&lt;/p&gt;
&lt;h2 id="scripting-for-mobile"&gt;Scripting for mobile&lt;/h2&gt;
&lt;p&gt;Okay, time to write the script. Since I didn&amp;rsquo;t have the luxury of being able to ask the developers for the format of the login request, I did the next best thing and tried to find out myself by recording the app traffic in action.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200306-02.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h3 id="recording-mobile-traffic-on-a-laptop-with-jmeter"&gt;Recording mobile traffic on a laptop with JMeter&lt;/h3&gt;
&lt;p&gt;Here&amp;rsquo;s how I was able to see the request from the mobile app:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I downloaded the app to a spare Android mobile by using the APK link above.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I set up an HTTP(S) Test Script Recorder on JMeter on my laptop with the port 8888. I also made sure my laptop was connected to my wifi network.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I set up my mobile to use a proxy using my laptop&amp;rsquo;s local IP address on the network and port 8888.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Then, I went back to JMeter on my laptop and started the HTTP(S) Test Script Recorder.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Finally, I navigated to the app, typed in flood.io in the Precinct ID field (obviously not a real ID), and clicked the &amp;ldquo;Click here to log in&amp;rdquo; button.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&amp;rsquo;s the traffic as seen on JMeter&amp;rsquo;s View Results Tree listener afterward:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200306-03.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;And here&amp;rsquo;s the recorded request within the recording controller:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200306-04.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h3 id="analyzing-the-request"&gt;Analyzing the request&lt;/h3&gt;
&lt;p&gt;It looks like at least the initial login request is a GET to an Auth0 service, with several parameters being passed in the body. It also has some authorization headers.&lt;/p&gt;
&lt;p&gt;The parameter values also look like they might be dynamic, meaning they change from session to session. At this point, I would typically change some of these from being hardcoded values into dynamic ones so that the application receives a request in the right format, and I could look through &lt;a href="https://auth0.com/docs/api/authentication"&gt;Auth0&amp;rsquo;s API documentation&lt;/a&gt; to find out how the authentication message should be formulated.&lt;/p&gt;
&lt;p&gt;Since I don&amp;rsquo;t have a valid login for testing purposes, I skipped this step and just used the raw request for demonstration purposes.&lt;/p&gt;
&lt;h3 id="preparing-to-run"&gt;Preparing to run&lt;/h3&gt;
&lt;p&gt;Think time is a delay between requests meant to simulate the time it takes for a user to think before taking another action. Without think time, JMeter would fire off requests one after another, which often isn&amp;rsquo;t realistic and drains resources. I don&amp;rsquo;t want that, so I added a JMeter timer. There are plenty of timers available, but I settled on a Uniform Random Timer.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.vice.com/en_us/article/3a8ajj/an-off-the-shelf-skeleton-project-experts-analyze-the-app-that-broke-iowa"&gt;The CEO of Shadow told Motherboard&lt;/a&gt; that many precinct chairs were confused by the login process as they had to put in three strings of numbers in the right sequence. So, I decided to work that into the script with the timer. I set it up with a constant delay of 2 minutes and a random delay of 1 minute so that the delay would vary from 2 minutes to 3 minutes to simulate a precinct chair attempting to log in a few times.&lt;/p&gt;
&lt;h2 id="execution-running-your-mobile-load-test"&gt;Execution: Running your mobile load test&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.vice.com/en_us/article/z3b3g9/here-is-a-link-to-the-shadow-inc-app-that-blew-up-the-iowa-caucus"&gt;According to Motherboard&lt;/a&gt;, Shadow has already taken the app servers offline. However, it&amp;rsquo;s not a good idea to run a full load test against an endpoint that you don&amp;rsquo;t own, so I decided not to run a test.&lt;/p&gt;
&lt;p&gt;Usually, though, I’d want to start with a shakeout test of 10 users or so, and then gradually increase the user load until the peak of 1,800 users. I also would have played around with changing the load profile, such as by increasing or decreasing the ramp-up or steady-state durations, experimenting with stress tests and soak tests, and adding traffic from another availability zone to simulate the 99 satellite precincts around the world. Running multiple load generators can quickly get out of hand if you want to use physical machines, so I would run load tests on the cloud with something like &lt;a href="https://flood.io/"&gt;Flood&lt;/a&gt;. All of these little changes would have given valuable data that would help me gauge the app’s performance in production-like situations.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Building quality software is not a trivial task. There are many moving parts to account for, and critical errors can be introduced in every stage of an app&amp;rsquo;s development. While load issues were not the main culprit in the failure of the IowaReporterApp, a simple load test like the one I describe here, might have improved app stability and reliability. Even in cases where load testing doesn&amp;rsquo;t seem necessary, it can still uncover gross issues in configuration, usability, or security for an app developed on a deadline.&lt;/p&gt;</description></item><item><title>How AirTasker uses Ruby JMeter and Flood for their load testing</title><link>https://nicolevanderhoeven.com/blog/20200224-airtasker/</link><pubDate>Mon, 24 Feb 2020 18:23:31 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200224-airtasker/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/how-airtasker-uses-ruby-jmeter-and-flood-for-their-load-testing"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/how-airtasker-uses-ruby-jmeter-and-flood-for-their-load-testing"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In the recent RubyConf 2020 held in Melbourne, Australia, Nancy Cai from AirTasker talked about how they built a performance testing framework using Ruby JMeter and Flood. Luckily, we had some pleasantly surprised Flooders in attendance to take notes during this fantastic talk!&lt;/p&gt;
&lt;p&gt;AirTasker is a platform allowing the outsourcing of everyday tasks. When discussing the reasons that AirTasker decided they wanted to carry out performance and load testing, Nancy told a fascinating story about an overly successful marketing campaign—a good problem to have, but a problem nonetheless. The Sydney Cats and Dogs Home, an animal shelter, teamed up with AirTasker to pay one lucky person $500 to spend the day playing with the resident animals. The prospect of this dream job created an enormous surge in AirTasker&amp;rsquo;s traffic that caused alarm bells to go off on the underlying application servers, resulting in an end-user experience that was less than desired.&lt;/p&gt;
&lt;p&gt;Nancy included this hilarious slide about some common feelings regarding application performance.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200224-01.png" alt="A common feeling when application performance is brought up" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="steps-for-running-a-performance-test-the-airtasker-way"&gt;Steps for running a performance test, the AirTasker way&lt;/h2&gt;
&lt;p&gt;To avoid repeating that mistake, Nancy and her team set out to run performance testing by using the following simple steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Determine performance criteria.&lt;/li&gt;
&lt;li&gt;Configure the test environment to be as production-like as possible.&lt;/li&gt;
&lt;li&gt;Plan and design based on user behavior, including preparing test data.&lt;/li&gt;
&lt;li&gt;Implement test design and set up the framework (which in AirTasker&amp;rsquo;s case involved Ruby JMeter as the performance testing tool and Flood as a load testing solution).&lt;/li&gt;
&lt;li&gt;Run test.&lt;/li&gt;
&lt;li&gt;Analyze and fine-tune results.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="setting-up-a-load-testing-tool-and-framework"&gt;Setting up a load testing tool and framework&lt;/h2&gt;
&lt;p&gt;When it came to selecting the right tools for the job, AirTasker wanted tools that met the following criteria:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ability to simulate production-like traffic easily&lt;/li&gt;
&lt;li&gt;Widespread use in the industry&lt;/li&gt;
&lt;li&gt;Ease of creation and maintenance of tests for everyone&lt;/li&gt;
&lt;li&gt;Historical results aggregation&lt;/li&gt;
&lt;li&gt;Visualization of performance metrics&lt;/li&gt;
&lt;li&gt;Integration with CI and monitoring tools&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nancy&amp;rsquo;s team compared several load testing tools and found they enjoyed using the Apache JMeter tool, which is a popular open source load testing software. However, they quickly ran into an &amp;ldquo;out of memory&amp;rdquo; error after attempting to run about 400-800 concurrent users on a single machine. She and her team decided to use a distributed load testing platform to run the load they required to scale up more effectively.&lt;/p&gt;
&lt;p&gt;Enter Flood.&lt;/p&gt;
&lt;h2 id="why-airtasker-chose-flood"&gt;Why AirTasker chose Flood&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200224-02.png" alt="JMeter, Flood, and the Ruby JMeter gem combination is a winner" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We also chose Flood.io [&amp;hellip;] because it comes in with a really good open-source gem called Ruby JMeter. It is a Ruby-based DSL for building JMeter test plans. - Nancy Cai, AirTasker&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Nancy and her team enjoyed the benefits of being able to write load tests natively in Ruby and then using Flood&amp;rsquo;s Ruby JMeter gem, which is a Domain-Specific Language (DSL). Flood allowed them to turn their Ruby scripts into .jmx files, which is the native XML format that JMeter uses.&lt;/p&gt;
&lt;p&gt;When they were ready to scale up, AirTasker ran the same JMeter script in Flood.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200224-03.png" alt="Sample of a report on Flood from a JMeter test" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;The real-time Flood dashboard allowed them to see that there was a problem on one of the API endpoints, called &amp;ldquo;Get pet reviews.&amp;rdquo; Further investigations revealed a performance issue due to a long-running query against a database server in the code, which AirTasker&amp;rsquo;s developers could fix.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best practices&lt;/h2&gt;
&lt;p&gt;Nancy gives some great advice for anyone running a performance test, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;asking the right questions as a load tester&lt;/li&gt;
&lt;li&gt;running baseline tests&lt;/li&gt;
&lt;li&gt;being aware of the difference between your test and production environments&lt;/li&gt;
&lt;li&gt;keeping in mind the caching and autoscaling mechanisms that may drastically change the results&lt;/li&gt;
&lt;li&gt;the differences between stress testing and other types of performance testing&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We were so thrilled to hear Nancy&amp;rsquo;s story on how Flood helped AirTasker run their performance tests. Catch the entirety of Nancy&amp;rsquo;s talk below, and check out the resource links at the end of the post to follow Nancy&amp;rsquo;s story.‍&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Q09wJm4P8Xw?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://github.com/flood-io/ruby-jmeter"&gt;Flood&amp;rsquo;s Ruby JMeter gem&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/nancy-cai/performance-test-ruby-jmeter"&gt;Nancy&amp;rsquo;s GitHub repo&lt;/a&gt; where you can find a copy of her test scripts&lt;/p&gt;
&lt;p&gt;Follow Nancy on &lt;a href="https://twitter.com/nancycai8"&gt;Twitter&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Follow Nancy on &lt;a href="https://github.com/nancy-cai"&gt;GitHub&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Mobile Load Testing on the Cloud</title><link>https://nicolevanderhoeven.com/blog/20200221-mobile-load-testing-on-the-cloud/</link><pubDate>Fri, 21 Feb 2020 18:44:58 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200221-mobile-load-testing-on-the-cloud/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/mobile-load-testing-on-the-cloud"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/mobile-load-testing-on-the-cloud"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="what-is-mobile-load-testing"&gt;What is mobile load testing?&lt;/h2&gt;
&lt;p&gt;What is the difference between load testing web apps and mobile apps? In general, your goal is the same: to improve app performance by systematically exposing your app to the load you expect, whether it&amp;rsquo;s on the web or on a mobile device. However, while the purpose may be the same, there a few extra things to consider when it comes to mobile app performance, and it&amp;rsquo;s easy to make some key mistakes. In this article, I&amp;rsquo;ll give you a little bit of the theory behind mobile load testing and then show you practical steps to script and execute a load test.&lt;/p&gt;
&lt;h2 id="challenges-in-mobile-load-testing"&gt;Challenges in mobile load testing&lt;/h2&gt;
&lt;p&gt;If you have a web app that is mobile first, and your users typically access your site through a browser on their mobile devices as well as on their laptops, you have more choices for optimizing mobile performance. You can use browser-based load testing tools as well as protocol-level load testing tools to generate load.&lt;/p&gt;
&lt;p&gt;If you have a native mobile app that you&amp;rsquo;d like to load test, though, browser-based load testing tools are a little more complicated. One of the most common approaches to mobile load testing is to use some type of device farm. A device farm is a collection of mobile devices and a way to orchestrate and control them so that they access an application simultaneously. Here&amp;rsquo;s why they&amp;rsquo;re not the best choice for load testing.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200221-01.jpg" alt="Fragmentation can make mobile load testing difficult" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h3 id="device-fragmentation"&gt;Device fragmentation&lt;/h3&gt;
&lt;p&gt;One of the biggest challenges is mobile device fragmentation. Not only are there a lot of mobile devices, but there are also many operating systems and versions. Even narrowing the pool to Android and ios leaves us with a large selection. A common mistake in mobile load testing is trying to account for these hundreds of combinations.&lt;/p&gt;
&lt;h3 id="logistics"&gt;Logistics&lt;/h3&gt;
&lt;p&gt;Another challenge is the logistics of controlling physical devices with different operating systems, which is not trivial. Unless you have a thousand friends that you can rope into doing this at the same time, you&amp;rsquo;ll need to pay for some sort of service that can orchestrate this for you.&lt;/p&gt;
&lt;h3 id="cost"&gt;Cost&lt;/h3&gt;
&lt;p&gt;There&amp;rsquo;s also the fact that this process is resource-intensive. Even if your device farm consists of emulators on virtual machines rather than physical mobile devices, that still uses up a lot of CPU and memory, and you&amp;rsquo;d need to spin up dozens or hundreds of machines.&lt;/p&gt;
&lt;p&gt;Luckily, this type of mobile load testing is not the only option available to us.&lt;/p&gt;
&lt;h2 id="better-strategies-for-mobile-load-testing"&gt;Better strategies for mobile load testing&lt;/h2&gt;
&lt;p&gt;A better option for back-end performance testing or load testing your mobile application is by using API load testing, which works on the protocol level. To understand this, let&amp;rsquo;s talk about what aspects of software we are analyzing when we test for &amp;ldquo;performance.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;We can generally break up performance testing into two types: front-end and back-end. Both types have the goal of making the app respond faster to end-users, but they do so by optimizing different parts of the application.&lt;/p&gt;
&lt;h3 id="front-end-performance"&gt;Front-end performance&lt;/h3&gt;
&lt;p&gt;Front-end performance is primarily concerned with the UI of the app. A front-end performance tester optimizes page resources (like CSS, images, JS) to render faster on the page. Since a mobile app runs on a user&amp;rsquo;s smartphone or another mobile device, its front-end performance would also be affected by things we can&amp;rsquo;t control, such as the operating system and version of the mobile or its physical configuration (CPU and memory). A front-end issue for a particular mobile device type might not necessarily affect performance on another. Device farms can be good at measuring front-end performance.&lt;/p&gt;
&lt;h3 id="back-end-performance"&gt;Back-end performance&lt;/h3&gt;
&lt;p&gt;In contrast, back-end performance focuses on the underlying mobile application servers. A back-end performance tester optimizes the things behind the interface, and it is affected by things like the size of the responses that a server sends to a user, server configuration, application infrastructure, and how downstream servers talk to each other. These factors may be invisible to a typical end-user. A performance bottleneck in the back-end is likely to affect all users of an app to some degree.&lt;/p&gt;
&lt;h3 id="load-testing-for-back-end-performance"&gt;Load testing for back-end performance&lt;/h3&gt;
&lt;p&gt;Load testing is about determining how your mobile application behaves in response to traffic, so it targets the back-end components of the application, not the front-end.&lt;/p&gt;
&lt;p&gt;Both front-end and back-end performance are necessary to get a holistic view of mobile performance. Still, &lt;strong&gt;if you want to load test your mobile app, you need to generate traffic on your application &lt;em&gt;server&lt;/em&gt;, and not necessarily to drive the app on real devices&lt;/strong&gt;. Understanding this opens up options for mobile load testing.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200221-02.jpg" alt="A data center can be out of most testing teams’ reach" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="api-load-testing"&gt;API load testing&lt;/h2&gt;
&lt;p&gt;Most native mobile apps work by using a RESTful API to send instructions to the application server. Luckily for us, there&amp;rsquo;s no magic in sending these types of requests from a smartphone— we can simulate this easily by using an API load testing tool to send these requests on a non-mobile device too.&lt;/p&gt;
&lt;p&gt;Here are some advantages of using API load testing tools to test your mobile app instead of using a device farm:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;It&amp;rsquo;s easier to set up and maintain&lt;/strong&gt;: API load testing can be easier because you don&amp;rsquo;t have to account for changes in the user interface as long as the underlying API calls are the same.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It&amp;rsquo;s cost-effective&lt;/strong&gt;: You can run about 1,000 users for an API test on a single machine (we used AWS m5.xlarge machines to arrive at this estimate). This translates into fewer resources that you&amp;rsquo;ll need to pay for whether you&amp;rsquo;re running a thousand users or [a million](whether you&amp;rsquo;re running a thousand users or a million), and, ultimately, a lower cost.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It lets you narrow your load testing scope&lt;/strong&gt;: If you have a particular endpoint that has historically shown performance issues, you can use API load testing to target just that one endpoint. On a device farm, you would have to create a test automation script that might click a button and send dozens of requests, only one of which you actually wanted to test.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="tools-for-mobile-load-testing"&gt;Tools for mobile load testing&lt;/h3&gt;
&lt;p&gt;You can use many tools for API load testing, but you can&amp;rsquo;t go wrong with robust open-source tools like JMeter and Gatling. Both tools are well-used tools in the performance industry, and they also have large user bases and ample documentation for helping anyone get started. In this article, I&amp;rsquo;ll continue with JMeter specifically.&lt;/p&gt;
&lt;p&gt;How do you get started with writing your script? Ideally, your developers should be able to point you to the API documentation for your app or be able to describe the format of the request themselves. But what if you wanted to get started on your own?&lt;/p&gt;
&lt;h2 id="how-to-record-network-traffic-from-a-native-app-with-apache-jmeter"&gt;How to record network traffic from a native app with Apache JMeter&lt;/h2&gt;
&lt;p&gt;Recently I wrote &lt;a href="https://thenewstack.io/how-id-load-test-the-iowa-caucus-app/"&gt;an article on The New Stack&lt;/a&gt; about how I would have load tested the IowaReporterApp, which was responsible for delays in reported vote totals for the 2020 Iowa Democratic Caucuses. To show how to load test that app, I created an actual load testing script for that article, without any input from the app developers. I chose to script using Apache JMeter, a popular open source API load testing tool, but Gatling (also open source) is another good option.&lt;/p&gt;
&lt;p&gt;Here are the steps I took on my Android mobile, a Samsung Galaxy Note 10+. The same principles should apply to iOS devices and other Android devices.&lt;/p&gt;
&lt;h3 id="1-download-and-install-the-app"&gt;1. Download and install the app.&lt;/h3&gt;
&lt;p&gt;Even if the app isn&amp;rsquo;t on the Google Play store, you can install an app using the .apk file. You may have to enable Developer Mode on your phone, which is not the same as jailbreaking. All this does is bypass the security feature that would otherwise not allow you to install apps that don&amp;rsquo;t come from the Play store.&lt;/p&gt;
&lt;p&gt;To enable Developer Mode, go to Settings &amp;gt; About phone &amp;gt; Software information. Then, scroll down to the field Build number and tap it seven times. You should see a confirmation message that Developer mode is on.&lt;/p&gt;
&lt;p&gt;Now download the .apk, click on it, and follow the prompts to install it.&lt;/p&gt;
&lt;h3 id="2-set-up-an-https-test-script-recorder-on-jmeter"&gt;2. Set up an HTTP(S) Test Script Recorder on JMeter&lt;/h3&gt;
&lt;p&gt;You&amp;rsquo;ll need to have JMeter set up already for this step.&lt;/p&gt;
&lt;p&gt;Connect your laptop to a wi-fi network.&lt;/p&gt;
&lt;p&gt;From a new test plan on JMeter, right-click on Test Plan and then click on Add &amp;gt; Non-Test Elements &amp;gt; HTTP(S) Test Script Recorder. Click on it and take note of the port it uses in Global Settings.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200221-03.png" alt="Checking the port in the JMeter HTTPS Test Script Recorder" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Next, right-click on the test recorder element you just created and click Add &amp;gt; Listener &amp;gt; View Results Tree. This element shows details of requests and responses when we run tests.&lt;/p&gt;
&lt;p&gt;Then, right-click on Test Plan again and click Add &amp;gt; Threads &amp;gt; Thread Group.&lt;/p&gt;
&lt;p&gt;Finally, right-click on Thread Group and click Add &amp;gt; Logic Controller &amp;gt; Recording Controller.&lt;/p&gt;
&lt;p&gt;Your test plan should look something like this:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200221-04.png" alt="JMeter Test Plan containing a Recording Controller and an HTTPS Test Script Reocrder" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h3 id="3-set-up-your-mobile-to-use-a-proxy"&gt;3. Set up your mobile to use a proxy.&lt;/h3&gt;
&lt;p&gt;On your mobile, connect to the same wireless network that your laptop is connected to.&lt;/p&gt;
&lt;p&gt;Go back to your laptop and find out its local IP address. On a Mac, you can see this by clicking on the Apple logo &amp;gt; System Preferences &amp;gt; Network &amp;gt; Advanced &amp;gt; TCP/IP. The IPv4 Address is what you&amp;rsquo;re looking for, and it might look something like 192.168.86.125.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200221-05.png" alt="Getting your local IP address on a Mac" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;On your mobile, go to Settings &amp;gt; Connections &amp;gt; Wi-Fi. Under Current network, click on the settings wheel next to your wireless network. Click on Advanced.&lt;/p&gt;
&lt;p&gt;Enter your computer&amp;rsquo;s local IP address in the Proxy host name field.&lt;/p&gt;
&lt;p&gt;In the Proxy port field, enter 8888, or the port that was displayed in the HTTP(S) Test Script Recorder on JMeter.&lt;/p&gt;
&lt;p&gt;Click Save.&lt;/p&gt;
&lt;h3 id="4-start-recording-traffic"&gt;4. Start recording traffic.&lt;/h3&gt;
&lt;p&gt;On JMeter, click on the HTTP(s) Test Script Recorder element and click Start.&lt;/p&gt;
&lt;p&gt;On your mobile, open the app and log in or perform the action that you&amp;rsquo;d like to record.&lt;/p&gt;
&lt;p&gt;As you use the app, you should be able to see the requests coming in on JMeter in the View Results Tree:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200221-06.png" alt="View Results Tree listener view of traffic coming from the proxy" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;If you click on the Recording Controller, you&amp;rsquo;ll also see the exact format of the requests that the app made:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200221-07.png" alt="Seeing parameters sent with a recorded request in JMeter" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="scripting-and-troubleshooting-your-mobile-load-testing-script"&gt;Scripting and troubleshooting your mobile load testing script&lt;/h2&gt;
&lt;p&gt;What you now have is a recording of the mobile traffic you need to simulate. If you stop here and try to run it, you may find that it fails. That&amp;rsquo;s because you haven&amp;rsquo;t done any scripting yet.&lt;/p&gt;
&lt;p&gt;Here are a few things you&amp;rsquo;ll need to do to turn a recording into a script.&lt;/p&gt;
&lt;h3 id="add-assertions"&gt;Add assertions&lt;/h3&gt;
&lt;p&gt;An assertion is a way to verify that the request is returning the response that you expect. JMeter only marks a request as failed when it returns an HTTP 4xx or HTTP 5xx response code. However, there are times when the HTTP response code returned is an HTTP 200 OK, but the page that was returned was still not the one you expected. Without assertions, JMeter would mark this request as passed, yielding false positives.&lt;/p&gt;
&lt;p&gt;For instance, if you&amp;rsquo;re sending a login request, then a good assertion for the response to that request might be text like &amp;ldquo;Welcome, Nicole&amp;rdquo; or &amp;ldquo;Logged in.&amp;rdquo; To see the data that should be returned, you can either run through the action manually in your browser and use Developer Tools to inspect the response or click on the response tab in the View Results Tree listener in JMeter from your recording.&lt;/p&gt;
&lt;p&gt;Assertions also allow you to pinpoint more accurately where in your script the error is.&lt;/p&gt;
&lt;h3 id="replace-hardcoded-values-with-dynamic-values"&gt;Replace hardcoded values with dynamic values&lt;/h3&gt;
&lt;p&gt;The last screenshot above shows the parameters that the mobile application sends to the server to log in. If you examine the parameter values, you&amp;rsquo;ll notice that several of them are long strings. The script fails when you just send the same request again because some of these are dynamic. This means that parts of the request need to change before your device is allowed to access the application. You might need to add a timestamp, the right answer to a challenge, a session or client ID, or codes returned in previous requests. These dynamic values help the server determine whether the login request is a valid login attempt.&lt;/p&gt;
&lt;p&gt;This is where help from a developer would come in handy because he or she can tell you how each parameter value needs to be formed.&lt;/p&gt;
&lt;h3 id="add-think-time"&gt;Add think time&lt;/h3&gt;
&lt;p&gt;Think time is a delay between requests that simulates the pauses that a real user takes to read text on the page or otherwise interact with your application. Most performance testing tools do this. In JMeter, they are called timers, and there are several to choose from.&lt;/p&gt;
&lt;p&gt;I like the Uniform Random Timer because it allows you to set a constant value for the delay as well as an additional random delay on top of it. I recommend having a variable delay because setting a completely constant delay makes the test too regular and causes unnaturally high load at the interval you set. Real users don&amp;rsquo;t coordinate with each other, so stagger your requests by using a variable component to your think time.&lt;/p&gt;
&lt;h3 id="debug-your-test-script"&gt;Debug your test script&lt;/h3&gt;
&lt;p&gt;Before you think about scaling up, run your test a few times with one user on your local machine. If you don&amp;rsquo;t get any errors, try other configurations such as running two sequential users and running two threads at the same time. This way, you can test any correlations you&amp;rsquo;ve had to make for those dynamic values.&lt;/p&gt;
&lt;p&gt;It may be tempting to skip this step, but it&amp;rsquo;s necessary before scaling up your load test.&lt;/p&gt;
&lt;h3 id="set-test-parameters"&gt;Set test parameters&lt;/h3&gt;
&lt;p&gt;Test parameters are settings like the number of threads, ramp-up, and duration, which allow you to shape the pattern of the load you want to generate according to your test scenarios and test cases.&lt;/p&gt;
&lt;h4 id="number-of-concurrent-users-or-threads"&gt;Number of concurrent users or threads&lt;/h4&gt;
&lt;p&gt;This is the most obvious way to increase load. The more instances of your script running, the more requests are executed.&lt;/p&gt;
&lt;p&gt;You can change this in JMeter by clicking on your Thread Group and changing the “Number of Threads (users)” field:&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/20200221-08.png" alt="Changing the number of threads in JMeter" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h4 id="ramp-up"&gt;Ramp-up&lt;/h4&gt;
&lt;p&gt;In production, load on servers very rarely goes from 0 to 1000 in one second. Even for cases with a very definitive start time (such as an item going on sale at a particular time), the load generally increases gradually. You can simulate this gradual increase by adding ramp-up times in your script. A ramp-up is the amount of time during which new users are added at staggered intervals.&lt;/p&gt;
&lt;p&gt;Here’s an example of what that might look like:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200221-09.png" alt="Changing the ramp-up of a test in JMeter" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h4 id="duration"&gt;Duration&lt;/h4&gt;
&lt;p&gt;Duration is how long the whole test lasts.&lt;/p&gt;
&lt;p&gt;The simplest way to set these values in JMeter is to use the basic Thread Group. You’ll need to change the fields highlighted below:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200221-10.png" alt="Changing test parameters in JMeter" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;To use the duration, you’ll have to select “Forever” next to Loop Count and “Scheduler” and type in the number of seconds in the Duration field. Otherwise, you can also run the script according to the number of loops, or iterations, that you want to run. However, since response times vary, using the Loop Count as a proxy for duration yields different results from test to test.&lt;/p&gt;
&lt;h2 id="running-a-shakeout-test-against-your-mobile-application"&gt;Running a shakeout test against your mobile application&lt;/h2&gt;
&lt;p&gt;When you&amp;rsquo;re ready to run on your load generators, resist the urge to jump straight to the peak load you want. This is a great way to incur unnecessary costs. Instead, run a small test with dozens of users. Running locally is for debugging issues in the script. The purpose of running a shakeout test is to spot errors elsewhere, such as in your test environment and your test data.&lt;/p&gt;
&lt;h2 id="baselining-your-mobile-application-performance"&gt;Baselining your mobile application performance&lt;/h2&gt;
&lt;p&gt;Finding a baseline is one of the primary goals you’ll have as you start executing load tests. To be able to assess how changes in the environment or code affect application performance, you’ll need a stable point of comparison. To accurately measure the effect of a variable (like a code change), it’s best to keep as much of the other circumstances surrounding the test as fixed as possible. The baseline is your &lt;strong&gt;unchanging&lt;/strong&gt; test scenario that you can use as a point of comparison to assess future performance.&lt;/p&gt;
&lt;p&gt;The application you&amp;rsquo;re scripting against, your tool of choice, and your script all affect your performance baseline, so do some experimenting to find out the setup that works best for your situation. This setup includes characteristics like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the number of concurrent users&lt;/li&gt;
&lt;li&gt;test duration&lt;/li&gt;
&lt;li&gt;think time, pacing, and all other waits and delays&lt;/li&gt;
&lt;li&gt;the script (including how requests are broken up into transactions)&lt;/li&gt;
&lt;li&gt;user density&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="user-density"&gt;User Density&lt;/h3&gt;
&lt;p&gt;User density is the number of threads that you can run on a node or a load generator. Figuring out user density it essential because all load generators, even virtual ones, have finite resources. Each load generator also has a finite amount of load that it can generate, based on its CPU and memory utilization, among other things. Trying to generate too many users on a single node may result in the node itself being the bottleneck for your test.&lt;/p&gt;
&lt;p&gt;To accurately assess your application’s performance, your load generators need to remain healthy during the test.&lt;/p&gt;
&lt;p&gt;It can be helpful to have a number to start with. At Flood, we’ve found that we can reliably run 1000 users using JMeter or Gatling with one of our AWS &lt;a href="https://aws.amazon.com/es/ec2/instance-types/"&gt;m5.xlarge machines&lt;/a&gt;. For reference, an m5.xlarge machine has 4 VCPUs and 16 GB RAM.&lt;/p&gt;
&lt;p&gt;If your machine is similarly specced, run a test on a single node with 1000 users. While the test runs, watch the CPU and memory utilization. If the test finishes without either of those consistently hitting over 80%, you’ll know that the node can handle that number of users.&lt;/p&gt;
&lt;p&gt;Let me reiterate, though, that you should use the 1000 users figure as a starting point only. You can then figure out your number through trial and error. Increase the number of users past 1000 and watch the resource utilization again. If that still looks good, add some more users and rerun. When you get to a test where the resource utilization hovers above 80%, stop and fall back to the previous number of users. You’ll now have your number.&lt;/p&gt;
&lt;p&gt;Another thing you might want to play with is the think time and pacing in your script. These waits tend to have a significant impact on resource utilization, so you can expect to be able to run more users per node if you increase your delays.&lt;/p&gt;
&lt;p&gt;If you’re using JMeter, always run your tests in non-GUI mode. GUI mode is great for debugging, but is unnecessarily resource-intensive for real load tests. While you’re at it, disable any listeners you may have that you don’t need to capture results.&lt;/p&gt;
&lt;p&gt;Figuring out the appropriate user density now prevents you from getting inaccurate test results. Running as many users as you can without overloading the load generators is also cost-effective, as you’ll be making sure that you provision only as many nodes as you need.&lt;/p&gt;
&lt;h2 id="scaling-up-your-load-test-on-the-cloud"&gt;Scaling up your load test on the cloud&lt;/h2&gt;
&lt;p&gt;It’s relatively simple to run a load test on one machine, but if you want to run on two or more machines, things quickly get unwieldy. Here are some options for achieving this.&lt;/p&gt;
&lt;h3 id="1-upload-your-tool-of-choice-and-script-to-every-machine-and-kick-off-each-test-separately"&gt;1. Upload your tool of choice and script to every machine and kick off each test separately.&lt;/h3&gt;
&lt;p&gt;Instead of running one large load test, think of this method as running several smaller ones at (about) the same time. This is relatively easy to set up, but the main disadvantage is that it’s tedious. You may also need licenses for your tools if you&amp;rsquo;re not using an open source one. You’ll want to ensure that each load generator is as similar as possible to the others in terms of operating system, tool version, and script version. Since each node kicks off a separate test, you’re not going to be able to see a real-time combined view of all the load tests, and after execution, you’ll need to retrieve results files individually and combine them.&lt;/p&gt;
&lt;h3 id="2-use-your-tools-distributed-testing-mode"&gt;2. Use your tool’s distributed testing mode.&lt;/h3&gt;
&lt;p&gt;JMeter has a feature that allows you to scale. This involves setting up agents on each load generator and using scripts to coordinate execution and results collection. This method requires a little bit more know-how and time to set up, but it’s a little more cohesive than the first method. Here are links on how to set this up: Remote Testing with JMeter&lt;/p&gt;
&lt;h3 id="3-use-a-load-testing-platform"&gt;3. Use a load testing platform.&lt;/h3&gt;
&lt;p&gt;I&amp;rsquo;m admittedly biased, but if I were to go back to doing performance testing consulting work, I would choose Flood to run my tests. A platform like Flood that is built for distributed load testing is an excellent choice because it takes away all the setup considerations. This is the easiest option, especially for teams that are new to load testing or are perhaps less technical, because all the setup is done through a UI. Scaling out in this case just means uploading your script, choosing the number of nodes you want to run and in which region, and all the work is done for you in the background.&lt;/p&gt;
&lt;p&gt;While you can run on-premises, I would consider running your test cloud-based infrastructure for greater flexibility and ease of scaling unless you already have a data center.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200221-11.jpg" alt="Running a load test on the cloud is the easiest way to get started with mobile load testing" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="what-happens-next"&gt;What happens next?&lt;/h2&gt;
&lt;p&gt;Running your test is just the beginning of mobile performance testing— there&amp;rsquo;s still metrics collection, results analysis, and resolving performance bottlenecks that you uncover. After all, it&amp;rsquo;s what you do with the test results that counts. Remember that performance and load testing, whether for web-based applications or mobile ones, are iterative. The real value comes from building the app performance testing principles discussed here into your release cycles, so that load testing becomes a habit rather than just a one-off exercise.&lt;/p&gt;</description></item><item><title>Load Testing Tutorial: Server Monitoring</title><link>https://nicolevanderhoeven.com/blog/20190926-load-testing-tutorial-server-monitoring/</link><pubDate>Thu, 26 Sep 2019 19:30:10 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20190926-load-testing-tutorial-server-monitoring/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/load-testing-tutorial-server-monitoring"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/load-testing-tutorial-server-monitoring"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;It’s difficult to be a good load tester if you don’t like data, because a lot of the value of the load testing is in the analysis. Even if you successfully generate load against an application, it’s ineffective without enough data to determine how your application coped with the load. At &lt;a href="https://flood.io"&gt;Flood&lt;/a&gt;, we’re passionate about data because we know it drives decisions, so we’re always working to improve how we present data generated by our nodes. However, there’s another important source of data that in my experience is too often overlooked by new load testers: your own application servers.&lt;/p&gt;
&lt;p&gt;Executing a load test without monitoring server health is like flying blind: you’ll know when you land safely and you’ll know when you crash, but even if you do crash, you won’t know why—or how you can avoid it next time. Monitoring server health is the black box that will tell you what went wrong.&lt;/p&gt;
&lt;h2 id="what-server-metrics-should-you-monitor"&gt;What server metrics should you monitor?&lt;/h2&gt;
&lt;p&gt;There are a lot of metrics that you can monitor, and we always recommend that you choose what to measure based on your own specific circumstances, such as the &lt;a href="https://flood.io/blog/start-with-why-how-to-write-requirements-for-api-load-testing/"&gt;purpose for your testing&lt;/a&gt; or any previous outages you’ve had in the past. If you’re new to load testing, though, here’s a list of metrics you might consider measuring:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Processor Time&lt;/strong&gt; - how much the processor is being utilised&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Processor Interrupt Time&lt;/strong&gt; - how much time the processor is spending to handle interrupts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Processor Privileged Time&lt;/strong&gt; - the time the processor spends handling overhead activities&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Processor Queue Length&lt;/strong&gt; - the number of threads that are waiting to be executed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Memory (Available Bytes)&lt;/strong&gt; - unused memory available to process new requests&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Memory Cache Bytes&lt;/strong&gt; - the size of the memory cache, which is where copies of frequently accessed data are stored&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disk I/O&lt;/strong&gt; - number of reads and writes to the disk during the test&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disk Idle Time&lt;/strong&gt; - time that disks are not doing work&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disk Transfer/sec&lt;/strong&gt; - average number of seconds that an I/O request takes to complete&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disk Write/sec&lt;/strong&gt; - average number of seconds that a write request takes to complete&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Network I/O&lt;/strong&gt; - bytes sent and received&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="how-do-you-determine-which-one-to-use"&gt;How do you determine which one to use?&lt;/h2&gt;
&lt;p&gt;If you’re still not sure where to start: &lt;strong&gt;At a minimum, you’ll need the CPU and memory utilisation&lt;/strong&gt; (in bold in the list above) of every major component you want to test. These two metrics are vital and if either of these is consistently maxing out at (or close to) 100%, that’s a sign that the component is struggling with the number of requests.&lt;/p&gt;
&lt;p&gt;As an aside, CPU and memory over-utilisation is a very common reason for less-than-ideal response times on the load generators, which is why we also show you those metrics on our nodes while you’re running the test.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20190926-01.png" alt="A snapshot of the server metrics provided for Flood’s servers during execution" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="how-can-you-monitor-these-metrics"&gt;How can you monitor these metrics?&lt;/h2&gt;
&lt;p&gt;How you get these metrics depends on your budget and your operating system. I’ll start with the free or lower cost methods and work my way up to enterprise solutions.&lt;/p&gt;
&lt;p&gt;If your servers are running Windows, &lt;a href="https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/perfmon"&gt;PerfMon&lt;/a&gt; is a good alternative. It’s built into Windows and the interface allows you to choose the counters that you want to measure and start recording.&lt;/p&gt;
&lt;p&gt;There’s also a JMeter &lt;a href="https://github.com/undera/perfmon-agent"&gt;server agent that you can download&lt;/a&gt;, confusingly called “PerfMon” but not to be mistaken with Windows’ PerfMon, that you can install on your (Windows or Linux) server and will gather metrics. It’s normally used in conjunction with the &lt;a href="https://jmeter-plugins.org/wiki/PerfMon/"&gt;PerfMon JMeter plugin&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20190926-02.png" alt="Overview of the setup in the PerfMon JMeter plugin" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.nagios.org/projects/nagios-core/"&gt;Nagios Core&lt;/a&gt; is another good open-source way to not only collect metrics but also set up alerts when values exceed certain thresholds that you can set.&lt;/p&gt;
&lt;p&gt;Moving from free and open-source options to more enterprise solutions, &lt;a href="https://www.dynatrace.com/"&gt;Dynatrace&lt;/a&gt; is a powerful tool that allows you to track not just server health but can actually be used to trace individual requests using a custom header.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.appdynamics.com/"&gt;AppDynamics&lt;/a&gt; is another fantastic tool that allows you to really drill down to specific SQL queries that take a long time to execute, for example, feeding you important information to give to your DBAs.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://newrelic.com/"&gt;New Relic&lt;/a&gt; is another good choice for monitoring production as well as test environments, and we particularly love its thread profiling feature.&lt;/p&gt;
&lt;p&gt;Other noteworthy tools are the &lt;a href="https://docs.microsoft.com/en-us/system-center/scom/welcome?view=sc-om-2019"&gt;Microsoft System Center Operations Manager&lt;/a&gt;, the &lt;a href="https://www.oracle.com/technetwork/oem/enterprise-manager/overview/index.html"&gt;Oracle Enterprise Manager&lt;/a&gt;, and &lt;a href="https://support.microsoft.com/en-us/help/3134893/new-with-bluestripe-factfinder-8-1"&gt;BlueStripe FactFinder&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Flood offers out of the box integrations with Dynatrace, AppDynamics and New Relic. If you’re already using one of these tools, you can push the load metrics from Flood into the dashboards that you’re already using, allowing you to see both load metrics and server metrics in the same place. Here’s an example of a dashboard our own Antonio Jimenez created in New Relic which combined Flood-provided metrics with server-side metrics:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20190926-03.png" alt="Combined dashboard displaying Flood’s front end focused metrics alongside back end focused metrics captured by New Relic" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;This view helps with spotting correlations or trends across the different sets of data, such as a response time graph that begins to increase at the same time that server memory utilization does.&lt;/p&gt;
&lt;h2 id="putting-it-all-together"&gt;Putting It All Together&lt;/h2&gt;
&lt;p&gt;Having both sides of the puzzle, the metrics from the application servers along with those from our load generators, gives you a more holistic look of your application performance as a whole, and increases the value you get from load testing. We’d encourage you to take advantage of the 5 free node hours we provide in our trial to give this integrated load testing solution a spin. You can head on over to Flood to sign up for a free trial which will include 5 free node hours and you can drop us a note to get help integrating Flood with your APM solution.&lt;/p&gt;</description></item><item><title>Start with Why: How to Write Requirements for API Load Testing</title><link>https://nicolevanderhoeven.com/blog/20190610-start-with-why/</link><pubDate>Wed, 19 Jun 2019 21:49:17 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20190610-start-with-why/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/start-with-why-how-to-write-requirements-for-api-load-testing"&gt;
&lt;p&gt;&lt;em&gt;Originally published &lt;a href="https://www.flood.io/blog/start-with-why-how-to-write-requirements-for-api-load-testing"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Every good test begins with requirements.&lt;/p&gt;
&lt;p&gt;You may think, “But I’m a tester! I’m not a business analyst!”, and I hear you. But as testers, especially on smaller teams or shorter projects, it’s still part of our job to make sure we know what our clients want. Otherwise, how do we know whether we’ve succeeded or failed?&lt;/p&gt;
&lt;p&gt;At Flood, I often speak to project teams who ask for help interpreting reports. Most of those times, the problem is not that they don’t understand the metrics or what they measure. The problem is that they didn’t set pass or fail criteria in the first place, and so they don&amp;rsquo;t have anything to judge the results against. This is always a big warning sign.&lt;/p&gt;
&lt;h2 id="which-performance-testing-metrics-are-important-why-are-we-testing-anyway"&gt;Which performance testing metrics are important? Why are we testing, anyway?&lt;/h2&gt;
&lt;p&gt;Requirements inform every step of the load testing process. Why are we doing load testing? What exactly do we want to test? How will we know when a test has passed or failed? How will we know if application performance is good enough to go into production? What does “good enough” mean?&lt;/p&gt;
&lt;p&gt;&lt;a href="https://flood.io/blog/author/tim-koopmans/"&gt;Tim Koopmans&lt;/a&gt;, co-founder of Flood, coined the acronym SPEAR to describe the different aspects of a performance that should be considered in load testing. This is a great starting point when thinking about what we want our nonfunctional requirements to cover.&lt;/p&gt;
&lt;h3 id="scalability"&gt;Scalability&lt;/h3&gt;
&lt;p&gt;Scalability is the application’s ability to cope with increasing demands by increasing the amount of server resources. This could mean scaling &lt;em&gt;up&lt;/em&gt; (increasing the resources of the dedicated server) or scaling &lt;em&gt;out&lt;/em&gt; (adding more nodes to shoulder the load). What happens when more users than expected sign up in response to a promotion on your site?&lt;/p&gt;
&lt;h3 id="performance"&gt;Performance&lt;/h3&gt;
&lt;p&gt;The most common performance metric is page response time, but there are other considerations to be made here, such as throughput (requests per minute) and the number of concurrent sessions that need to be supported. Things like the total size of the resources on the page, whether or not a CDN is being used, and what to cache are also worth discussing.&lt;/p&gt;
&lt;h3 id="elasticity"&gt;Elasticity&lt;/h3&gt;
&lt;p&gt;Elasticity is a relatively newer aspect to performance testing brought about by advances in the cloud that allow application infrastructure to adapt to changes in load. Unlike scalability, elasticity emphasises scaling down as much as it does scaling up. Testing that virtual machines scale up when load increases is important, but testing that virtual machines also scale down when load decreases can also help save on unnecessary costs.&lt;/p&gt;
&lt;h3 id="availability"&gt;Availability&lt;/h3&gt;
&lt;p&gt;To test for high availability, ask yourself what would happen when (not if) your application’s server fails. Is there another server that the load balancer will seamlessly send traffic towards? Does the throughput fluctuate wildly? If users are connected to one server that fails, is your application smart enough to make new connections to another server? Or will it simply serve up an error page that users won’t know what to do with? Disaster recovery is best tested when there’s no disaster imminent.&lt;/p&gt;
&lt;h3 id="reliability"&gt;Reliability&lt;/h3&gt;
&lt;p&gt;Reliability encompasses a lot of scenarios, but they all have to do with whether or not your application returns expected responses. Does your error rate increase when you increase the duration of your load test? Are you adding verification steps to your load testing scripts to check whether or not the HTTP 200 response that the application returned is not actually an error page?&lt;/p&gt;
&lt;h2 id="what-should-my-applications-response-time-be"&gt;What should my application’s response time be?&lt;/h2&gt;
&lt;p&gt;Our clients frequently ask us what the industry standard is for response times, wanting to make sure their applications measure up. The answer, however, is more complicated than a single number.&lt;/p&gt;
&lt;p&gt;Industry standards for response time are only useful when applications are very similar. Constantly changing technologies used in web development as well as innate differences in business processes, however, make it very difficult to extrapolate a single number that will apply to all, or even most, applications in a certain industry.&lt;/p&gt;
&lt;p&gt;The home page of one e-commerce app, for instance, might be several seconds slower than that of their main competitor. However, that doesn’t take into account the fact that their app loads a video showcasing new products. Does that mean that the development team should remove the video in order to fall in line with their competition?&lt;/p&gt;
&lt;p&gt;Well, maybe. But not necessarily. It’s a business decision that needs to be made after perhaps using focus groups to determine the impact of the video, forecasting changes in conversion rate due to it, and comparing its projected value to the effects of being slower than the competition. A/B experiments could be used to test these assumptions and gather quantifiable data to support the team decision.&lt;/p&gt;
&lt;p&gt;These factors are often not considered in the search for one number to rule them all, which is why a fixation on that number can be detrimental. Instead, I encourage project teams to brainstorm and come up with their own numbers for all metrics that would be more appropriate for their application. Gathering comparative metrics from a competitor may be part of this process.&lt;/p&gt;
&lt;h2 id="what-is-a-good-api-load-testing-requirement"&gt;What is a good API load testing requirement?&lt;/h2&gt;
&lt;p&gt;A good requirement, just like any good goal, is SMART:&lt;/p&gt;
&lt;h3 id="specific"&gt;Specific&lt;/h3&gt;
&lt;p&gt;Vagueness in a requirement leads to vagueness in results interpretation.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Instead of&lt;/em&gt;: “The performance of the web application…”&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Try&lt;/em&gt;: “The average response time of the Login transaction&amp;hellip;”&lt;/p&gt;
&lt;h3 id="measurable"&gt;Measurable&lt;/h3&gt;
&lt;p&gt;Make sure there is a quantifiable way to know whether requirements have been achieved.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Instead of&lt;/em&gt;: “Decrease user frustration.”&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Try&lt;/em&gt;: “The error rate must be below 3% at peak load.”&lt;/p&gt;
&lt;h3 id="agreed-upon"&gt;Agreed Upon&lt;/h3&gt;
&lt;p&gt;Have the appropriate stakeholders been involved?&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Instead of&lt;/em&gt;: “The system must be able to generate emails as soon as users register.”&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Try&lt;/em&gt;: “The system must be able to generate a maximum of 100 emails an hour, after which emails are queued.”&lt;/p&gt;
&lt;p&gt;A good example for this is a project I was involved in that aimed to increase the speed with which emails were generated. Unfortunately, the particular email being sent included a big change that many customers were expected to contact the support team about. The problem was that nobody had thought to include Support in the conversation. Once they heard about the expected end result, the support team quickly raised their concern that they would not be able to handle the expected volume of emails unless the emails were staggered. This could have been avoided if they had been brought into discussions from the very beginning, in the requirements gathering phase.&lt;/p&gt;
&lt;h3 id="realistic"&gt;Realistic&lt;/h3&gt;
&lt;p&gt;Can we meet this requirement given the resources available?&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Instead of&lt;/em&gt;: “All requests must be returned within 5 ms.”&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Try&lt;/em&gt;: “90% of the Catalog page requests should be returned within 3 seconds.”&lt;/p&gt;
&lt;h3 id="timely"&gt;Timely&lt;/h3&gt;
&lt;p&gt;Especially for nonfunctional testing, consider adding a timeframe to requirements.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Instead of&lt;/em&gt;: “The digital code is sent by SMS upon successful client log in at peak load.”&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Try&lt;/em&gt;: “The digital code will be sent by SMS no later than 5 minutes after successful client log in at peak load.”&lt;/p&gt;
&lt;h2 id="go-forth-and-write-great-load-testing-requirements"&gt;Go forth and write great load testing requirements&lt;/h2&gt;
&lt;p&gt;Requirements represent a great opportunity to think things through and make sure everyone on the project team is on the same page about the goals for your load testing. Too often projects skip this phase, only to realise much later that the tests that were executed didn’t address a key stakeholder’s concerns.&lt;/p&gt;
&lt;p&gt;In load testing, as in many things: when in doubt about what to do, start with why.&lt;/p&gt;</description></item><item><title>TestCon Moscow 2019: Dismantling Cognitive Biases</title><link>https://nicolevanderhoeven.com/blog/20190403-testcon-moscow-2019/</link><pubDate>Wed, 03 Apr 2019 23:14:31 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20190403-testcon-moscow-2019/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/dismantling-cognitive-biases-in-performance-testing"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/dismantling-cognitive-biases-in-performance-testing"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Developers and testers alike prefer to think of themselves as entirely rational beings, because both software development and software testing do require systematic rigor and logical reasoning. However, the reality is that the human element still comes into play when building and testing software.&lt;/p&gt;
&lt;p&gt;In &lt;a href="https://testconf.ru/2019/en/nicole-van-der-hoeven/index.html"&gt;this year’s TestCon conference&lt;/a&gt;, held in Moscow, Russia, I delivered a talk on how cognitive biases affect web performance outcomes.&lt;/p&gt;
&lt;p&gt;In the talk, I discuss:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;two types of thinking: fast thinking and slow thinking (from Daniel Kahneman&amp;rsquo;s book &lt;a href="https://www.amazon.com/Thinking-Fast-Slow-Daniel-Kahneman/dp/0374533555"&gt;Thinking, Fast and Slow&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;how to influence the sentence duration that judges give perpetrators&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;what cognitive biases are and how they can affect performance testing results&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;a real-life production incident that occurred on Flood and how our team&amp;rsquo;s cognitive biases got in the way of its resolution&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;what to do to avoid cognitive biases when testing software&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&amp;rsquo;s the video of my full talk:&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/vjUAYeguJWk?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Download the presentation &lt;a href="https://nicolevanderhoeven.com/assets/20190403-01.pdf"&gt;in PDF format&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Performance Testing Interview Questions, Part 3: LoadRunner</title><link>https://nicolevanderhoeven.com/blog/20181220-performance-testing-interview-questions-part-3/</link><pubDate>Thu, 20 Dec 2018 22:54:24 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20181220-performance-testing-interview-questions-part-3/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/performance-testing-interview-questions-part-3-loadrunner-interview-questions"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/performance-testing-interview-questions-part-3-loadrunner-interview-questions"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Like it or not, &lt;a href="https://www.microfocus.com/en-us/products/loadrunner-load-testing/overview"&gt;LoadRunner&lt;/a&gt; is one of the most popular commercial load test tools, and with good reason. Its protocol support is extensive, and many a load tester has cut his/her teeth on LoadRunner. In this last part of our interview series, we’ll go over some questions you may have to answer when interviewing for a role using Mercury HP MicroFocus LoadRunner.&lt;/p&gt;
&lt;h3 id="what-sort-of-transactions-would-you-put-into-vuser_init-and-vuser_end"&gt;What sort of transactions would you put into vuser_init and vuser_end?&lt;/h3&gt;
&lt;p&gt;Both are used for transactions that would only need to run once, at the beginning and at the end of a script. They’re akin to &lt;a href="http://jmeter.apache.org/"&gt;JMeter&lt;/a&gt;’s &lt;code&gt;setUp&lt;/code&gt; and &lt;code&gt;tearDown&lt;/code&gt; thread groups. Some things you might put in vuser_init are user logins or navigation to get to the start of the business process you really want to test, and logouts and any data cleanup to reset the application for the next test are common things to put in vuser_end. Note that if you want each virtual user to iterate through a list of user accounts during the test, you &lt;em&gt;won’t&lt;/em&gt; want to put logins and logouts in vuser_init and vuser_end.&lt;/p&gt;
&lt;h3 id="when-would-you-run-a-script-in-vugen-and-when-would-you-run-it-in-controller"&gt;When would you run a script in VuGen and when would you run it in Controller?&lt;/h3&gt;
&lt;p&gt;VuGen is short for Virtual User Generator, and it’s where the actual scripting is done. Running in VuGen is good for writing or debugging a script, where you can quickly see where a script fails, what the response is, and what you need to change. You can also step through the code line by line (F10) to more accurately see, for example, variable values changing throughout your script. It’s really only for shaking out scripts with a single user. Running in VuGen also only runs from your local machine. Once you’re ready to run a load test, you’d switch to Controller.&lt;/p&gt;
&lt;p&gt;The Controller is like the command center in LoadRunner: from the Controller, you can actually ramp up the number of users and choose from different scenario configuration settings in order to tailor your workload model to the scenario you’re trying to test. Controller also runs the scripts headlessly; it won’t open up a separate instance of VuGen for every user, so it’s a lot more resource intensive. Controller will also allow you to configure remote load generators and run scripts on them.&lt;/p&gt;
&lt;h3 id="how-would-you-set-up-loadrunner-to-run-certain-transactions-a-certain-percentage-of-the-time-for-example-for-every-100-users-that-browses-to-a-site-you-want-25-of-them-visiting-each-of-the-about-catalog-contact-and-reviews-pages"&gt;How would you set up LoadRunner to run certain transactions a certain percentage of the time? For example, for every 100 users that browses to a site, you want 25 of them visiting each of the About, Catalog, Contact, and Reviews pages.&lt;/h3&gt;
&lt;p&gt;You can write the code to visit each page in separate Actions. Then, in Runtime Settings, you can modify the run logic, create an Action Block that has all four actions, and assign a percentage to them (25%).&lt;/p&gt;
&lt;p&gt;Of course, you can also hard code this in C within the actions, if you’d prefer, but moving these values to Runtime Settings makes it easier to maintain and reuse by other testers.&lt;/p&gt;
&lt;h3 id="how-is-loadrunner-pacing-different-from-how-its-implemented-in-other-tools"&gt;How is LoadRunner pacing different from how it’s implemented in other tools?&lt;/h3&gt;
&lt;p&gt;Most test tools allow you to set a fixed or variable pacing that adds onto however long one iteration takes to complete.&lt;/p&gt;
&lt;p&gt;LoadRunner has a pacing feature that allows you to set a specific time and then adds a variable amount of time to your test &lt;em&gt;depending on response times for the included transactions&lt;/em&gt;. So if you set pacing to 5 minutes and one iteration takes 3 minutes to finish, LoadRunner will automatically wait 2 minutes before starting the next one. If it takes 6 minutes, it will not add any more wait time and proceed instead to the next iteration. This comes in handy because you can more accurately predict how many transactions the script will do in a certain amount of time.&lt;/p&gt;
&lt;h3 id="why-would-the-traffic-from-a-load-test-on-loadrunner-not-be-seen-in-google-analytics"&gt;Why would the traffic from a load test on LoadRunner not be seen in Google Analytics?&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://marketingplatform.google.com/about/analytics/"&gt;Google Analytics&lt;/a&gt; runs when the browser of a user downloads and executes a javascript file that then sends information to Google to increment the site statistics for the current visit. However, most traditional load test tools work on the protocol level; that is, they send requests directly to the application server and download resources from a page to simulate users. This means that while they download the Google Analytics script, they don’t execute it, which means the scripted visits aren’t counted.&lt;/p&gt;
&lt;p&gt;In order to use Google Analytics to view statistics from a load test, you’ll need to use a browser-level load test tool. LoadRunner actually has this covered with their &lt;a href="https://marketplace.microfocus.com/appdelivery/content/truclient"&gt;TruClient&lt;/a&gt; protocol, which interacts with elements on the page like a user would. It will also work for testing single-page applications that use &lt;a href="https://en.wikipedia.org/wiki/Ajax_(programming)"&gt;AJAX&lt;/a&gt; to change the data displayed on a page instead of reloading new pages.&lt;/p&gt;
&lt;p&gt;Of course, for open source alternatives to TruClient, we at Flood prefer &lt;a href="http://element.flood.io/"&gt;Element&lt;/a&gt; or &lt;a href="https://flood.io/blog/load-testing-guide-selenium/"&gt;Selenium&lt;/a&gt; load testing, both of that will actually open the site in a browser and executed scripts like a real user.&lt;/p&gt;</description></item><item><title>Performance Testing Interview Questions, Part 2: JMeter</title><link>https://nicolevanderhoeven.com/blog/20181220-performance-testing-interview-questions-part-2/</link><pubDate>Thu, 20 Dec 2018 14:47:18 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20181220-performance-testing-interview-questions-part-2/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/performance-testing-interview-questions-part-2-jmeter-interview-questions"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/performance-testing-interview-questions-part-2-jmeter-interview-questions"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In this part, we’ll go over some questions that are commonly asked in technical interviews about the use of the most popular open-source load testing tool, &lt;a href="http://jmeter.apache.org/"&gt;Apache JMeter&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="using-jmeter-you-record-a-key-business-process-upon-playing-it-back-however-you-notice-an-error-on-the-first-page-what-could-have-gone-wrong-and-how-would-you-fix-this"&gt;Using JMeter, you record a key business process. Upon playing it back, however, you notice an error on the first page. What could have gone wrong and how would you fix this?&lt;/h3&gt;
&lt;p&gt;While recorders have gone a long way towards making scripting easier, modern security measures like the implementation of viewstates have also made scripting more complicated to record. Some more complicated applications will pass dynamic values in responses that it expects to see in the succeeding request, otherwise the request is blocked. This is great for security, but it also means that you will need to manually extract these values in your script.&lt;/p&gt;
&lt;p&gt;In JMeter, you would do this by adding a response extractor to your sample that will extract the dynamic string according to rules you set, and then save the string to a parameter. This parameter must then be used in the next request that you send.&lt;/p&gt;
&lt;p&gt;While running your test plan, you get the error: &lt;code&gt;java.lang.OutOfMemoryError: Java heap space&lt;/code&gt;. How do you fix it?
The easy fix is to edit &lt;code&gt;jmeter.bat&lt;/code&gt; and increase the heap memory (search for &lt;code&gt;HEAP&lt;/code&gt;) and increase heap space allocated like this:
&lt;code&gt;HEAP=&amp;quot;-Xms512m -Xmx2048m&amp;quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The part in bold increases the heap space to 2 GB.&lt;/p&gt;
&lt;p&gt;However, it’s also worthwhile looking at your test plan and removing any obvious memory hogs. One of the things we see a lot is enabled listeners that aren’t even being used. Listeners are great while debugging, but should be disabled when running a load test. Writing too many lines to the log is another culprit here that should also be commented out when running important tests. And of course, you should always run JMeter in non-GUI mode during load tests!&lt;/p&gt;
&lt;h3 id="after-running-a-load-test-the-results-show-that-300-transactions-were-executed-with-a-passed-status-and-returning-responses-of-http-200-however-the-dba-tells-you-that-there-were-no-records-written-to-the-database-as-a-result-of-the-transactions-how-would-you-troubleshoot-this"&gt;After running a load test, the results show that 300 transactions were executed with a PASSED status and returning responses of HTTP 200. However, the DBA tells you that there were no records written to the database as a result of the transactions. How would you troubleshoot this?&lt;/h3&gt;
&lt;p&gt;I see this happening with clients all the time, so I think this makes a great technical interview question. This is also why I said earlier that you shouldn’t count on a test tool to tell you a test has passed. It’s possible for a transaction to have the status PASSED and return an HTTP 200 but still be hiding an error.&lt;/p&gt;
&lt;p&gt;This is mainly due to poor scripting that does not include validations that check whether the script has gotten to the right page. For example, you could use a Response Assertion as a child of your home page sample with the words “Welcome, Nicole” to determine whether the user Nicole has logged in successfully.&lt;/p&gt;
&lt;p&gt;This is a critical step, because without it, it’s possible for a server to return a nice error page, or an incorrect one, such as the home page, with an HTTP 200.&lt;/p&gt;
&lt;h3 id="how-do-you-use-a-data-file-to-read-user-account-details-from-a-csv-in-jmeter"&gt;How do you use a data file to read user account details from a CSV in JMeter?&lt;/h3&gt;
&lt;p&gt;JMeter has a &lt;a href="https://jmeter.apache.org/usermanual/component_reference.html#CSV_Data_Set_Config"&gt;CSV Data Set Config Element&lt;/a&gt; built specifically for this purpose. You can simply add one to your test plan, browse to the CSV file that you’d like to use, and select the options for how to share that data among the threads in your JMeter script.&lt;/p&gt;
&lt;h3 id="how-would-you-go-about-testing-a-website-that-uses-http2-on-jmeter"&gt;How would you go about testing a website that uses HTTP/2 on JMeter?&lt;/h3&gt;
&lt;p&gt;There is a JMeter plugin called HTTP/2 Sampler that accomplishes just this. My colleague Jason just wrote &lt;a href="https://flood.io/blog/jmeter-tutorial-http2-test/"&gt;a blog post&lt;/a&gt; on this very topic, but basically the plugin adds new HTTP/2 versions to the standard HTTP request and request defaults samplers as well as the Simple Data Writer and View Results Tree listener. These elements will need to be used in order to test an application using HTTP/2.&lt;/p&gt;
&lt;h3 id="what-can-you-do-to-synchronise-the-execution-of-multiple-jmeter-instances-on-different-load-generators"&gt;What can you do to synchronise the execution of multiple JMeter instances on different load generators?&lt;/h3&gt;
&lt;p&gt;Apache JMeter has released &lt;a href="https://jmeter.apache.org/usermanual/jmeter_distributed_testing_step_by_step.pdf"&gt;this handy PDF file&lt;/a&gt; to describe the steps necessary to run JMeter in distributed mode. This involves installing Java and JMeter on all machines and setting them up in a master and slave configuration so that one machine controls the rest. On the master, you’ll need to add remote hosts to the jmeter.properties file. When everything is set up, you should be able to open up JMeter on the master and do a a remote start of your current test plan on any or all slaves that you choose.&lt;/p&gt;
&lt;p&gt;The problem with this setup is the clunkiness of working with different machines and essentially having to set them up the same way. After the test, there’s the daunting task of logging back onto each machine, gathering the data, and transferring them back into a central repository. Then you’re faced with consolidating the data from each injector in order to see a picture of the whole test. You can see that this set up quickly goes from time-consuming to a nightmare, especially when potentially thousands of different machines are involved.&lt;/p&gt;
&lt;p&gt;If only there were &lt;a href="https://flood.io/"&gt;an easier way&lt;/a&gt;&amp;hellip;&lt;/p&gt;</description></item><item><title>Performance Testing Interview Questions, Part 1: General</title><link>https://nicolevanderhoeven.com/blog/20181220-performance-testing-interview-questions-part-1-general/</link><pubDate>Thu, 20 Dec 2018 12:41:40 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20181220-performance-testing-interview-questions-part-1-general/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/performance-testing-interview-questions-part-1-general"&gt;
&lt;p&gt;&lt;em&gt;Originally published &lt;a href="https://www.flood.io/blog/performance-testing-interview-questions-part-1-general"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="preparation-is-key-for-the-perfect-interview"&gt;Preparation is Key for the Perfect Interview&lt;/h2&gt;
&lt;p&gt;Performance testing interviews can be a nerve wracking experience. We all understand it’s necessary, but we dread it anyway. Each company has its own style of interview, so you may need to prepare differently for each opportunity. This interview series will cover some general sample questions and scenarios as well as my answers to them to help you nail that performance testing interview!&lt;/p&gt;
&lt;p&gt;I’ve broken down the potential questions into the most popular categories, so you can prepare easily for your all-important interview:&lt;/p&gt;
&lt;h3 id="what-is-performance-testing--what-is-load-testing--what-is-stress-testing"&gt;What is Performance Testing? What is Load testing? What is Stress Testing?&lt;/h3&gt;
&lt;p&gt;Performance testing is the process of systematically determining, quantifying and improving the speed, reliability, and efficiency of an application with the aim of improving user experience. This includes both front-end and back-end performance testing.&lt;/p&gt;
&lt;p&gt;Load testing is a specific type of back-end performance testing where automated scripts are written to send requests in an attempt to simulate the peak user load expected on the application servers.&lt;/p&gt;
&lt;p&gt;Stress testing takes that one step further and applies load in excess of what is expected in order to determine the maximum capacity of the system under test.&lt;/p&gt;
&lt;h3 id="what-is-the-difference-between-front-end-and-back-end-performance-testing-which-one-is-more-important"&gt;What is the difference between front-end and back-end performance testing? Which one is more important?&lt;/h3&gt;
&lt;p&gt;Both front-end and back-end performance testing measure how fast an application responds, but they measure different components of that overall user response time.&lt;/p&gt;
&lt;p&gt;Front-end performance is concerned with how quickly text, images, and other page elements are displayed on a user’s browser page. Back-end performance is concerned with how quickly these elements are processed by the site’s servers and sent to the user’s machine upon request. Front-end performance is the part of the iceberg above the water line, and back-end performance is everything underneath that you can’t see.&lt;/p&gt;
&lt;p&gt;Both are important because they can both determine whether a user continues to use your application. Front-end performance tends to be easier to test and can provide some quick wins due to the large amount of optimisation tweaks that can be done without writing code. Back-end performance tends to be more difficult to test because it often uncovers problems with the underlying infrastructure and hardware that are of a more technical nature.&lt;/p&gt;
&lt;h3 id="why-does-performance-testing-matter"&gt;Why does performance testing matter?&lt;/h3&gt;
&lt;p&gt;Performance testing matters because application performance has a significant impact on user experience. A site that is unreachable or slow to load due to an inability to cope with unexpected load will cause users to browse to competitor’s sites and tarnish the brand’s reputation.&lt;/p&gt;
&lt;h3 id="how-do-you-know-when-a-load-test-has-passed"&gt;How do you know when a load test has passed?&lt;/h3&gt;
&lt;p&gt;Ideally, you would have discussed your nonfunctional requirements with key stakeholders before load testing begins. This means that you set your own pass criteria before you even run the tests. You would ideally have a list of specific transactions (selected based on criticality or complexity according to the business) whose response time needs to fall under a threshold you’ve predetermined. “Fast” is not specific enough&amp;ndash; a number is better. Depending on what kind of tests you’re running (soak, stress, volume, etc) you may have other nonfunctional requirements about duration, resource utilisation on the server side, or specific outcomes to scenarios you’d like to test.&lt;/p&gt;
&lt;p&gt;As a general rule, don’t rely on a load test tool to determine whether your load test has passed. Rely on it to report your results, but always compare the results to the requirements to determine successes or failures.&lt;/p&gt;
&lt;h3 id="what-would-you-advise-to-clients-who-say-they-cant-afford-to-performance-test-because-they-dont-have-the-resources-to-maintain-several-load-generators-on-site"&gt;What would you advise to clients who say they can’t afford to performance test because they don’t have the resources to maintain several load generators on site?&lt;/h3&gt;
&lt;p&gt;This is the main reason that performance testing has for so long been considered a luxury that only big companies can afford. Luckily technology moves on, and in 2018 we’re at a point where everyone can load test. The big innovation here has been the cloud and the ability to spin up thousands of virtual machines with a few mouse clicks. Services like Amazon AWS, Microsoft Azure and Google Cloud make it so that every budding entrepreneur can “borrow” the computing hardware necessary to do cloud load testing with thousands of users and then give them back after the test, without the hassle and cost of maintaining them. I would advise the clients to look for a a cloud load testing solution that utilizes virtual machines on the cloud to run their tests affordably.&lt;/p&gt;
&lt;h3 id="you-run-a-load-test-against-a-server-with-4gb-ram-and-the-results-show-an-average-response-time-of-30-seconds-for-a-particular-request-the-production-server-has-been-allocated-8gb-ram-what-would-you-expect-the-average-response-time-of-the-same-request-to-be-in-production-given-the-same-load"&gt;You run a load test against a server with 4GB RAM and the results show an average response time of 30 seconds for a particular request. The production server has been allocated 8GB RAM. What would you expect the average response time of the same request to be in production given the same load?&lt;/h3&gt;
&lt;p&gt;Trick question! While you may be tempted to answer that the response time would be halved to 15 seconds, reality is rarely that convenient. Response times are a factor of so much more than memory. Things like CPU utilisation, network throughput, latency, load balancing configuration, and just application logic are always going to influence load tests. You can’t assume a linear progression in response time just because you’ve upgraded one part of the hardware. This is why it’s important to load test against an environment that is as production-like as possible.&lt;/p&gt;
&lt;h3 id="what-is-a-percentile-and-why-would-you-look-at-percentile-response-times-when-you-already-have-average-response-times"&gt;What is a percentile and why would you look at percentile response times when you already have average response times?&lt;/h3&gt;
&lt;p&gt;A percentile is a statistical measure that describes a value that a certain percentage of the sample either meets or falls under. For example, a 90th percentile response time of 5 seconds means that 90% of the responses took 5 seconds or less to be returned. It can be an important measure because they soften the impact that outliers have on more inclusive measures such as averages. A transaction with an average response time of 2.5 seconds may seem perfectly acceptable to the business, but when the 90th percentile response time is 20 seconds, this is a good reason to investigate further.&lt;/p&gt;
&lt;h3 id="what-are-some-trends-in-performance-testing-that-you-think-will-continue-in-2019-and-beyond"&gt;What are some trends in performance testing that you think will continue in 2019 and beyond?&lt;/h3&gt;
&lt;p&gt;Cloud is an easy answer, as the cloud brings some compelling benefits in terms of reduced cost and just ease of use. However, I already touched on that in a previous question, so I’ll talk about another trend: open source.&lt;/p&gt;
&lt;p&gt;There’s a reason that open source is still around: it works. The main advantage of open source tools is not that they are free, although that is a big part of the appeal. The real advantage is that open source tools are community-based and community-led, which means features get built for it faster than sometimes commercial tools can keep up with, and they’re built by users of the tool themselves. Open source tools like &lt;a href="http://jmeter.apache.org/"&gt;JMeter&lt;/a&gt;, &lt;a href="http://gatling.io/"&gt;Gatling&lt;/a&gt; and &lt;a href="http://seleniumhq.org/"&gt;Selenium&lt;/a&gt; have revolutionized the industry due to their impressive feature sets, built by a growing community that has developed plugins for everything you can think of. More and more, even big companies with big budgets choose to go open source simply because of the wealth of knowledge of these tools that are already available for free.&lt;/p&gt;
&lt;p&gt;We’re huge proponents of open source tools at Flood, which is why we recently open-sourced our very own tool, &lt;a href="https://element.flood.io/"&gt;Element&lt;/a&gt;. We will continue to support all things open source, because we firmly believe that the future is open source.&lt;/p&gt;</description></item><item><title>Should I Upgrade to JMeter 4.0? 5 Reasons to Upgrade</title><link>https://nicolevanderhoeven.com/blog/20180223-should-i-upgrade-to-jmeter-4/</link><pubDate>Fri, 23 Feb 2018 23:43:25 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20180223-should-i-upgrade-to-jmeter-4/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/should-i-upgrade-to-jmeter-4-0-5-reasons-to-upgrade"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/should-i-upgrade-to-jmeter-4-0-5-reasons-to-upgrade"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Apache has just launched &lt;a href="http://jmeter.apache.org/download_jmeter.cgi"&gt;JMeter 4.0&lt;/a&gt;, a big step up from their previous release, 3.3, which was only released in September last year. Apache seems to be stepping up the frequency of it’s releases, and we’re not complaining. JMeter is an amazing open source load testing tool and the most popular one used at &lt;a href="http://flood.io/"&gt;Tricentis Flood&lt;/a&gt; by far.&lt;/p&gt;
&lt;p&gt;The big question is: Should you upgrade? Are the new features worth the leap? Will the new black UI make you a better load tester? While this choice should be made on a case-by-case basis and we certainly can’t pretend to give one-size-fits-all advice, here are some good arguments to do it:&lt;/p&gt;
&lt;h3 id="1-java-9-support"&gt;#1: Java 9 support&lt;/h3&gt;
&lt;p&gt;JDK 9 was released back in September 2017, and if you were one of the people who upgraded to it when prompted, you would have noticed to your frustration that JMeter 3.3 did not play well with it, yielding the error:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Error: Java version -- 9.0.1 -- is too low to run JMeter. Needs a Java version greater than or equal to 1.8.0 errorlevel&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Good news! This is now fixed. JMeter 4.0 runs smoothly on JDK 9. We&amp;rsquo;ll continue running on JDK 8 at Flood for consistency amongst all our open source load testing tools.&lt;/p&gt;
&lt;h3 id="2-new-boundary-extractor"&gt;#2: New Boundary Extractor&lt;/h3&gt;
&lt;p&gt;Previously, my preferred way to extract dynamic values in JMeter was to use a regular expression extractor, but there’s no doubt that it can sometimes be tricky to get just the right text out of a response. Enter the &lt;a href="http://jmeter.apache.org/usermanual/component_reference.html#Boundary_Extractor"&gt;Boundary Extractor&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The boundary extractor allows you to simply set the text immediately before and after the text you want to extract. This saves you wondering whether you should have used a + or a * in your regular expression, and is also easier to validate.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20180223-01.png" alt="Boundary Extractor in JMeter" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h3 id="3-new-json-assertion-element"&gt;#3: New JSON assertion element&lt;/h3&gt;
&lt;p&gt;While XPath assertion was great, there was previously no counterpart for JSON. The &lt;a href="http://jmeter.apache.org/usermanual/component_reference.html#JSON_Assertion"&gt;JSON Assertion&lt;/a&gt; element fills that void nicely, using &lt;a href="https://github.com/json-path/JsonPath"&gt;JsonPath&lt;/a&gt; to quickly assert the existence (or non-existence, with the Invert assertion option ticked) of a particular element.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20180223-02.png" alt="JSON Assertion element in JMeter" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h3 id="4-new-throughput-timer"&gt;#4: New throughput timer&lt;/h3&gt;
&lt;p&gt;We have a new throughput timer to play with, and it’s called &lt;a href="http://home.apache.org/~milamber/jmeter-4.0RC4/docs/usermanual/component_reference.html#Precise_Throughput_Timer"&gt;Precise Throughput Timer&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20180223-03.png" alt="Precise Throughput Timer in JMeter" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Whereas the Constant Throughput Timer also had the disadvantage of constant pacing of requests, the Precise Throughput Timer is based on the &lt;a href="http://home.apache.org/~milamber/jmeter-4.0RC4/docs/usermanual/component_reference.html#Poisson_Random_Timer"&gt;Poisson Random Timer&lt;/a&gt; and randomly generates the delay between each request. The implementation seems to be well thought out, with the component reference section listing a lot of scenarios they’ve tested for that the previous Constant Throughput Timer might have struggled with. Throughput timers are one of my favourite JMeter features, and still rather unique in the industry.&lt;/p&gt;
&lt;h3 id="5-test-plan-autosave"&gt;#5: Test Plan Autosave&lt;/h3&gt;
&lt;p&gt;This one’s more of a usability tweak, but it’s a good one. JMeter now automatically saves your script when you run a test, saving you from those all-too-familiar “Wait… did I CTRL+S before I hit CTRL+R?” moments.&lt;/p&gt;
&lt;p&gt;Click &lt;a href="http://home.apache.org/~milamber/jmeter-4.0RC4/docs/changes.html"&gt;here&lt;/a&gt; to see the full release notes for version.&lt;/p&gt;
&lt;h3 id="bonus-reason-tricentis-flood-support"&gt;BONUS reason: Tricentis Flood support&lt;/h3&gt;
&lt;p&gt;You can now upload JMeter 4.0 scripts to flood.io and be up and running with your first test hosted on one of our grid nodes around the world. Our customer support team is always happy to help you make the switch to 4.0.&lt;/p&gt;</description></item></channel></rss>