[{"data":1,"prerenderedAt":844},["ShallowReactive",2],{"nav_featured_podcast":3,"nav_featured_press_release":21,"navigation_content":30,"engineering_blog_post:conf42-golang-2022-load-testing-with-f1":378},{"uid":4,"title":5,"episodeLabel":6,"dateLabel":7,"episodeArt":8,"href":20},"from-payment-rails-to-connectivity","From Payment Rails to Connectivity, with The Clearing House's David Watson","EPISODE 5","August 18, 2026",{"dimensions":9,"alt":12,"copyright":13,"url":14,"id":15,"edit":16},{"width":10,"height":11},1064,652,"Payments Cannot Fail — Episode 05 with David Watson",null,"\u002F_prismic-media\u002Fd80df2e47c3ecb6f-cFcyPAgzKCMQEaND_Episode-05-David.jpg","cFcyPAgzKCMQEaND",{"x":17,"y":17,"zoom":18,"background":19},0,1,"transparent","\u002Fresources\u002Fpodcasts\u002Ffrom-payment-rails-to-connectivity",{"uid":22,"title":23,"tag":24,"dateLabel":25,"imageUrl":26,"imageAlt":27,"href":28,"imageFit":29},"form3-expands-strategic-partnership-with-sumup","Form3 expands strategic partnership with SumUp to bring real-time SEPA payments to millions of European small businesses","EU","February 25, 2026","\u002F_prismic-media\u002F3e91177f91478610-QA44Gzev0_tdg3ZI_SumUp.jpg","sumup","\u002Fresources\u002Fpress-releases\u002Fform3-expands-strategic-partnership-with-sumup","cover",{"header":31,"platform":59,"solutions":91,"developers":133,"company":155,"resources":184,"partnerships":208,"footer":220,"mobile":325},{"ctaLabel":32,"ctaHref":33,"topNav":34},"TALK TO OUR TEAM","\u002Fcontact",[35,39,43,47,51,55],{"label":36,"href":37,"key":38},"Platform","\u002Fplatform","platform",{"label":40,"href":41,"key":42},"Solutions","\u002Fsolutions","solutions",{"label":44,"href":45,"key":46},"Developers","\u002Fdevelopers","developers",{"label":48,"href":49,"key":50},"Company","\u002Fcompany","company",{"label":52,"href":53,"key":54},"Resources","\u002Fresources","resources",{"label":56,"href":57,"key":58},"Partnerships","\u002Fpartnerships","partnerships",{"sectionEyebrow":60,"primary":61,"productLinks":65,"enterprise":81,"trustFabric":86},"Explore the Platform",{"heading":62,"body":63,"ctaLabel":64,"ctaHref":37},"Our Payments Platform","A resilient, cloud-native platform powering real-time account-to-account payments at global scale.","See How It Works",[66,69,72,75,78],{"label":67,"href":68},"Payments Processing & Gateway","\u002Fpayments-processing-gateway",{"label":70,"href":71},"Orchestration & Intelligent Routing","\u002Forchestration-intelligent-routing",{"label":73,"href":74},"Payments Simulator","\u002Fpayments-simulator",{"label":76,"href":77},"Sponsor Bank Enablement","\u002Fsponsor-bank-enablement",{"label":79,"href":80},"Informed UI","\u002Finformed-ui",{"heading":82,"body":83,"ctaLabel":84,"ctaHref":85},"Form3 Enterprise","Deploy and manage proven cloud-native payments technology in the environment that works for your institution.","Deploy Enterprise","\u002Fplatform\u002Fenterprise",{"heading":87,"body":88,"ctaLabel":89,"ctaHref":90},"Form3 Trust Fabric","Manage TLS certificates, cryptographic vulnerabilities and quantum readiness at scale, with continuous visibility.","Deploy Trust Fabric","\u002Fplatform\u002Ftrust-fabric",{"regionsIntro":92,"regions":98,"industries":118},{"eyebrow":93,"heading":94,"headingLine2":95,"body":96,"ctaLabel":64,"ctaHref":97},"Regions","Global Reach.","Regional Expertise.","A proven payments platform serving organizations worldwide, with specialized experience across North America, United Kingdom, and Europe.","\u002Fglobal",[99,108,113],{"label":100,"description":101,"ctaLabel":102,"href":103,"extraLinks":104},"North America","Real-time infrastructure, through a resilient, multi-cloud platform built for scale and regulatory confidence.","US HOME","\u002Fsolutions\u002Funited-states",[105],{"label":106,"href":107},"CANADA HOME","\u002Fsolutions\u002Fcanada",{"label":109,"description":110,"ctaLabel":111,"href":112},"United Kingdom","Powering account-to-account payments at the heart of the UK financial ecosystem, with proven resilience.","UK HOME","\u002Fsolutions\u002Funited-kingdom",{"label":114,"description":115,"ctaLabel":116,"href":117},"Europe","Enabling secure, real-time and SEPA payments across European markets through a unified, cloud-native platform.","EUROPE HOME","\u002Fsolutions\u002Feurope",{"eyebrow":119,"links":120},"Industries",[121,125,129],{"label":122,"href":123,"iconSrc":124},"Financial Services","\u002Fsolutions\u002Findustries\u002Ffinancial-services","\u002F_prismic-media\u002F29c09c45caa89db9-kbUHZmgTmuIMbo1t_FinancialServices_menu.svg",{"label":126,"href":127,"iconSrc":128},"Fintech","\u002Fsolutions\u002Findustries\u002Ffintech","\u002F_prismic-media\u002F6de3e7cb4dd8d874-SjwNe6Nh-bbuTi0P_Fintech_menu.svg",{"label":130,"href":131,"iconSrc":132},"Government","\u002Fsolutions\u002Findustries\u002Fgovernment","\u002F_prismic-media\u002Fe71bc3a74a1d2142-kaGgdituzKDnVTbm_Government_menu.svg",{"engineering":134,"api":142,"pressEyebrow":154},{"eyebrow":135,"links":136},"Engineering",[137,139],{"label":135,"href":138},"\u002Fengineering",{"label":140,"href":141},"Accreditations","\u002Faccreditations",{"eyebrow":143,"links":144},"API",[145,148,151],{"label":146,"href":147},"API Docs","https:\u002F\u002Fwww.api-docs.form3.tech\u002F",{"label":149,"href":150},"API Tutorials","https:\u002F\u002Fwww.api-docs.form3.tech\u002Fapi\u002Ftutorials\u002Fgetting-started\u002Fintroduction",{"label":152,"href":153},"API Status","https:\u002F\u002Fstatus.form3.tech\u002F","Latest Press Release",{"about":156,"people":171,"podcastEyebrow":183},{"eyebrow":157,"links":158},"About",[159,162,165,168],{"label":160,"href":161},"Our Story","\u002Fcompany\u002Four-story",{"label":163,"href":164},"Our Team","\u002Fcompany\u002Fteam",{"label":166,"href":167},"Our Success & Strategic Approach","\u002Fcompany\u002Four-success",{"label":169,"href":170},"Customer Stories","\u002Fcompany\u002Fcustomer-stories",{"eyebrow":172,"links":173},"People",[174,177,180],{"label":175,"href":176},"Careers","\u002Fcompany\u002Fcareers",{"label":178,"href":179},"Vacancies","\u002Fcompany\u002Fvacancies",{"label":181,"href":182},"Culture","\u002Fcompany\u002Fculture","Latest Podcast",{"intro":185,"links":189,"pressEyebrow":154,"podcastEyebrow":183},{"eyebrow":52,"heading":186,"body":187,"ctaLabel":188,"ctaHref":53},"Form3 Resources","Our Resources bring together thought leadership, engineering insights, payments expertise, webinars, podcasts, whitepapers, company news and stories from our teams—all in one place.","LEARN MORE",[190,193,196,199,202,205],{"label":191,"href":192},"Payments Cannot Fail Podcast","\u002Fresources\u002Fpodcasts",{"label":194,"href":195},"Press Releases","\u002Fresources\u002Fpress-releases",{"label":197,"href":198},"Payment Insights","\u002Fresources\u002Fpayment-insights",{"label":200,"href":201},"Culture Blog","\u002Fresources\u002Fculture-blog",{"label":203,"href":204},"Engineering Blog","\u002Fresources\u002Fengineering-blog",{"label":206,"href":207},"Events","\u002Fevents",{"intro":209,"links":213,"pressEyebrow":154},{"eyebrow":56,"heading":210,"body":211,"ctaLabel":212,"ctaHref":57},"Partner with Form3","Explore how Form3 works with banks, fintechs, cloud providers, technology platforms and system integrators to accelerate payment modernization, strengthen customer offerings and unlock new opportunities for growth.","Let's Partner Together",[214,217],{"label":215,"href":216},"Technical & Ecosystem Partners","\u002Fpartnerships\u002Ftechnical-ecosystem",{"label":218,"href":219},"Channel & Distribution Partners","\u002Fpartnerships\u002Fchannel-distribution",{"platform":221,"region":229,"development":240,"company":248,"resources":259,"partnerships":267,"stayConnected":272,"legalLinks":292,"certifications":314},{"title":36,"links":222},[223,224,225,226,227,228],{"label":62,"href":37},{"label":67,"href":68},{"label":70,"href":71},{"label":73,"href":74},{"label":76,"href":77},{"label":79,"href":80},{"title":230,"links":231},"Region",[232,234,236,237,238],{"label":233,"href":97},"Global",{"label":235,"href":103},"United States",{"label":109,"href":112},{"label":114,"href":117},{"label":239,"href":107},"Canada",{"title":241,"links":242},"Development",[243,244,245,246,247],{"label":135,"href":138},{"label":140,"href":141},{"label":146,"href":147},{"label":149,"href":150},{"label":152,"href":153},{"title":48,"links":249},[250,251,252,253,254,255,256],{"label":160,"href":161},{"label":163,"href":164},{"label":169,"href":170},{"label":175,"href":176},{"label":178,"href":179},{"label":181,"href":182},{"label":257,"href":258},"Net Zero","\u002Fcompany\u002Fnet-zero",{"title":52,"links":260},[261,262,263,264,265,266],{"label":186,"href":53},{"label":191,"href":192},{"label":194,"href":195},{"label":200,"href":201},{"label":203,"href":204},{"label":206,"href":207},{"title":56,"links":268},[269,270,271],{"label":210,"href":57},{"label":215,"href":216},{"label":218,"href":219},{"title":273,"body":274,"ctaLabel":32,"ctaHref":33,"social":275},"Stay Connected","Form3 is a global account-to-account financial fabric delivering a proven payments platform trusted by banks and fintechs to deliver resilient, real-time payment experiences for their customers at scale.",[276,280,284,288],{"label":277,"href":278,"icon":279},"LinkedIn","https:\u002F\u002Fwww.linkedin.com\u002Fcompany\u002Fform3-financial-cloud\u002F","linkedin",{"label":281,"href":282,"icon":283},"X","https:\u002F\u002Fwww.x.com\u002FForm3Cloud","x",{"label":285,"href":286,"icon":287},"YouTube","https:\u002F\u002Fwww.youtube.com\u002F@Form3Cloud","youtube",{"label":289,"href":290,"icon":291},"Instagram","https:\u002F\u002Fwww.instagram.com\u002Fform3.tech","instagram",[293,296,299,302,305,308,311],{"label":294,"href":295},"Terms & Conditions","\u002Flegal\u002Fterms-and-conditions",{"label":297,"href":298},"Privacy Policy","\u002Flegal\u002Fdata-privacy-statement",{"label":300,"href":301},"Recruitment Data Policy","\u002Flegal\u002Frecruitment-data-policy",{"label":303,"href":304},"Modern Slavery Statement","\u002Flegal\u002Fmodern-slavery",{"label":306,"href":307},"License","\u002Flegal\u002Flicense",{"label":309,"href":310},"Cookie Policy","\u002Flegal\u002Fcookie-policy",{"label":312,"href":313},"Manage Cookies","#cookies",[315,317,319,321,323],{"label":316},"ISO 27001",{"label":318},"ISO 27017",{"label":320},"ISO 27018",{"label":322},"ISAE 3000 SOC 2 Type II",{"label":324},"ISO 22301",{"platform":326,"solutions":341,"developers":355,"company":365,"resources":366,"partnerships":374},[327,329,339,340],{"kind":328,"label":62,"href":37},"link",{"kind":330,"label":60,"children":331},"group",[332,333,334,335,337],{"label":67,"href":68},{"label":70,"href":71},{"label":73,"href":74},{"label":76,"href":336},"\u002Fplatform\u002Fsponsor-bank-enablement",{"label":79,"href":338},"\u002Fplatform\u002Finform3d-ui",{"kind":328,"label":82,"href":85},{"kind":328,"label":87,"href":90},[342,344,350],{"kind":328,"label":233,"href":343},"\u002Fsolutions\u002Fglobal",{"kind":330,"label":93,"children":345},[346,347,348,349],{"label":235,"href":103},{"label":239,"href":107},{"label":109,"href":112},{"label":114,"href":117},{"kind":330,"label":119,"children":351},[352,353,354],{"label":122,"href":123},{"label":126,"href":127},{"label":130,"href":131},[356,360],{"kind":330,"label":135,"children":357},[358,359],{"label":135,"href":138},{"label":140,"href":141},{"kind":330,"label":143,"children":361},[362,363,364],{"label":146,"href":147},{"label":149,"href":150},{"label":152,"href":153},[],[367,368,369,370,371,372,373],{"kind":328,"label":186,"href":53},{"kind":328,"label":191,"href":192},{"kind":328,"label":194,"href":195},{"kind":328,"label":197,"href":198},{"kind":328,"label":200,"href":201},{"kind":328,"label":203,"href":204},{"kind":328,"label":206,"href":207},[375,376,377],{"kind":328,"label":210,"href":57},{"kind":328,"label":215,"href":216},{"kind":328,"label":218,"href":219},{"id":379,"uid":380,"url":381,"type":382,"href":383,"tags":384,"first_publication_date":385,"last_publication_date":386,"slugs":387,"linked_documents":389,"lang":390,"alternate_languages":391,"data":392},"alz1LhEAAC0AUWhH","conf42-golang-2022-load-testing-with-f1","\u002Fresources\u002Fengineering-blog\u002Fconf42-golang-2022-load-testing-with-f1","engineering_blog_post","https:\u002F\u002Fform3-website.cdn.prismic.io\u002Fapi\u002Fv2\u002Fdocuments\u002Fsearch?ref=apnMZxEAACcAKWxv&q=%5B%5B%3Ad+%3D+at%28document.id%2C+%22alz1LhEAAC0AUWhH%22%29+%5D%5D",[],"2026-07-19T16:21:52+0000","2026-08-28T02:07:19+0000",[388],"what-is-performance-testing",[],"en-us",[],{"title":393,"excerpt":394,"card_image":395,"published_date":401,"reading_time":402,"tag":206,"dek":394,"featured_image":403,"about_form3":404,"client_about_heading":13,"client_about_body":405,"author_name":406,"author_title":407,"author_photo":408,"author_bio":416,"author_linkedin":421,"slices":426,"meta_title":393,"meta_description":843},"Conf42 Golang 2022: Load testing with F1","Due to a lack of functionality in existing solutions, we wrote our own open source load testing tool, F1, at Form3 to test our asynchronous system. This talk gives you an introduction to performance testing, a comparison of common testing tools and a short introduction of how to use f1 to write your own testing scenarios in Go.",{"dimensions":396,"alt":393,"copyright":13,"url":398,"id":399,"edit":400},{"width":397,"height":397},800,"\u002F_prismic-media\u002Fff9159f4994f3110-DeKK8qBPE_Jj-NQ-_conf42-golang-2022-load-testing.png","DeKK8qBPE_Jj-NQ-",{"x":17,"y":17,"zoom":18,"background":19},"2022-04-06",7,{},[],[],"Adelina Simion","Technology Evangelist",{"dimensions":409,"alt":406,"copyright":13,"url":412,"id":413,"edit":414},{"width":410,"height":411},317,474,"\u002F_prismic-media\u002Fe08313b6ab610487-38TSoXRVp2tWVmyC_31a4a6dc-d773-477b-bdf0-7f2e1d8.jpg","38TSoXRVp2tWVmyC",{"x":17,"y":17,"zoom":18,"background":415},"#ffffff",[417],{"type":418,"text":419,"spans":420},"paragraph","Adelina is a polyglot engineer and developer relations professional, with a decade of technical experience at multiple startups in London. She started her career as a Java backend engineer, converted later to Go, and then transitioned to a full-time developer relations role. She has published multiple online courses about Go on the LinkedIn Learning platform, helping thousands of developers up-skill with Go. She has a passion for public speaking, having presented on cloud architectures at major European conferences. Adelina holds an MSc. Mathematical Modelling and Computing degree.",[],{"link_type":422,"key":423,"url":424,"target":425},"Web","95bf6da5-ec5e-4530-9b60-2a83aea7b7b4","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fadelina-simion\u002F","_blank",[427,448,459,493,504,515,526,537,614,638,654,693,704,715,727,735,748,759,767,775,783,791,799,821],{"variation":428,"version":429,"items":430,"primary":431,"id":446,"slice_type":447,"slice_label":13},"default","initial",[],{"headline":13,"sub_headline":13,"embed":432,"caption":13},{"embed_url":433,"type":434,"version":435,"title":436,"author_name":437,"author_url":438,"provider_name":285,"provider_url":439,"thumbnail_url":440,"thumbnail_width":441,"thumbnail_height":442,"html":443,"height":444,"width":445},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=yKJ_h0K6liM","video","1.0","Load testing with F1 | Adelina Simion & Andy Kuszyk | Conf42 Golang 2022","Conf42","https:\u002F\u002Fwww.youtube.com\u002F@conf42","https:\u002F\u002Fwww.youtube.com\u002F","https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FyKJ_h0K6liM\u002Fhqdefault.jpg",480,360,"\u003Ciframe width=\"200\" height=\"113\" src=\"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FyKJ_h0K6liM?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen title=\"Load testing with F1 | Adelina Simion &amp; Andy Kuszyk | Conf42 Golang 2022\">\u003C\u002Fiframe>",113,200,"embed$9a987ac3-f63e-4877-863e-df0284fbdf82","embed",{"variation":428,"version":429,"items":449,"primary":450,"id":457,"slice_type":458,"slice_label":13},[],{"body":451},[452],{"type":453,"text":454,"spans":455,"direction":456},"heading3","What is performance testing?",[],"ltr","rich_text$9adfd7c7-eb11-4437-b827-45d518f323b6","rich_text",{"variation":428,"version":460,"items":461,"primary":462,"id":491,"slice_type":492,"slice_label":13},"",[],{"eyebrow":13,"heading":463,"body":464,"cta_label":13,"cta_link":468,"aside_type":470,"aside_image":471,"aside_video":478,"aside_video_poster":480,"aside_video_reduced_motion":481,"aside_video_url":13,"aside_embed":482,"pardot_form_url":13,"form_submit_label":13,"form_variant":483,"form_heading":13,"redirect_on_success":484,"theme":486,"overlay_pattern":487,"background_continuation":488,"media_position":489,"aside_vertical_align":490},[],[465],{"type":418,"text":466,"spans":467,"direction":456},"Performance testing is the general name for tests that check how the system behaves and performs. The purpose of these tests is to examine stability, scalability and reliability of your software and infrastructure. Generally, performance tests are integration tests that should test your system end-to-end. They live in the middle of the testing pyramid.",[],{"link_type":469},"Any","Image",{"dimensions":472,"alt":13,"copyright":13,"url":475,"id":476,"edit":477},{"width":473,"height":474},760,620,"\u002F_prismic-media\u002Fa6157a146d690db1-6imSffqDxNhZEvJw_9616f291-7a0f-48c5-8383-0a22e32.png","6imSffqDxNhZEvJw",{"x":17,"y":17,"zoom":18,"background":19},{"link_type":479},"Media",{},{},{},"Contact (default)",{"link_type":485},"Document","Light","None","Solid color (no gradient)","Right","Top of section","content_block$3505e6c3-50de-42a3-9ef7-92048c58b217","content_block",{"variation":428,"version":429,"items":494,"primary":495,"id":503,"slice_type":458,"slice_label":13},[],{"body":496},[497,500],{"type":418,"text":498,"spans":499},"Before performance testing, it’s important to determine your system’s business goals, so you can tell if your system behaves satisfactorily or not according to your customer needs. Often, performance testing is done on anticipated future load to see a system’s growth runway. This is important for a high volume payments platform like ours.",[],{"type":418,"text":501,"spans":502},"Under the umbrella of performance testing, we can look at 3 test subtypes.",[],"rich_text$698292a5-5161-4eb7-9dcd-c9a62524ff02",{"variation":428,"version":429,"items":505,"primary":506,"id":514,"slice_type":458,"slice_label":13},[],{"body":507},[508,511],{"type":453,"text":509,"spans":510,"direction":456},"Load tests",[],{"type":418,"text":512,"spans":513,"direction":456},"Load testing tells us how many concurrent requests your system can handle. These tests should be performed all the time in order to ensure your system is behaving correctly, which is why it should be integrated into your continuous integration cycles.",[],"rich_text$d69ee9d8-f88e-4410-ba31-6b8c4763cbc3",{"variation":428,"version":429,"items":516,"primary":517,"id":525,"slice_type":458,"slice_label":13},[],{"body":518},[519,522],{"type":453,"text":520,"spans":521,"direction":456},"Spike tests",[],{"type":418,"text":523,"spans":524,"direction":456},"A spike test checks the upper limits of your system by testing it under extreme loads. It includes a sudden, high ramp-up in users and laod.",[],"rich_text$5482ab6a-7f00-433e-861c-97268deada49",{"variation":428,"version":429,"items":527,"primary":528,"id":536,"slice_type":458,"slice_label":13},[],{"body":529},[530,533],{"type":453,"text":531,"spans":532,"direction":456},"Soak tests",[],{"type":418,"text":534,"spans":535,"direction":456},"A soak test checks the sustainability of your system by testing it over a long period of time. It incluse a slow, gradual ramp-up over time.",[],"rich_text$7f422c96-f571-40f2-94b1-b81725f3da6e",{"variation":428,"version":429,"items":538,"primary":539,"id":613,"slice_type":458,"slice_label":13},[],{"body":540},[541,544,558,564,572,580,585,593,605],{"type":453,"text":542,"spans":543,"direction":456},"Common tools",[],{"type":418,"text":545,"spans":546,"direction":456},"Two of the most common popular tools that are used for test configuration and running areApache JMeter and Grafana K6. Let's have a look at each of them.",[547,553],{"start":548,"end":549,"type":550,"data":551},89,102,"hyperlink",{"link_type":422,"url":552,"target":425},"https:\u002F\u002Fjmeter.apache.org\u002Findex.html",{"start":554,"end":555,"type":550,"data":556},107,117,{"link_type":422,"url":557,"target":425},"https:\u002F\u002Fk6.io\u002F",{"type":418,"text":559,"spans":560,"direction":456},"Apache JMeter",[561],{"start":17,"end":562,"type":563},13,"strong",{"type":418,"text":565,"spans":566,"direction":456},"JMeter is a popular, open source Java testing tool. It allows us to configure tests using a recording GUI and predefined templates. We can use long polling or another request to check whether an asynchronous operation is completed.",[567],{"start":568,"end":569,"type":550,"data":570},92,130,{"link_type":422,"url":571,"target":425},"https:\u002F\u002Fjmeter.apache.org\u002Fusermanual\u002Fjmeter_proxy_step_by_step.html",{"type":418,"text":573,"spans":574,"direction":456},"JMeter provides thread groups and a ramp up period in seconds load testing distributed systems.",[575],{"start":576,"end":577,"type":550,"data":578},62,94,{"link_type":422,"url":579,"target":425},"https:\u002F\u002Fjmeter.apache.org\u002Fusermanual\u002Fjmeter_distributed_testing_step_by_step.html",{"type":418,"text":581,"spans":582,"direction":456},"Grafana K6",[583],{"start":17,"end":584,"type":563},10,{"type":418,"text":586,"spans":587,"direction":456},"K6 is another popular load testing tool. It is an open source Go project. Tests are configured using a scripting language similar to JavaScript.",[588],{"start":589,"end":590,"type":550,"data":591},103,121,{"link_type":422,"url":592,"target":425},"https:\u002F\u002Fk6.io\u002Fdocs\u002Fgetting-started\u002Frunning-k6\u002F",{"type":418,"text":594,"spans":595,"direction":456},"K6 does not provide support for promises or async execution, but we can achieve async testing support using virtual users.",[596,601],{"start":597,"end":598,"type":550,"data":599},32,59,{"link_type":422,"url":600,"target":425},"https:\u002F\u002Fgithub.com\u002Fgrafana\u002Fk6#script-execution",{"start":602,"end":590,"type":550,"data":603},108,{"link_type":422,"url":604,"target":425},"https:\u002F\u002Fk6.io\u002Fdocs\u002Fgetting-started\u002Frunning-k6\u002F#adding-more-vus",{"type":418,"text":606,"spans":607,"direction":456},"Load for the test is configured using scenarios in an options object, which states how many requests to run for each stage of the test. This allows us to configure linear and step ramp up.",[608],{"start":609,"end":610,"type":550,"data":611},38,68,{"link_type":422,"url":612,"target":425},"https:\u002F\u002Fk6.io\u002Fdocs\u002Fusing-k6\u002Foptions\u002F#scenarios","rich_text$21347ff9-a088-4989-b55a-c7a2d1df8cdd",{"variation":428,"version":429,"items":615,"primary":616,"id":637,"slice_type":458,"slice_label":13},[],{"body":617},[618,621,624,627,631,634],{"type":453,"text":619,"spans":620,"direction":456},"Our ideal load testing tool",[],{"type":418,"text":622,"spans":623,"direction":456},"At Form3, we invest a lot of engineering time into performance testing our platform. We initially used k6 to develop and run these tests, but it did not fully fit our ideal load testing tool.",[],{"type":418,"text":625,"spans":626,"direction":456},"Our ideal tool should allow us to:",[],{"type":628,"text":629,"spans":630,"direction":456},"o-list-item","Easily write asynchronous tests, which integrate with our queues and services. This was not always easy to do in Javascript.",[],{"type":628,"text":632,"spans":633,"direction":456},"A allow our engineers to write tests in Go, which is what they’re most comfortable in.",[],{"type":628,"text":635,"spans":636,"direction":456},"Run different modes of load. As our platform operates under huge amounts of load, we want to be able to configure different kinds of load.",[],"rich_text$e989b475-a645-499f-9599-5adbe6e3f69d",{"variation":428,"version":429,"items":639,"primary":640,"id":653,"slice_type":458,"slice_label":13},[],{"body":641},[642,645],{"type":453,"text":643,"spans":644,"direction":456},"F1 example",[],{"type":418,"text":646,"spans":647,"direction":456},"The existing solutions did not provide us any of our ideal load testing tool features, so this is why we decided to write our own solution and then open source it for the community to use. You can find it under form3tech-oss\u002Ff1.",[648],{"start":649,"end":650,"type":550,"data":651},211,227,{"link_type":422,"url":652,"target":425},"https:\u002F\u002Fgithub.com\u002Fform3tech-oss\u002Ff1","rich_text$46d99ee3-aca0-4574-8f4b-b09a40d7a87a",{"variation":428,"version":460,"items":655,"primary":656,"id":692,"slice_type":492,"slice_label":13},[],{"eyebrow":13,"heading":657,"body":658,"cta_label":13,"cta_link":679,"aside_type":470,"aside_image":680,"aside_video":687,"aside_video_poster":688,"aside_video_reduced_motion":689,"aside_video_url":13,"aside_embed":690,"pardot_form_url":13,"form_submit_label":13,"form_variant":483,"form_heading":13,"redirect_on_success":691,"theme":486,"overlay_pattern":487,"background_continuation":488,"media_position":489,"aside_vertical_align":490},[],[659,667],{"type":418,"text":660,"spans":661,"direction":456},"We have also created a demonstration\u002Ftutorial repository under form3tech-oss\u002Ff1-example. We will briefly discuss this example in this blogpost.",[662],{"start":663,"end":664,"type":550,"data":665},63,87,{"link_type":422,"url":666,"target":425},"https:\u002F\u002Fgithub.com\u002Fform3tech-oss\u002Ff1-example",{"type":418,"text":668,"spans":669,"direction":456},"The example docker-compose.yml sets up a simple service which uses goaws local SQS mock. This is the environment we will be running tests on.",[670,675],{"start":671,"end":672,"type":550,"data":673},12,30,{"link_type":422,"url":674,"target":425},"https:\u002F\u002Fgithub.com\u002Fform3tech-oss\u002Ff1-example\u002Fblob\u002Fmaster\u002Fdocker-compose.yml",{"start":676,"end":664,"type":550,"data":677},67,{"link_type":422,"url":678,"target":425},"https:\u002F\u002Fgithub.com\u002Fp4tin\u002Fgoaws",{"link_type":469},{"dimensions":681,"alt":13,"copyright":13,"url":684,"id":685,"edit":686},{"width":682,"height":683},980,780,"\u002F_prismic-media\u002F8820eb49bea28d83--Ydeo3sC9rPI4HhS_a0ca2537-3e36-4595-9c65-32d2a16.png","-Ydeo3sC9rPI4HhS",{"x":17,"y":17,"zoom":18,"background":19},{"link_type":479},{},{},{},{"link_type":485},"content_block$7216a00c-3590-4651-aa02-90b9e7877e7f",{"variation":428,"version":429,"items":694,"primary":695,"id":703,"slice_type":458,"slice_label":13},[],{"body":696},[697,700],{"type":453,"text":698,"spans":699,"direction":456},"Writing tests",[],{"type":418,"text":701,"spans":702,"direction":456},"Writing tests using f1 is easy - you need to import the library and declare it in the main() function of a new command. The f .Add method registers a new scenario to be run with f1.",[],"rich_text$ddf7af68-830c-4090-b4aa-150320c90bb1",{"variation":428,"version":429,"items":705,"primary":706,"id":713,"slice_type":714,"slice_label":13},[],{"language_label":707,"code":708},"go",[709],{"type":710,"text":711,"spans":712},"preformatted","import (\n\t\"net\u002Fhttp\"\n\t\"time\"\n\n\t\"github.com\u002Fform3tech-oss\u002Ff1\u002Fv2\u002Fpkg\u002Ff1\"\n\t\"github.com\u002Fform3tech-oss\u002Ff1\u002Fv2\u002Fpkg\u002Ff1\u002Ftesting\"\n)\n\nfunc main() {\n\tf := f1.New()\n\tf.Add(\"testScenario\", testScenario)\n\tf.Execute()\n}",[],"code_block$802e1e35-97b2-4671-ac39-b6c843b7569f","code_block",{"variation":428,"version":429,"items":716,"primary":717,"id":726,"slice_type":458,"slice_label":13},[],{"body":718},[719],{"type":418,"text":720,"spans":721},"After setting up the SQS client and consuming messages from it, we can configure our run function which will be called by thef1test assertions.",[722],{"start":723,"end":576,"type":550,"data":724},17,{"link_type":422,"url":725,"target":425},"https:\u002F\u002Fgithub.com\u002Fform3tech-oss\u002Ff1-example\u002Fblob\u002Fmaster\u002Fcmd\u002Ff1\u002Fmain.go#L22-L63","rich_text$914d7df4-b2d8-449c-b1b7-44f73c79b0eb",{"variation":428,"version":429,"items":728,"primary":729,"id":734,"slice_type":714,"slice_label":13},[],{"language_label":707,"code":730},[731],{"type":710,"text":732,"spans":733},"runFn := func(t *testing.T) {\n        \u002F\u002F Our test iteration code goes here.\n        res, err := http.Post(\"http:\u002F\u002Flocalhost:8080\u002Fpayments\", \"application\u002Fjson\", nil)\n        t.Require().NoError(err)\n        t.Require().Equal(http.StatusAccepted, res.StatusCode)\n        timer := time.NewTimer(10 * time.Second)\n        for {\n            select {\n            case \u003C-timer.C:\n                t.Require().Fail(\"no message received after timeout\")\n                return\n            case \u003C-messagesChan:\n                t.Logger().Info(\"message received, iteration success\")\n                return\n            }\n        }\n    }",[],"code_block$040f935c-4ed1-498b-8dc4-6f61b3a8a2c9",{"variation":428,"version":429,"items":736,"primary":737,"id":747,"slice_type":458,"slice_label":13},[],{"body":738},[739],{"type":418,"text":740,"spans":741},"You can see the entire test scenario configuration on GitHub",[742],{"start":743,"end":744,"type":550,"data":745},51,60,{"link_type":422,"url":746},"https:\u002F\u002Fgithub.com\u002Fform3tech-oss\u002Ff1-example\u002Fblob\u002Fmaster\u002Fcmd\u002Ff1\u002Fmain.go","rich_text$7b6a8821-f5a4-4a4f-8c48-498bb93f99ae",{"variation":428,"version":429,"items":749,"primary":750,"id":758,"slice_type":458,"slice_label":13},[],{"body":751},[752,755],{"type":453,"text":753,"spans":754,"direction":456},"Running tests",[],{"type":418,"text":756,"spans":757,"direction":456},"Once our test is written we can compile the f1 binary to make it easier to run.",[],"rich_text$afe2018d-e654-4815-a821-a4e9a10cad10",{"variation":428,"version":429,"items":760,"primary":761,"id":766,"slice_type":714,"slice_label":13},[],{"language_label":13,"code":762},[763],{"type":710,"text":764,"spans":765},"go build -o f1 .\u002Fcmd\u002Ff1\u002Fmain.go",[],"code_block$074097f5-0983-44a5-8e7a-0871e90e1189",{"variation":428,"version":429,"items":768,"primary":769,"id":774,"slice_type":458,"slice_label":13},[],{"body":770},[771],{"type":418,"text":772,"spans":773},"Then, it's time to start up the example test environment consisting of our payments service and the mock SQS queue.",[],"rich_text$f75c67a7-cca0-4fad-845b-663aa9e9e394",{"variation":428,"version":429,"items":776,"primary":777,"id":782,"slice_type":714,"slice_label":13},[],{"language_label":13,"code":778},[779],{"type":710,"text":780,"spans":781},"docker-compose up -d",[],"code_block$327b400b-9fab-4820-93d1-f4d222aea069",{"variation":428,"version":429,"items":784,"primary":785,"id":790,"slice_type":458,"slice_label":13},[],{"body":786},[787],{"type":418,"text":788,"spans":789},"Finally, the configured scenario is easily run using the f1 CLI. This command will run the test at a constant rate for 10 seconds.",[],"rich_text$803fd30d-cdb9-42ef-b312-ed56e02f6ac4",{"variation":428,"version":429,"items":792,"primary":793,"id":798,"slice_type":714,"slice_label":13},[],{"language_label":13,"code":794},[795],{"type":710,"text":796,"spans":797},".\u002Ff1 run constant testScenario -r 1\u002Fs -d 10s",[],"code_block$3282190b-db5d-4961-9d58-d4f84085033a",{"variation":428,"version":460,"items":800,"primary":801,"id":820,"slice_type":492,"slice_label":13},[],{"eyebrow":13,"heading":802,"body":803,"cta_label":13,"cta_link":807,"aside_type":470,"aside_image":808,"aside_video":815,"aside_video_poster":816,"aside_video_reduced_motion":817,"aside_video_url":13,"aside_embed":818,"pardot_form_url":13,"form_submit_label":13,"form_variant":483,"form_heading":13,"redirect_on_success":819,"theme":486,"overlay_pattern":487,"background_continuation":488,"media_position":489,"aside_vertical_align":490},[],[804],{"type":418,"text":805,"spans":806,"direction":456},"The command outputs some basic metrics for the test service.",[],{"link_type":469},{"dimensions":809,"alt":13,"copyright":13,"url":812,"id":813,"edit":814},{"width":810,"height":811},2048,1266,"\u002F_prismic-media\u002Fc8d8beb0d6551d29-wL1jf7sROsw_AAEu_a6603b5b-0e8e-4727-9a4b-7c681ae.png","wL1jf7sROsw_AAEu",{"x":17,"y":17,"zoom":18,"background":19},{"link_type":479},{},{},{},{"link_type":485},"content_block$51f24cf8-64b9-4148-8fa3-8fd52ad65263",{"variation":428,"version":429,"items":822,"primary":823,"id":842,"slice_type":458,"slice_label":13},[],{"body":824},[825,828,831,837],{"type":453,"text":826,"spans":827,"direction":456},"Conclusions",[],{"type":418,"text":829,"spans":830,"direction":456},"Writing our tests in Go has been a huge game changer for our engineers, as it allows us to make use of goroutines and channels for test configuration.",[],{"type":418,"text":832,"spans":833,"direction":456},"f1 is feature complete, we use it every day and you can too. It's freely available on GitHub.",[834],{"start":835,"end":568,"type":550,"data":836},83,{"link_type":422,"url":652,"target":425},{"type":418,"text":838,"spans":839,"direction":456},"Happy load testing!",[840],{"start":17,"end":841,"type":563},19,"rich_text$356d00bd-72c8-4681-bfc0-de29c58fbeec","Due to a lack of functionality in existing solutions, we wrote our own open source load testing tool, F1, at Form3 to test our asynchronous system. This blogpost gives you an introduction to performance testing, a comparison of common testing tools and a short introduction of how to usef1to write your own testing scenarions in Go.",1788466508025]