<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8264657588618504333</id><updated>2026-08-01T17:11:31.870-07:00</updated><category term="Test Automation"/><category term="selenium"/><category term="capybara"/><category term="CI"/><category term="devops"/><category term="Automation"/><category term="android"/><category term="cucumber"/><category term="mobile testing"/><category term="test"/><category term="Performance"/><category term="calabash"/><category term="CD"/><category term="Continuous integration"/><category term="chrome"/><category term="testing"/><category term="istqb"/><category term="webdriver"/><category term="Jenkins"/><category term="agile"/><category term="mobil test otomasyonu"/><category term="python"/><category term="ruby"/><category term="Load Test"/><category term="error"/><category term="espresso"/><category term="firefox"/><category term="locust"/><category term="Continous Delivery"/><category term="Test mühendisliği"/><category term="ie"/><category term="ios"/><category term="software testing"/><category term="Jmeter"/><category term="QA"/><category term="bdd"/><category term="chromedriver"/><category term="kalite"/><category term="testops"/><category term="LoadUI"/><category term="SDLC"/><category term="SoapUI"/><category term="browserstack"/><category term="calabas-ios"/><category term="ci/cd"/><category term="cloud"/><category term="contract testing"/><category term="docker"/><category term="eşdeğer aralık"/><category term="integration"/><category term="internet explorer"/><category term="iseb"/><category term="kibana"/><category term="methodology"/><category term="monitoring"/><category term="poltergeist"/><category term="review"/><category term="services"/><category term="stress"/><category term="test uzmanı"/><category term="windows"/><category term="xcuitest"/><category term="yazılım kalitesi raporu"/><category term="LoadRunner"/><category term="Martin Fowler"/><category term="Mesut Güneş"/><category term="TSRQ"/><category term="TTB"/><category term="Testistanbul"/><category term="Türkçe"/><category term="ai-testing"/><category term="alias"/><category term="appium"/><category term="bitrise"/><category term="browser compatibility test"/><category term="browsers"/><category term="capgemini"/><category term="checking"/><category term="comparison"/><category term="console"/><category term="defect"/><category term="deterministic"/><category term="dökümanı"/><category term="e-commerce"/><category term="emulator"/><category term="endurance"/><category term="exploratory"/><category term="eğitim"/><category term="firebase"/><category term="hata"/><category term="headless"/><category term="hp"/><category term="inspection"/><category term="java"/><category term="k6"/><category term="load"/><category term="microservice"/><category term="mühendisin özellikleri"/><category term="otomasyon"/><category term="page-object"/><category term="performance-testing"/><category term="quality"/><category term="rapor"/><category term="ruby-gems"/><category term="screenshot"/><category term="slide"/><category term="sogeti"/><category term="spike"/><category term="sınır değer"/><category term="terminal"/><category term="tes case design"/><category term="test data"/><category term="test framework"/><category term="test strategy"/><category term="test-cloud"/><category term="tools"/><category term="xamarin"/><category term="Albert Einstein"/><category term="Amir Banet"/><category term="Ari Takinen"/><category term="Baran Özgül"/><category term="CPT"/><category term="CSS"/><category term="Cengiz Han"/><category term="David Elliman"/><category term="Definition of Done"/><category term="Deming"/><category term="DoD"/><category term="Dorothy Graham"/><category term="Equivalence Partitioning"/><category term="Feigenbaum"/><category term="Full Coverage and Sanity Testing"/><category term="Google Analytic"/><category term="Huxley"/><category term="IDE"/><category term="INSTRUMENTATION_FAILED"/><category term="Jira"/><category term="Juran"/><category term="Lee Copeland"/><category term="Mark Cöte"/><category term="Open Source"/><category term="Partial Coverage"/><category term="Production"/><category term="RC"/><category term="Risk"/><category term="Risk based testing"/><category term="SME"/><category term="SPC"/><category term="SUT"/><category term="Selenium-Wraith"/><category term="SpiraTest"/><category term="StaleElementReferenceError"/><category term="Strong Normal"/><category term="Strong Robust"/><category term="TQM"/><category term="TTK"/><category term="Test sözlüğü"/><category term="Thomas Edison"/><category term="TotT"/><category term="UX"/><category term="V-model"/><category term="Van Damme"/><category term="Volvo"/><category term="Weak  Robust"/><category term="Weak Normal"/><category term="Wraith"/><category term="XCTUITest"/><category term="XCTest"/><category term="XP"/><category term="adsense"/><category term="adworks"/><category term="agileturkey"/><category term="ai"/><category term="airborne"/><category term="akış şeması"/><category term="anonim"/><category term="api"/><category term="application"/><category term="assertion check"/><category term="assignment"/><category term="aws device farm"/><category term="benefit"/><category term="benfits"/><category term="big data"/><category term="blazemeter"/><category term="bug"/><category term="büyük yazılım hataları"/><category term="cabash-android"/><category term="calabash-android"/><category term="capabilities"/><category term="capacity"/><category term="cases"/><category term="category-partition testing"/><category term="challenges"/><category term="chromeoptions"/><category term="codenomican"/><category term="combinatorial testing"/><category term="compatibility matrix"/><category term="component"/><category term="computing"/><category term="conference"/><category term="conflict of interest"/><category term="container"/><category term="continuous testing"/><category term="control"/><category term="crossbrowser"/><category term="cucumber reports plugin"/><category term="daha iyi test"/><category term="declarative"/><category term="developer"/><category term="difference"/><category term="disable image"/><category term="drop-down"/><category term="dynamic test"/><category term="eggplant"/><category term="ekonomik boyutu"/><category term="elasticsearch"/><category term="epistemology"/><category term="etohum"/><category term="examples"/><category term="extreme programming"/><category term="facebook"/><category term="failure"/><category term="first"/><category term="flaky test"/><category term="flow chart"/><category term="framework"/><category term="gamification"/><category term="gatling"/><category term="gcloud"/><category term="generative-ai"/><category term="generative-testing"/><category term="genymotion"/><category term="gereksinim"/><category term="girişim"/><category term="girişimcilik"/><category term="git"/><category term="github"/><category term="gitlab"/><category term="google"/><category term="gsutil"/><category term="gözden geçirme"/><category term="hataların maliyeti"/><category term="headless=new"/><category term="hook"/><category term="hosts"/><category term="ieee"/><category term="iframe"/><category term="imperative"/><category term="influxdb"/><category term="installation"/><category term="integration testing"/><category term="istatistiksel süreç kontrol"/><category term="jQuery"/><category term="jobs"/><category term="jython"/><category term="kara kutu testler"/><category term="keepass"/><category term="kotlin"/><category term="kullanabilirlik e-ticaret"/><category term="kullanıcı deneyimi"/><category term="learnability"/><category term="limited"/><category term="logcat"/><category term="master"/><category term="mavi okyanu"/><category term="maximize"/><category term="ml"/><category term="mssql"/><category term="myhabit"/><category term="native automation tooling"/><category term="newman"/><category term="operations"/><category term="othogonal array"/><category term="pact"/><category term="pairwise testing"/><category term="parallel"/><category term="pattern"/><category term="phantomjs"/><category term="philosophy"/><category term="pom"/><category term="pop-up"/><category term="popups"/><category term="postman"/><category term="powershell"/><category term="priority"/><category term="redirection"/><category term="report"/><category term="responsive"/><category term="rest"/><category term="return on investiment"/><category term="risk calculation"/><category term="roi"/><category term="rspec"/><category term="safari"/><category term="samsung"/><category term="saucelabs"/><category term="script"/><category term="scrum"/><category term="severity"/><category term="shared preference"/><category term="simulator"/><category term="sistem analisti"/><category term="slave"/><category term="smartbear"/><category term="soak"/><category term="soap"/><category term="sql"/><category term="sqlcmd"/><category term="static test"/><category term="statik test"/><category term="sürücü testi"/><category term="sınır değeri"/><category term="table"/><category term="talks"/><category term="tarayıcı uyumluluk"/><category term="tdd"/><category term="teknoloji adaptasyon döngüsü"/><category term="test analizi"/><category term="test approach"/><category term="test coverage"/><category term="test otomasyon"/><category term="test plan"/><category term="test psikolojisi"/><category term="test seviyesi"/><category term="test tasarım"/><category term="test teknikleri"/><category term="test verisi"/><category term="tester"/><category term="tester&#39;s day"/><category term="the driving test"/><category term="thoughtworks"/><category term="timeout"/><category term="toplam kalite yönetimi"/><category term="type of e-commerce"/><category term="unittest"/><category term="update"/><category term="user agent"/><category term="user experience testing"/><category term="verimlilik"/><category term="volume"/><category term="waterfall"/><category term="watir"/><category term="webservice"/><category term="world quality report"/><category term="yazılım"/><category term="yazılım geliştirme yaşam döngüsü"/><category term="çevik yöntemler"/><category term="İsa Göksu"/><category term="şelale"/><title type='text'>TEST THE RISK!</title><subtitle type='html'>Not a feature, but the future of an app is under testing.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.testrisk.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://www.testrisk.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Mesut Güneş</name><uri>http://www.blogger.com/profile/06466018199442112635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhksmGlHvp6B2fPh5-Ci5g2Ek3nRvfSdq2utvdyhnryXZklRvpFlzP3eIBz3y293tW1q2N1RoPfPSvGGcAydIDlFj2h39vGzq85o7GRl3wG1Q2ez99aSFJE9AdZT8DAQ80/s220/10371365_778508612195086_5198865414746812917_n.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>134</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8264657588618504333.post-6678053008423560420</id><published>2025-06-20T09:24:00.000-07:00</published><updated>2025-06-20T12:52:03.693-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ai-testing"/><category scheme="http://www.blogger.com/atom/ns#" term="Automation"/><category scheme="http://www.blogger.com/atom/ns#" term="CI"/><category scheme="http://www.blogger.com/atom/ns#" term="ci/cd"/><category scheme="http://www.blogger.com/atom/ns#" term="ml"/><category scheme="http://www.blogger.com/atom/ns#" term="performance-testing"/><title type='text'>Challenges in Evaluating Performance Testing Results</title><content type='html'>&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Performance testing is critical for understanding how applications behave under different levels of load, but interpreting the results remains a complex challenge. Traditional evaluation methods—especially those using binary pass/fail criteria—fail to capture the nuanced reality of modern software systems. As part of Continuous Integration and Continuous Deployment (CI/CD) pipelines, performance tests must provide actionable, reliable insights without manual intervention.&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;In this post, I’ll share my insights on evaluating performance testing results. It’s the first part of a series aimed at achieving fully autonomous continuous performance testing.&lt;/p&gt;&lt;h3 style=&quot;text-align: justify;&quot;&gt;Why Evaluation Is Critical for CPT and Performance Testing&lt;/h3&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Performance testing is no longer a one-time activity executed before release. With Continuous Performance Testing (CPT), performance checks are embedded throughout the software delivery lifecycle. This integration demands fast, reliable decision-making. But performance data—response times, error rates, throughput, resource utilization—are inherently noisy and multidimensional.&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;In CPT:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;Time is limited.&lt;/b&gt; Tests must run and be evaluated quickly.&amp;nbsp;&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;Automation is mandatory.&lt;/b&gt; Manual interpretation won’t scale with frequent code changes.&amp;nbsp;&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;Confidence is key.&lt;/b&gt; Developers need to trust that test results reflect true system behavior.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Therefore, the evaluation process must be &lt;strong&gt;intelligent&lt;/strong&gt;, &lt;strong&gt;automated&lt;/strong&gt;, and &lt;strong&gt;resilient&lt;/strong&gt; to variations in system and workload.&lt;/p&gt;&lt;h3 style=&quot;text-align: justify;&quot;&gt;What is Thresholds&lt;/h3&gt;&lt;div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Thresholds are the specific values that determine whether a test passes or fails by establishing the minimum or maximum acceptable performance levels. In the context of performance testing, these thresholds are particularly significant because they serve as the benchmark against which test outcomes are measured. By comparing the actual test results to these predefined thresholds, testers can objectively decide whether the system meets the required performance standards or falls short.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiMp-e4OBRyXjYhO7h9jbN3orHetNehQ5Yc8ufl88ejjiGZuoggEx4UM3E5lO1e4qQYUzANVzFyUo41Yxhe-JW471UF6q3L_Xhypx9_2qmXrAI8kAcDdD1GY50XMVzuAfkKaa9b4JRd1BlxwgUhbk_PzxlNNI9I820HfQuAr6qoNcIIyQW0BwnUz2i1-jE&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;1078&quot; data-original-width=&quot;1786&quot; height=&quot;386&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiMp-e4OBRyXjYhO7h9jbN3orHetNehQ5Yc8ufl88ejjiGZuoggEx4UM3E5lO1e4qQYUzANVzFyUo41Yxhe-JW471UF6q3L_Xhypx9_2qmXrAI8kAcDdD1GY50XMVzuAfkKaa9b4JRd1BlxwgUhbk_PzxlNNI9I820HfQuAr6qoNcIIyQW0BwnUz2i1-jE=w640-h386&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Setting Static Threshold for K6&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Consequently, setting appropriate thresholds is a critical step in the testing process. These values must be carefully determined, either by analyzing historical data and performance expectations or by calculating them based on the anticipated capabilities of the system under test. This ensures that the thresholds accurately reflect the desired performance goals and provide a reliable basis for evaluating test outcomes.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Thresholds can be established using two distinct approaches:&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ol style=&quot;text-align: left;&quot;&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;Static threshold setting&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;Dynamic threshold setting.&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Static thresholds use predefined fixed values, requiring extensive optimization, while dynamic thresholds adjust in real-time based on system behavior analysis. Static methods offer consistency but lack flexibility; dynamic methods adapt but add complexity. Both pose technical challenges, and the choice depends on testing requirements.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: justify;&quot;&gt;The Problem with Static Thresholds&lt;/h3&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Performance tests often rely on static thresholds to determine pass/fail criteria—for example:&lt;/p&gt;&lt;ul&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Response time must be &lt;b&gt;below 500 ms&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Error rate must stay &lt;b&gt;under 1%&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Throughput should &lt;b&gt;exceed 1000 requests per second&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Although straightforward to implement, static thresholds face significant challenges. Analyzing complex systems makes threshold-setting difficult, as performance baselines are rarely static. Additionally, evolving codebases and infrastructure require constant adaptation, rendering fixed values impractical over time. Dynamic adjustments may be necessary, but they introduce their own complexities. While easy to implement, static thresholds have major limitations:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;Rigidity:&lt;/b&gt; Static thresholds do not adapt to changes in workload, system architecture, or infrastructure. A fixed “500 ms” limit might make sense in one deployment but fail arbitrarily in another with slightly different characteristics.&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;Binary Results:&amp;nbsp;&lt;/b&gt;The system either passes or fails, without any contextual interpretation. A 501 ms response time is marked as failure, even if performance is functionally acceptable.&amp;nbsp;&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;False Positives and Negatives:&lt;/b&gt;&amp;nbsp;Minor fluctuations or outliers may cause test failures despite overall system health, or hide genuine regressions if averages remain within bounds.&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;Lack of Learning:&amp;nbsp;&lt;/b&gt;Static thresholds don&#39;t improve over time. They remain detached from historical behavior, usage patterns, and test results, which creates missed opportunities for smarter evaluations.&lt;/li&gt;&lt;/ul&gt;&lt;h2 style=&quot;text-align: justify;&quot;&gt;Evaluation Methods for Performance Testing Results&lt;/h2&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;To overcome the limitations of static rules, performance engineers use several evaluation techniques, typically falling into three categories:&lt;/p&gt;&lt;h3 style=&quot;text-align: justify;&quot;&gt;1. &lt;strong&gt;Static Thresholds&lt;/strong&gt;&lt;/h3&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;The most basic form of evaluation. Simple rules are defined ahead of time, often as configuration in CI pipelines or monitoring dashboards.&amp;nbsp;Setting static thresholds for performance testing involves defining fixed limits for key performance metrics (e.g., response time, throughput, error rate) to determine whether a system meets acceptable performance standards.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;strong&gt;Pros&lt;/strong&gt;: Easy to implement, understandable for most of the system, but sometimes hard to set the correct values for complex systems. Performance requirements can be directly used if it is already defined.&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;strong&gt;Cons&lt;/strong&gt;: Too simplistic, brittle, prone to false alarms.&amp;nbsp;&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;strong&gt;Best Use&lt;/strong&gt;: It can be used for quick checks for very stable systems with well-known characteristics.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: justify;&quot;&gt;2. &lt;strong&gt;Statistical Methods&lt;/strong&gt;&lt;/h3&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;These methods treat performance metrics as &lt;strong&gt;distributions&lt;/strong&gt; rather than fixed numbers. They leverage hypothesis testing, standard deviation, and confidence intervals to determine whether current performance deviates significantly from historical norms.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiZSe7K2pUUIEAM_ZRFGM7_zoyOBRFCirTwT8uEzNVNR-iW_uf6UnslJxpKihZ1SDT2vprlQfPktgEpcznhTPsqN9hAmkiP7cKys1QWyTfCiu7lbHklvxFhjY--J9KWyK2B3JEgKKf378HniKo5ru47d6qLPVQ7PQnYZNFRMskku_jdnSWMhviVvzKkmx0&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;785&quot; data-original-width=&quot;1325&quot; height=&quot;380&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiZSe7K2pUUIEAM_ZRFGM7_zoyOBRFCirTwT8uEzNVNR-iW_uf6UnslJxpKihZ1SDT2vprlQfPktgEpcznhTPsqN9hAmkiP7cKys1QWyTfCiu7lbHklvxFhjY--J9KWyK2B3JEgKKf378HniKo5ru47d6qLPVQ7PQnYZNFRMskku_jdnSWMhviVvzKkmx0=w640-h380&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Using Normal-Distribution&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;For example: Test whether the 95th percentile response time is within two standard deviations of the historical average. Use confidence intervals to detect regressions even if values remain under hard thresholds&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;strong&gt;Pros&lt;/strong&gt;: Adaptive, contextual, data-driven&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;strong&gt;Cons&lt;/strong&gt;: Requires more data and expertise, sensitive to anomalies. Need to be careful that there might be a trend that every run goes up in the confidence level, so the hypothesis does not fail.&amp;nbsp;&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;strong&gt;Best Use&lt;/strong&gt;: Detecting subtle performance regressions or anomalies in CI pipelines&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: justify;&quot;&gt;3. &lt;strong&gt;Machine Learning Models and Using AI&lt;/strong&gt;&lt;/h3&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;ML models offer the most advanced and flexible approach. By learning from large amounts of historical data, these models can classify test outcomes, detect anomalies, and even forecast future performance.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEimrXtb1FNUg4vuffi5nTKzR8dMQgHYJ6lHP7uk5lO8Xxu1mOJ42YHlD-A2a0h6UFkmzjn7GKJGqlARXUzt1jPrnAWIyXY0YgY1VMDBxAjeN7F2pAGmZhe3AgeYi9sqZDqpEBGueZStertylFYWP8u96S0dBkX1u0iydNmlDlovukKKz3agz0VvhiKgBTU&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;600&quot; data-original-width=&quot;1200&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEimrXtb1FNUg4vuffi5nTKzR8dMQgHYJ6lHP7uk5lO8Xxu1mOJ42YHlD-A2a0h6UFkmzjn7GKJGqlARXUzt1jPrnAWIyXY0YgY1VMDBxAjeN7F2pAGmZhe3AgeYi9sqZDqpEBGueZStertylFYWP8u96S0dBkX1u0iydNmlDlovukKKz3agz0VvhiKgBTU=w640-h320&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Using ML model for Trend Analysis&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;ML-based evaluation can be applied using:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;strong&gt;Supervised learning&lt;/strong&gt;: Train a model to label runs as “pass” or “fail” based on historical test outcomes and associated metrics.&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;strong&gt;Unsupervised learning&lt;/strong&gt;: Use clustering or anomaly detection to highlight unusual behavior without labeled data.&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;strong&gt;Forecasting&lt;/strong&gt;: Predict future performance trends using time series models (e.g., LSTM, Prophet).&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;AI, particularly through ML models, offers vast potential. We can analyze every response in depth to determine the expected value, even when comparing outputs from different endpoints. While countless analyses are possible, the key is identifying the optimal approaches for our system.&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;strong&gt;Pros&lt;/strong&gt;: Scalable, context-aware, adaptable to change&amp;nbsp;&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;strong&gt;Cons&lt;/strong&gt;: Requires sufficient data, infrastructure, validation, and expertise&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;strong&gt;Best Use&lt;/strong&gt;: High-frequency testing environments, dynamic systems, exploratory analysis&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;h2&gt;&lt;/h2&gt;&lt;h2 style=&quot;text-align: justify;&quot;&gt;Conclusion&lt;/h2&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;The evaluation of performance testing results is one of the most crucial—and most misunderstood—parts of modern testing pipelines. As software systems grow more complex and dynamic, simplistic evaluation techniques no longer suffice.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;strong&gt;Static thresholds&lt;/strong&gt; offer quick wins but struggle with accuracy and adaptability.&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;strong&gt;Statistical methods&lt;/strong&gt; introduce nuance and data-driven judgment, ideal for detecting meaningful regressions.&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;strong&gt;Machine learning&lt;/strong&gt; opens the door to scalable, intelligent, and autonomous performance evaluation.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;To support CI/CD and shift-left strategies, evaluation mechanisms must evolve to be as dynamic and intelligent as the systems they monitor. The future of performance testing is not just about generating metrics—it’s about understanding them in context, automatically, and with confidence.&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Mesut Güneş&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/6678053008423560420'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/6678053008423560420'/><link rel='alternate' type='text/html' href='http://www.testrisk.com/2025/06/the-problem-of-evaluation-for.html' title='Challenges in Evaluating Performance Testing Results'/><author><name>Mesut Güneş</name><uri>http://www.blogger.com/profile/06466018199442112635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhksmGlHvp6B2fPh5-Ci5g2Ek3nRvfSdq2utvdyhnryXZklRvpFlzP3eIBz3y293tW1q2N1RoPfPSvGGcAydIDlFj2h39vGzq85o7GRl3wG1Q2ez99aSFJE9AdZT8DAQ80/s220/10371365_778508612195086_5198865414746812917_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEiMp-e4OBRyXjYhO7h9jbN3orHetNehQ5Yc8ufl88ejjiGZuoggEx4UM3E5lO1e4qQYUzANVzFyUo41Yxhe-JW471UF6q3L_Xhypx9_2qmXrAI8kAcDdD1GY50XMVzuAfkKaa9b4JRd1BlxwgUhbk_PzxlNNI9I820HfQuAr6qoNcIIyQW0BwnUz2i1-jE=s72-w640-h386-c" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-8264657588618504333.post-8622549204034624257</id><published>2024-06-13T11:20:00.001-07:00</published><updated>2025-02-06T03:52:59.231-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CPT"/><category scheme="http://www.blogger.com/atom/ns#" term="Performance"/><category scheme="http://www.blogger.com/atom/ns#" term="performance-testing"/><category scheme="http://www.blogger.com/atom/ns#" term="software testing"/><category scheme="http://www.blogger.com/atom/ns#" term="Test Automation"/><title type='text'> The Power of Continuous Performance Testing: A Shift-Left and Shift-Right Approach</title><content type='html'>&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: left;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivnhZF1hOIyf0u_G68-p3DTsQcgac_rSvNUpBxtcfH60EYqJdDpaFs8bcYg1k3hAtK_TQIYSoc705-VO5FEvN41KCEHw-8FbNWs5MFcSZcJJ92o23kFTIg7YaXhNok4A4ugy72Uy7Sclxt7IhJKeh0n9z-xmmvsr0PMXUBGIDFLRSv1mC6gi-_0JTWQFU/s1186/performance-testing-comics.png&quot; style=&quot;clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto; text-align: justify;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;972&quot; data-original-width=&quot;1186&quot; height=&quot;262&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivnhZF1hOIyf0u_G68-p3DTsQcgac_rSvNUpBxtcfH60EYqJdDpaFs8bcYg1k3hAtK_TQIYSoc705-VO5FEvN41KCEHw-8FbNWs5MFcSZcJJ92o23kFTIg7YaXhNok4A4ugy72Uy7Sclxt7IhJKeh0n9z-xmmvsr0PMXUBGIDFLRSv1mC6gi-_0JTWQFU/s320/performance-testing-comics.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;no stress we have CPT&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;The performance of a system can make or break the user experience. Whether it&#39;s a website, mobile app, or software application, users expect lightning-fast response times and seamless functionality. As testers, it&#39;s our job to ensure that these expectations are met, and one of the most effective ways to do that is through Continuous Performance Testing (CPT). I want to create a blogpost about CPT, which is the main idea of my talk given at &lt;a href=&quot;https://iststc.com/#konusmacilar&quot; target=&quot;_blank&quot;&gt;ISTSTC-2024&lt;/a&gt;. You can reach to&amp;nbsp;&lt;a href=&quot;https://www.slideshare.net/slideshow/continuous-performance-testing-iststc-1-pdf/269670142&quot; target=&quot;_blank&quot;&gt;my presentation here&lt;/a&gt; as well.&lt;/div&gt;&lt;h3 style=&quot;text-align: justify;&quot;&gt;What is Continuous Performance Testing (CPT)?&lt;/h3&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;CPT is an approach to testing that involves testing the performance of a system continuously, from the early stages of development to after deployment. It&#39;s a shift-left and shift-right approach that enables teams to identify and fix performance issues early on, reducing the risk of downtime, crashes, and other performance-related problems.&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;CPT is a game-changer in the world of software testing. It involves testing the performance of a system continuously throughout the development lifecycle, rather than waiting until the end to run a few isolated tests. This shift-left approach allows us to catch performance issues early on, when they are easier and cheaper to fix.&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;But CPT is not just about catching bugs. It&#39;s also about optimizing performance and ensuring that the system can handle the demands of a growing user base. By running performance tests continuously, we can identify potential bottlenecks and scalability issues before they become a problem, allowing us to make adjustments and improvements proactively.&lt;/p&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiimicElO_si7WdjS_9OyGzESommSCWm2O8GV_rSOSh-UaNsnw-dVtGBoI3ZS8YiNz7YJH8jbDlTi2B4_1ZUnfIMDyl7ZDILncWrGpInrARvWjK7IcbhYjlnHMsjqtp9UVUdiy8oSfkt6mF-JFeBxenJx4mvyD6MMffwq5yvaraLn2nOTTHp0piOldKQFA/s1581/monitorin-performance-testing-grafana-dashboard-grafana-cloud-k6%20copy.png&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;808&quot; data-original-width=&quot;1581&quot; height=&quot;328&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiimicElO_si7WdjS_9OyGzESommSCWm2O8GV_rSOSh-UaNsnw-dVtGBoI3ZS8YiNz7YJH8jbDlTi2B4_1ZUnfIMDyl7ZDILncWrGpInrARvWjK7IcbhYjlnHMsjqtp9UVUdiy8oSfkt6mF-JFeBxenJx4mvyD6MMffwq5yvaraLn2nOTTHp0piOldKQFA/w640-h328/monitorin-performance-testing-grafana-dashboard-grafana-cloud-k6%20copy.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;monitoring the performance of a system&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 style=&quot;text-align: justify;&quot;&gt;The Importance of CPT&lt;/h3&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;The traditional approach to performance testing typically involves testing towards the end of the development cycle, which can lead to:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;Delayed detection of performance issues, resulting in costly rework&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;Longer development cycles, leading to delayed time-to-market&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;Poor user experience, resulting in lost revenue and reputation damage&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;In contrast, CPT enables teams to:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;Identify performance issues early, reducing rework and saving time&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;Improve system performance, resulting in faster response times and better user experience&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;Reduce the risk of performance-related problems, leading to increased reliability and uptime&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;h4 style=&quot;text-align: justify;&quot;&gt;How CPT Works&lt;/h4&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;CPT involves integrating performance testing into the Continuous Integration/Continuous Deployment (CI/CD) pipeline, allowing teams to test performance continuously throughout the development lifecycle.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Here&#39;s how it works:&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;ol style=&quot;text-align: left;&quot;&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;Automated Testing&lt;/b&gt;: Automated performance tests are integrated into the CI/CD pipeline, allowing teams to test performance continuously.&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;Early Detection&lt;/b&gt;: Performance issues are identified early, allowing teams to fix problems before they become critical.&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;Continuous Monitoring&lt;/b&gt;: Performance monitoring tools are used to track system performance in real time, enabling teams to identify issues as they arise.&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;Proactive Improvement&lt;/b&gt;: Performance data is used to optimize system performance, ensuring that the system can handle increasing loads and user traffic.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;/p&gt;&lt;h4 style=&quot;text-align: justify;&quot;&gt;Benefits of CPT&lt;/h4&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;The benefits of CPT are numerous, including:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;Improved System Performance&lt;/b&gt;: CPT enables teams to identify and fix performance issues early, resulting in faster response times and better user experience.&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;Reduced Risk&lt;/b&gt;: CPT reduces the risk of performance-related problems, leading to increased reliability and uptime.&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;Cost Savings&lt;/b&gt;: CPT reduces the cost of fixing performance issues, as problems are identified and fixed early on.&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;Faster Time-to-Market&lt;/b&gt;: CPT enables teams to release software faster, as performance issues are identified and fixed earlier in the development cycle.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: justify;&quot;&gt;Conclusion&lt;/h3&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Continuous Performance Testing is a game-changer for teams looking to deliver high-performing systems that meet the demands of modern users. By adopting a shift-left and shift-right approach to performance testing, teams can ensure that their systems are fast, reliable, and scalable. So why wait until the end to test performance when you can do it continuously with CPT?&lt;/p&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;Comic: https://images.app.goo.gl/TVy8DzqnVN4NhCHA8&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Mesut Güneş&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/8622549204034624257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/8622549204034624257'/><link rel='alternate' type='text/html' href='http://www.testrisk.com/2024/06/the-power-of-continuous-performance.html' title=' The Power of Continuous Performance Testing: A Shift-Left and Shift-Right Approach'/><author><name>Mesut Güneş</name><uri>http://www.blogger.com/profile/06466018199442112635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhksmGlHvp6B2fPh5-Ci5g2Ek3nRvfSdq2utvdyhnryXZklRvpFlzP3eIBz3y293tW1q2N1RoPfPSvGGcAydIDlFj2h39vGzq85o7GRl3wG1Q2ez99aSFJE9AdZT8DAQ80/s220/10371365_778508612195086_5198865414746812917_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivnhZF1hOIyf0u_G68-p3DTsQcgac_rSvNUpBxtcfH60EYqJdDpaFs8bcYg1k3hAtK_TQIYSoc705-VO5FEvN41KCEHw-8FbNWs5MFcSZcJJ92o23kFTIg7YaXhNok4A4ugy72Uy7Sclxt7IhJKeh0n9z-xmmvsr0PMXUBGIDFLRSv1mC6gi-_0JTWQFU/s72-c/performance-testing-comics.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-8264657588618504333.post-319966086711316309</id><published>2024-06-12T01:40:00.000-07:00</published><updated>2024-06-12T01:51:31.159-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Automation"/><category scheme="http://www.blogger.com/atom/ns#" term="chrome"/><category scheme="http://www.blogger.com/atom/ns#" term="headless"/><category scheme="http://www.blogger.com/atom/ns#" term="headless=new"/><category scheme="http://www.blogger.com/atom/ns#" term="python"/><category scheme="http://www.blogger.com/atom/ns#" term="selenium"/><category scheme="http://www.blogger.com/atom/ns#" term="Test Automation"/><title type='text'>Deep Dive into `headless=new` in Selenium</title><content type='html'>&lt;h3 style=&quot;text-align: justify;&quot;&gt;Introduction&lt;/h3&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;When it comes to automation testing, Selenium is a household name. With its extensive range of capabilities and flexibility, it has become an indispensable tool for quality assurance engineers. One of the most significant features of Selenium is its ability to run in headless mode, allowing testers to execute tests without the need for a visible browser instance. In this article, we&#39;ll delve into the world of headless mode, specifically exploring the `headless=new` parameter and its implications for Selenium testing.&lt;/div&gt;&lt;h3 style=&quot;text-align: justify;&quot;&gt;What is Headless Mode?&lt;/h3&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Headless mode is a configuration option in Selenium that enables running browser instances without displaying a visible UI. This mode is particularly useful for automating tasks on cloud infrastructure, where a graphical interface is not available, or for running tests on a continuous integration/continuous deployment (CI/CD) pipeline. By default, when you use headless mode, Selenium will launch a browser instance in the background, allowing you to execute tests without visual rendering.&lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;/p&gt;&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: right; margin-left: 1em; text-align: center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUpvSn2a_MYxmmTt4QPefrMuJ6HoIHaorYTmciTxPjNWPSIif-Qeq8Ez-wa5jcAhHxaPPo0Z7_NFWssTRoiQMYL363t2QoNGZADXfOuufDBibHZzwOhiVxIEyeFr0cLWKFZFBAK51IOQxQkaD2inKg3vPBQEdApjyzRGjHzTf8OVfVJc45CuC6A1YGl5I/s1036/chrome-headless-new-mode.png&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;chrome headless=new&quot; border=&quot;0&quot; data-original-height=&quot;1036&quot; data-original-width=&quot;1006&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUpvSn2a_MYxmmTt4QPefrMuJ6HoIHaorYTmciTxPjNWPSIif-Qeq8Ez-wa5jcAhHxaPPo0Z7_NFWssTRoiQMYL363t2QoNGZADXfOuufDBibHZzwOhiVxIEyeFr0cLWKFZFBAK51IOQxQkaD2inKg3vPBQEdApjyzRGjHzTf8OVfVJc45CuC6A1YGl5I/w310-h320/chrome-headless-new-mode.png&quot; width=&quot;310&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Chrome --headless old and new&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Previously, headless mode was not just a mode but rather considered as another library. This meant that every feature had to be implemented separately for it, leading to a unique set of bugs not found in the Chrome library. Managing this not only demanded extensive effort from Chrome developers but also required users to handle a significant amount of customization for both headless and headed modes. As a result, the current setup illustrates that both headless and headfull modes utilize the same library, ensuring uniformity across functionalities. To delve deeper into the implementation details, you can refer to &lt;a href=&quot;https://developer.chrome.com/docs/chromium/new-headless&quot;&gt;the blog post&lt;/a&gt; created by Chrome developers.&lt;/div&gt;&lt;h3 style=&quot;text-align: justify;&quot;&gt;The `headless=new` Parameter&lt;/h3&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;In recent Selenium versions, a new parameter called `headless=new` has been introduced. This parameter signals a significant shift in how headless mode operates. With `headless=new`, Selenium no longer treats headless mode as a separate entity from the standard, full-browser experience. Instead, it leverages the same codebase as the full-featured browser, ensuring that your tests are executed in a more authentic environment.&lt;/div&gt;&lt;h3 style=&quot;text-align: justify;&quot;&gt;Why `headless=new` Matters&lt;/h3&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;The introduction of `headless=new` addresses several limitations and drawbacks associated with traditional headless mode. I need to switch to the `--headless=new` because the old version is supporting the testing the Chrome extensions. I can create test cases and run it on headful mode but when I want to run it in headless mode in the CI, it starts failing. There many more benefits and some key benefits include:&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;Improved Compatibility&lt;/b&gt;:&amp;nbsp;By sharing the same codebase as the full browser, `headless=new` ensures that your tests are executed in an environment that closely mirrors the real-world browsing experience.&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;Enhanced Stability&lt;/b&gt;: By leveraging the same rendering engine as the full browser, `headless=new` reduces the likelihood of issues and errors that were previously common in headless mode.&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;Simplified Maintenance&lt;/b&gt;: With `headless=new`, you can write tests that can be executed in both headless and full-browser modes, eliminating the need to maintain separate test suites.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: justify;&quot;&gt;Using headless=new in Selenium with Python&lt;/h3&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;To take advantage of headless=new in Selenium with Python, follow these steps:&lt;/div&gt;&lt;h4 style=&quot;text-align: justify;&quot;&gt;Install the required dependencies:&lt;/h4&gt;&lt;div&gt;&lt;pre style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f6f8fa; border-radius: 6px; box-sizing: border-box; color: var(--gpts-black-text-color2); font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 11.9px; line-height: 1.45; margin-bottom: 16px; margin-top: 0px; overflow-wrap: normal; overflow: auto;&quot;&gt;&lt;div class=&quot;code-block&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; box-sizing: border-box; direction: ltr; position: relative;&quot;&gt;&lt;div class=&quot;code-block-inner&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; box-sizing: border-box; overflow-x: auto; position: static;&quot;&gt;&lt;code class=&quot;hljs language-python&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: transparent; border-radius: 6px; border: 0px; box-sizing: border-box; color: #24292e; display: inline-block; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; line-height: inherit; margin: 0px; overflow-wrap: normal; overflow: auto; padding: 16px;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: transparent; box-sizing: border-box; color: #d73a49;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: transparent; box-sizing: border-box;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #24292e;&quot;&gt; selenium &lt;/span&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: transparent; box-sizing: border-box;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #24292e;&quot;&gt; webdriver&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: transparent; box-sizing: border-box; color: #d73a49;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt; selenium.webdriver.chrome.options &lt;/span&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: transparent; box-sizing: border-box; color: #d73a49;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt; Options&lt;/span&gt;&lt;/div&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; box-sizing: border-box; color: #d73a49;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: transparent; box-sizing: border-box;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #24292e;&quot;&gt; selenium.webdriver.chrome.service &lt;/span&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: transparent; box-sizing: border-box;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #24292e;&quot;&gt; Service&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; box-sizing: border-box; color: #d73a49;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: transparent; box-sizing: border-box;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #24292e;&quot;&gt; webdriver_manager.chrome &lt;/span&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: transparent; box-sizing: border-box;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #24292e;&quot;&gt; ChromeDriverManager&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 style=&quot;text-align: justify;&quot;&gt;Import the necessary modules:&lt;/h4&gt;&lt;div&gt;&lt;pre style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f6f8fa; border-radius: 6px; box-sizing: border-box; color: var(--gpts-black-text-color2); font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 11.9px; line-height: 1.45; margin-bottom: 16px; margin-top: 0px; overflow-wrap: normal; overflow: auto;&quot;&gt;&lt;div class=&quot;code-block&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; box-sizing: border-box; direction: ltr; position: relative;&quot;&gt;&lt;div class=&quot;code-block-inner&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; box-sizing: border-box; overflow-x: auto; position: static;&quot;&gt;&lt;code class=&quot;hljs language-python&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: transparent; border-radius: 6px; border: 0px; box-sizing: border-box; color: #24292e; display: inline-block; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; line-height: inherit; margin: 0px; overflow-wrap: normal; overflow: auto; padding: 16px;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;options = Options()&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;options.add_argument(&lt;/span&gt;&lt;span class=&quot;hljs-string&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: transparent; box-sizing: border-box; color: #032f62;&quot;&gt;&quot;--headless=new&quot;&lt;/span&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;options.add_argument(&lt;/span&gt;&lt;span class=&quot;hljs-string&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: transparent; box-sizing: border-box; color: #032f62;&quot;&gt;&quot;--disable-gpu&quot;&lt;/span&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;ol start=&quot;4&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; box-sizing: border-box; color: var(--gpts-black-text-color2); font-family: var(--gpts-font-family); font-size: 14px; margin-bottom: 16px; margin-top: 0px; padding-left: 2em;&quot;&gt;&lt;/ol&gt;&lt;/div&gt;&lt;h4 style=&quot;text-align: justify;&quot;&gt;Configure the Chrome options:pip install selenium&amp;nbsp;&lt;/h4&gt;&lt;div&gt;&lt;pre style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f6f8fa; border-radius: 6px; box-sizing: border-box; color: var(--gpts-black-text-color2); font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 11.9px; line-height: 1.45; margin-bottom: 16px; margin-top: 0px; overflow-wrap: normal; overflow: auto;&quot;&gt;&lt;div class=&quot;code-block&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; box-sizing: border-box; direction: ltr; position: relative;&quot;&gt;&lt;div class=&quot;code-block-inner&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; box-sizing: border-box; overflow-x: auto; position: static;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #24292e;&quot;&gt;  service = Service(ChromeDriverManager().install())&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #24292e;&quot;&gt;  driver = webdriver.Chrome(service=service, options=options)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 style=&quot;text-align: justify;&quot;&gt;Create a new instance of the Chrome driver pip install webdriver-manager&lt;/h4&gt;&lt;div&gt;&lt;pre style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f6f8fa; border-radius: 6px; box-sizing: border-box; line-height: 1.45; margin-bottom: 16px; margin-top: 0px; overflow-wrap: normal; overflow: auto;&quot;&gt;&lt;div class=&quot;code-block&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; box-sizing: border-box; direction: ltr; position: relative;&quot;&gt;&lt;div class=&quot;code-block-inner&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; box-sizing: border-box; overflow-x: auto; position: static;&quot;&gt;&lt;code class=&quot;hljs language-python&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: transparent; border-radius: 6px; border: 0px; box-sizing: border-box; display: inline-block; line-height: inherit; margin: 0px; overflow-wrap: normal; overflow: auto; padding: 16px;&quot;&gt;&lt;div style=&quot;color: #24292e; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 11.9px; text-align: justify;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: transparent; box-sizing: border-box; color: #d73a49;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: transparent; box-sizing: border-box;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #24292e;&quot;&gt; selenium &lt;/span&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: transparent; box-sizing: border-box;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #24292e;&quot;&gt; webdriver&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;color: #24292e; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 11.9px; text-align: justify;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: transparent; box-sizing: border-box; color: #d73a49;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt; selenium.webdriver.chrome.options &lt;/span&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: transparent; box-sizing: border-box; color: #d73a49;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt; Options&lt;/span&gt;&lt;/div&gt;&lt;span class=&quot;hljs-keyword&quot; face=&quot;ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; box-sizing: border-box; color: #d73a49; font-size: 11.9px;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: transparent; box-sizing: border-box;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #24292e;&quot;&gt; selenium.webdriver.chrome.service &lt;/span&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: transparent; box-sizing: border-box;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #24292e;&quot;&gt; Service&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;span class=&quot;hljs-keyword&quot; face=&quot;ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; box-sizing: border-box; color: #d73a49; font-size: 11.9px;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: transparent; box-sizing: border-box;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #24292e;&quot;&gt; webdriver_manager.chrome &lt;/span&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: transparent; box-sizing: border-box;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #24292e;&quot;&gt; ChromeDriverManager&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span face=&quot;ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace&quot; style=&quot;color: #24292e; font-size: 11.9px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span face=&quot;ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace&quot; style=&quot;color: #24292e; font-size: 11.9px;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;options = Options()&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;options.add_argument(&lt;/span&gt;&lt;span class=&quot;hljs-string&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: transparent; box-sizing: border-box; color: #032f62;&quot;&gt;&quot;--headless=new&quot;&lt;/span&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;span face=&quot;ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace&quot; style=&quot;color: #24292e; font-size: 11.9px;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;options.add_argument(&lt;/span&gt;&lt;span class=&quot;hljs-string&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: transparent; box-sizing: border-box; color: #032f62;&quot;&gt;&quot;--disable-gpu&quot;&lt;/span&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span face=&quot;ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace&quot; style=&quot;color: #24292e; font-size: 11.9px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span face=&quot;ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace&quot; style=&quot;color: #24292e;&quot;&gt;&lt;div style=&quot;font-size: 11.9px; text-align: justify;&quot;&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;service = Service(ChromeDriverManager().install())&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-size: 11.9px; text-align: justify;&quot;&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;driver = webdriver.Chrome(service=service, options=options)&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: 11.9px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-size: 11.9px; text-align: justify;&quot;&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;driver.get(&lt;/span&gt;&lt;span class=&quot;hljs-string&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: transparent; box-sizing: border-box; color: #032f62;&quot;&gt;&quot;https://www.google.com&quot;&lt;/span&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;span class=&quot;hljs-built_in&quot; face=&quot;ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; box-sizing: border-box; color: #e36209; font-size: 11.9px;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;hljs-built_in&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: transparent; box-sizing: border-box;&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #24292e;&quot;&gt;(driver.title)&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;span face=&quot;ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace&quot; style=&quot;color: #24292e; font-size: 11.9px;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;driver.quit()&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;h3 style=&quot;text-align: justify;&quot;&gt;Best Practices for headless=new&lt;/h3&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;When working with headless=new, keep the following best practices in mind:Use a recent version of Selenium: Ensure you&#39;re running the latest version of Selenium to take advantage of the headless=new features. Carefully consider your test environment: As headless=new uses the same codebase as the full Chrome browser, ensure your tests are designed to accommodate the increased resources required for headless mode. Monitor your system resources: Keep a close eye on system resources, such as memory and CPU usage, to avoid performance bottlenecks.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: justify;&quot;&gt;Conclusion&lt;/h3&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;In conclusion, headless=new marks a significant improvement in Selenium&#39;s headless mode capabilities. By leveraging the same codebase as the full Chrome browser, you can now execute tests in a more authentic environment, enjoying improved compatibility, stability, and maintenance. By following the best practices outlined in this article, you&#39;ll be well on your way to unlocking the full potential of headless mode in Selenium with Python.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;message-item-outer relative px-3&quot; data-id=&quot;72d2793e-ce18-4519-97e1-e299a6b233bb&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; box-sizing: border-box; margin-bottom: 16px; overflow-anchor: none; padding-left: 12px; padding-right: 12px; position: relative;&quot;&gt;&lt;div class=&quot;flex items-center flex-shrink-0&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; align-items: center; background-color: white; box-sizing: border-box; color: rgba(0, 0, 0, 0.97); display: flex; flex-shrink: 0; font-family: &amp;quot;DM Sans&amp;quot;, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 14px;&quot;&gt;&lt;div class=&quot;role-icon-box ltr:mr-[6px] rtl:ml-[6px] rounded-full flex-shrink-0 flex justify-center items-center bg-[#c54f4f] text-[white] text-[10px]&quot; style=&quot;--tw-bg-opacity: 1; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-text-opacity: 1; --tw-translate-x: 0; --tw-translate-y: 0; align-items: center; background-color: rgb(197 79 79 / var(--tw-bg-opacity)); border-radius: 9999px; box-sizing: border-box; color: rgb(255 255 255 / var(--tw-text-opacity)); display: flex; flex-shrink: 0; font-size: 10px; justify-content: center; margin-left: 6px;&quot;&gt;&lt;div class=&quot;relative flex-shrink-0&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; box-sizing: border-box; flex-shrink: 0; height: 20px; position: relative; text-align: justify; width: 20px;&quot;&gt;&lt;img alt=&quot;avatar&quot; class=&quot;w-full h-full rounded-full&quot; src=&quot;https://chitchat-avatar.s3.amazonaws.com/b5f7e5cd638340cab8112495ea24d16c-1702287358.png&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-radius: 9999px; box-sizing: border-box; height: 20px; width: 20px;&quot; /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;role-title font-semibold&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; box-sizing: border-box; font-weight: 600; text-align: justify;&quot;&gt;You&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;content-area pl-[26px]&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: white; box-sizing: border-box; color: rgba(0, 0, 0, 0.97); font-family: &amp;quot;DM Sans&amp;quot;, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 14px; padding-left: 26px;&quot;&gt;&lt;div class=&quot;message-item select-text relative self&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; align-items: center; box-sizing: border-box; display: flex; flex-direction: row; gap: 6px; margin-bottom: 0px; position: relative; user-select: text;&quot;&gt;&lt;div class=&quot;message-inner relative&quot; style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-radius: 2px 12px 12px; box-sizing: border-box; color: var(--gpts-primary-text-color); line-height: 1.5; max-width: 97%; position: relative; width: fit-content;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Mesut Güneş&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/319966086711316309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/319966086711316309'/><link rel='alternate' type='text/html' href='http://www.testrisk.com/2024/06/deep-dive-into-headlessnew-in-selenium.html' title='Deep Dive into `headless=new` in Selenium'/><author><name>Mesut Güneş</name><uri>http://www.blogger.com/profile/06466018199442112635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhksmGlHvp6B2fPh5-Ci5g2Ek3nRvfSdq2utvdyhnryXZklRvpFlzP3eIBz3y293tW1q2N1RoPfPSvGGcAydIDlFj2h39vGzq85o7GRl3wG1Q2ez99aSFJE9AdZT8DAQ80/s220/10371365_778508612195086_5198865414746812917_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUpvSn2a_MYxmmTt4QPefrMuJ6HoIHaorYTmciTxPjNWPSIif-Qeq8Ez-wa5jcAhHxaPPo0Z7_NFWssTRoiQMYL363t2QoNGZADXfOuufDBibHZzwOhiVxIEyeFr0cLWKFZFBAK51IOQxQkaD2inKg3vPBQEdApjyzRGjHzTf8OVfVJc45CuC6A1YGl5I/s72-w310-h320-c/chrome-headless-new-mode.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-8264657588618504333.post-6222196485765113824</id><published>2024-06-07T01:50:00.000-07:00</published><updated>2024-06-08T10:45:58.957-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ai"/><category scheme="http://www.blogger.com/atom/ns#" term="ai-testing"/><category scheme="http://www.blogger.com/atom/ns#" term="generative-ai"/><category scheme="http://www.blogger.com/atom/ns#" term="generative-testing"/><title type='text'>AI in Software Testing</title><content type='html'>&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;span style=&quot;color: #172b4d;&quot;&gt;&lt;span&gt;&lt;div style=&quot;font-family: inherit; letter-spacing: -0.08px; text-align: justify; white-space-collapse: preserve;&quot;&gt;&lt;span style=&quot;letter-spacing: -0.08px;&quot;&gt;&lt;span style=&quot;letter-spacing: -0.08px;&quot;&gt;Artificial intelligence (AI) has permeated every aspect of our lives, and software testing is no exception. In fact, AI is revolutionizing traditional testing practices, making them more efficient, effective, and adaptable to the demands of modern software development. By leveraging AI, teams can deliver high-quality software products that meet the evolving needs of both users and businesses.

There has been ongoing debate about whether AI will eventually render manual and automated testing obsolete. In my opinion, this prospect is unlikely in the near future, particularly with regards to manual testing. However, AI is making significant strides in automated testing, albeit not yet at a satisfactory level. Currently, the greatest value of AI lies in supporting various activities, freeing up time for testing teams to focus on high-value tasks that require expertise in test engineering and product domain knowledge.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;letter-spacing: -0.08px; white-space-collapse: preserve;&quot;&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCAZOs_GJqyueRCekXPFHcSYmzlFWT0_CwhS5chG0VIrkZvxqVujL7hshUkwJ8lt3huNd7vNS2hMcEPdGAJDOCibFObvO-tKKrjNv5vuqy4i7eqE3iHWIUlz0lApFzJ4_8-5lcgpXduPGhr33XlpQpIiVXfDg4ioA-C6uz8c_2XeUO5HnYo2Dfr5NQ7Po/s1471/llm-based-application.png&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;891&quot; data-original-width=&quot;1471&quot; height=&quot;388&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCAZOs_GJqyueRCekXPFHcSYmzlFWT0_CwhS5chG0VIrkZvxqVujL7hshUkwJ8lt3huNd7vNS2hMcEPdGAJDOCibFObvO-tKKrjNv5vuqy4i7eqE3iHWIUlz0lApFzJ4_8-5lcgpXduPGhr33XlpQpIiVXfDg4ioA-C6uz8c_2XeUO5HnYo2Dfr5NQ7Po/w640-h388/llm-based-application.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: #505f79; font-size: 16px; text-align: justify; white-space-collapse: preserve;&quot;&gt;LLM Based Application&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
If you&#39;re a consultant like myself, you may wonder how to harness the power of AI in software testing. To stay ahead of the curve, it&#39;s essential to gain expertise in the following areas:
&lt;/span&gt;&lt;h4&gt;&lt;span style=&quot;letter-spacing: -0.08px; white-space-collapse: preserve;&quot;&gt;Testing AI-based applications/products&lt;/span&gt;&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;span style=&quot;letter-spacing: -0.08px; white-space-collapse: preserve;&quot;&gt;Testing traditional applications is mostly comparing the app with the requirements. However, an AI-based application can create different results with positive test results.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;letter-spacing: -0.08px; white-space-collapse: preserve;&quot;&gt;Limiting testing activity is not deterministic for AI testing, understanding the AI algorithm and then doing more testing on the result could open new rooms for testing and it can lead to endless testing effort.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;letter-spacing: -0.08px; white-space-collapse: preserve;&quot;&gt;LLM-based application has LLM Models at the heart of the architecture but testing the other parts of the component is similar to testing any products. Here we should add testing the integration of the component. Contract testing can play a crucial role in testing the microservices as well as checking some prompts on the integration of the LLM. &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h4&gt;&lt;span style=&quot;letter-spacing: -0.08px; white-space-collapse: preserve;&quot;&gt;Creating AI-based testing tools to support testing&lt;/span&gt;&lt;/h4&gt;&lt;span style=&quot;letter-spacing: -0.08px; white-space-collapse: preserve;&quot;&gt;Based on the experience, we can also create open-source tools to support testing. When we talk about AI in testing, we mostly talk about automation but it is not limited with automation. In fact, many companies created paid tools for test automation. We should leverage the benefits of using AI in other areas as well.
&lt;/span&gt;&lt;h4&gt;&lt;span style=&quot;letter-spacing: -0.08px; white-space-collapse: preserve;&quot;&gt;Using AI in software testing like&lt;/span&gt;&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;letter-spacing: -0.08px; white-space-collapse: preserve;&quot;&gt;&lt;b&gt;Automated Test Case Generation:&lt;/b&gt; AI algorithms can generate test cases automatically, reducing the manual effort required to create test scripts.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;letter-spacing: -0.08px; white-space-collapse: preserve;&quot;&gt;&lt;b style=&quot;letter-spacing: -0.08px;&quot;&gt;Intelligent Test Prioritization:&lt;/b&gt;&lt;span style=&quot;letter-spacing: -0.08px;&quot;&gt; AI can analyze code changes and prioritize test cases based on risk, impact, and likelihood of failure, optimizing testing resources.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;b style=&quot;letter-spacing: -0.08px; white-space-collapse: preserve;&quot;&gt;Defect Prediction&lt;/b&gt;&lt;span style=&quot;letter-spacing: -0.08px; white-space-collapse: preserve;&quot;&gt;: AI models can analyze historical data to predict potential defects, enabling proactive measures to prevent issues before deployment.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;b style=&quot;letter-spacing: -0.08px; white-space-collapse: preserve;&quot;&gt;Anomaly Detection&lt;/b&gt;&lt;span style=&quot;letter-spacing: -0.08px; white-space-collapse: preserve;&quot;&gt;: AI algorithms can identify abnormal behavior in software systems, helping to detect bugs and performance issues early.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;b style=&quot;letter-spacing: -0.08px; white-space-collapse: preserve;&quot;&gt;Visual Testing Automation&lt;/b&gt;&lt;span style=&quot;letter-spacing: -0.08px; white-space-collapse: preserve;&quot;&gt;: AI-powered tools can automate visual testing by identifying UI changes, layout issues, and graphical glitches across different devices and browsers.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;b style=&quot;letter-spacing: -0.08px; white-space-collapse: preserve;&quot;&gt;Natural Language Processing&lt;/b&gt;&lt;span style=&quot;letter-spacing: -0.08px; white-space-collapse: preserve;&quot;&gt; (NLP) Testing: AI can understand and analyze natural language requirements and test cases, improving the efficiency of testing processes.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;b style=&quot;letter-spacing: -0.08px; white-space-collapse: preserve;&quot;&gt;Test Data Generation&lt;/b&gt;&lt;span style=&quot;letter-spacing: -0.08px; white-space-collapse: preserve;&quot;&gt;: AI techniques like generative adversarial networks (GANs) can create realistic test data sets, enhancing test coverage and accuracy.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;b style=&quot;letter-spacing: -0.08px; white-space-collapse: preserve;&quot;&gt;Dynamic Test Environment Management&lt;/b&gt;&lt;span style=&quot;letter-spacing: -0.08px; white-space-collapse: preserve;&quot;&gt;: AI can dynamically allocate and configure test environments based on project requirements, reducing setup time and resources.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;b style=&quot;letter-spacing: -0.08px; white-space-collapse: preserve;&quot;&gt;Regression Testing Optimization&lt;/b&gt;&lt;span style=&quot;letter-spacing: -0.08px; white-space-collapse: preserve;&quot;&gt;: AI can intelligently select and prioritize regression test suites, focusing on areas most likely affected by code changes.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;b style=&quot;letter-spacing: -0.08px; white-space-collapse: preserve;&quot;&gt;Performance Testing Optimization&lt;/b&gt;&lt;span style=&quot;letter-spacing: -0.08px; white-space-collapse: preserve;&quot;&gt;: AI algorithms can simulate real-world user behavior to perform load, stress, and performance testing, identifying bottlenecks and optimizing system performance.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;b style=&quot;letter-spacing: -0.08px; white-space-collapse: preserve;&quot;&gt;Self-Healing Test Automation&lt;/b&gt;&lt;span style=&quot;letter-spacing: -0.08px; white-space-collapse: preserve;&quot;&gt;: AI-powered testing frameworks can automatically update test scripts to adapt to changes in the application under test, reducing maintenance efforts.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;b style=&quot;letter-spacing: -0.08px; white-space-collapse: preserve;&quot;&gt;Code Coverage Analysis&lt;/b&gt;&lt;span style=&quot;letter-spacing: -0.08px; white-space-collapse: preserve;&quot;&gt;: AI can analyze code coverage metrics and suggest improvements to ensure comprehensive testing coverage.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;b style=&quot;letter-spacing: -0.08px; white-space-collapse: preserve;&quot;&gt;Cross-Browser and Cross-Device Testing&lt;/b&gt;&lt;span style=&quot;letter-spacing: -0.08px; white-space-collapse: preserve;&quot;&gt;: AI-driven tools can automate testing across various browsers, devices, and screen resolutions, ensuring consistent user experiences.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;b style=&quot;letter-spacing: -0.08px; white-space-collapse: preserve;&quot;&gt;Behavior-Driven Testing (BDT)&lt;/b&gt;&lt;span style=&quot;letter-spacing: -0.08px; white-space-collapse: preserve;&quot;&gt;: AI can assist in translating business requirements into executable test scenarios, aligning testing efforts with business objectives.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;b style=&quot;letter-spacing: -0.08px; white-space-collapse: preserve;&quot;&gt;Security Testing&lt;/b&gt;&lt;span style=&quot;letter-spacing: -0.08px; white-space-collapse: preserve;&quot;&gt;: AI can identify security vulnerabilities by analyzing code patterns and behaviors, helping to fortify applications against cyber threats.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style=&quot;letter-spacing: -0.08px; white-space-collapse: preserve;&quot;&gt;Stay tuned, I will be writing more on how we can efficiently use AI in testing. Happy testing!&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Mesut Güneş&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/6222196485765113824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/6222196485765113824'/><link rel='alternate' type='text/html' href='http://www.testrisk.com/2024/06/ai-in-testing.html' title='AI in Software Testing'/><author><name>Mesut Güneş</name><uri>http://www.blogger.com/profile/06466018199442112635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhksmGlHvp6B2fPh5-Ci5g2Ek3nRvfSdq2utvdyhnryXZklRvpFlzP3eIBz3y293tW1q2N1RoPfPSvGGcAydIDlFj2h39vGzq85o7GRl3wG1Q2ez99aSFJE9AdZT8DAQ80/s220/10371365_778508612195086_5198865414746812917_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCAZOs_GJqyueRCekXPFHcSYmzlFWT0_CwhS5chG0VIrkZvxqVujL7hshUkwJ8lt3huNd7vNS2hMcEPdGAJDOCibFObvO-tKKrjNv5vuqy4i7eqE3iHWIUlz0lApFzJ4_8-5lcgpXduPGhr33XlpQpIiVXfDg4ioA-C6uz8c_2XeUO5HnYo2Dfr5NQ7Po/s72-w640-h388-c/llm-based-application.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-8264657588618504333.post-7225533790823878855</id><published>2023-11-14T05:54:00.000-08:00</published><updated>2023-11-15T01:53:38.428-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CI"/><category scheme="http://www.blogger.com/atom/ns#" term="ci/cd"/><category scheme="http://www.blogger.com/atom/ns#" term="devops"/><category scheme="http://www.blogger.com/atom/ns#" term="Test Automation"/><title type='text'>Enhancing DevOps Efficiency: The Crucial Role of Automated Testing in CI/CD</title><content type='html'>&lt;p style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px; text-align: justify; white-space: pre-wrap;&quot;&gt;In the rapidly evolving landscape of software development, the adoption of DevOps practices has become paramount for organizations striving to deliver high-quality software at an accelerated pace. Continuous Integration and Continuous Delivery (CI/CD) are integral components of the DevOps pipeline, ensuring rapid and reliable software delivery. In this era of DevOps, automated testing plays a pivotal role in enhancing the efficiency, reliability, and overall success of the CI/CD process.&lt;/p&gt;&lt;h2 style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-headings); line-height: 1.33333; margin: 2rem 0px 1rem; text-align: justify; white-space: pre-wrap;&quot;&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhfho7lLG4yI7SdJFlIwheoYioOfHRn0OBq_u_OzTMoJv_5F_otFvfmplUof86jJfiGhl6jozIe-87ZIhu_ZUbKubbmbVKF7ozi48mdsJZnAPpaRBmIkafQJChFy343ID4l7EGEOmUafhHLb8r_D0j88xBPDFIRkF8WMTChHxAbKdb18ANIHyLmsrdwmfM&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;span style=&quot;font-family: courier; font-size: x-small;&quot;&gt;&lt;img alt=&quot;DevOps&quot; data-original-height=&quot;212&quot; data-original-width=&quot;446&quot; height=&quot;304&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhfho7lLG4yI7SdJFlIwheoYioOfHRn0OBq_u_OzTMoJv_5F_otFvfmplUof86jJfiGhl6jozIe-87ZIhu_ZUbKubbmbVKF7ozi48mdsJZnAPpaRBmIkafQJChFy343ID4l7EGEOmUafhHLb8r_D0j88xBPDFIRkF8WMTChHxAbKdb18ANIHyLmsrdwmfM=w640-h304&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: courier; font-size: x-small;&quot;&gt;DevOps&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/h2&gt;&lt;h2 style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-headings); font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; line-height: 1.33333; margin: 2rem 0px 1rem; text-align: justify; white-space: pre-wrap;&quot;&gt;Understanding DevOps, CI/CD, and Automated Testing&lt;/h2&gt;&lt;h3 style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-headings); font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 1.25em; line-height: 1.6; margin: 1rem 0px 0.5rem; text-align: justify; white-space: pre-wrap;&quot;&gt;DevOps: A Cultural Shift&lt;/h3&gt;&lt;p style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 0px 0px 1.25em; text-align: justify; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;background-color: #f7f7f8;&quot;&gt;DevOps is a cultural and organizational shift that seeks to break down silos between development and operations teams. It emphasizes collaboration, communication, and automation to deliver high-quality software more efficiently. CI/CD, on the other hand, is a set of best practices that automate the process of integrating code changes and deploying them to production. Continuous Integration involves regularly merging code changes into a shared repository, while Continuous Deployment automates the release of these changes into production.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 0px 0px 1.25em; text-align: justify; white-space: pre-wrap;&quot;&gt;DevOps is more than just a set of practices or tools; it represents a cultural shift that emphasizes collaboration and communication between development and operations teams. The primary goal is to deliver software faster and more reliably.&lt;/p&gt;&lt;h3 style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-headings); font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 1.25em; line-height: 1.6; margin: 1rem 0px 0.5rem; text-align: justify; white-space: pre-wrap;&quot;&gt;CI/CD: The Backbone of DevOps&lt;/h3&gt;&lt;p style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 0px 0px 1.25em; text-align: justify; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;background-color: #f7f7f8;&quot;&gt;In the dynamic landscape of software development, the symbiotic relationship between DevOps and Continuous Integration/Continuous Deployment (CI/CD) has become paramount. DevOps practices emphasize collaboration and communication between development and operations teams, while CI/CD pipelines streamline the process of delivering software updates rapidly and reliably. In this era of DevOps, automated testing emerges as a linchpin, ensuring the integrity and quality of software throughout the entire development lifecycle.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 0px 0px 1.25em; text-align: justify; white-space: pre-wrap;&quot;&gt;Continuous Integration (CI) involves automatically integrating code changes into a shared repository multiple times a day. Continuous Delivery (CD) extends CI by automatically deploying code changes to production or staging environments after passing through various testing stages.&lt;/p&gt;&lt;h3 style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-headings); font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 1.25em; line-height: 1.6; margin: 1rem 0px 0.5rem; text-align: justify; white-space: pre-wrap;&quot;&gt;Automated Testing: Ensuring Quality at Speed&lt;/h3&gt;&lt;p style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 0px 0px 1.25em; text-align: justify; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;background-color: #f7f7f8; text-align: left;&quot;&gt;Automated testing is a software testing technique that uses specialized tools and scripts to execute pre-defined tests on a software application or system. Instead of manually running tests, automated testing involves the use of automation tools to perform repetitive but necessary testing tasks. The primary goal is to enhance the efficiency, effectiveness, and coverage of the testing process, particularly in the context of software development and quality assurance.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 0px 0px 1.25em; text-align: justify; white-space: pre-wrap;&quot;&gt;Automated testing is a key enabler for achieving the goals of DevOps by allowing teams to test their code rapidly and consistently. It involves using testing tools and scripts to execute predefined test cases, comparing the actual outcomes with expected results, and providing fast feedback to developers.&lt;/p&gt;&lt;p style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 0px 0px 1.25em; text-align: justify; white-space: pre-wrap;&quot;&gt;Automation should cover all the scenarios that are possible and meaningful, so we can consider the following areas for automation:&lt;/p&gt;&lt;p style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 0px 0px 1.25em; text-align: justify; white-space: pre-wrap;&quot;&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Classes/Methods&lt;/li&gt;&lt;li&gt;Integrations&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Unit&lt;/li&gt;&lt;li&gt;Component&lt;/li&gt;&lt;li&gt;System&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Requirements&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Functional&lt;/li&gt;&lt;li&gt;Non-functional&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Processes&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Development&lt;/li&gt;&lt;li&gt;Testing&lt;/li&gt;&lt;li&gt;Distributing&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;h2 style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-headings); font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; line-height: 1.33333; margin: 2rem 0px 1rem; text-align: justify; white-space: pre-wrap;&quot;&gt;Implementing Automated Testing in CI/CD&lt;/h2&gt;&lt;h3 style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-headings); font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 1.25em; line-height: 1.6; margin: 1rem 0px 0.5rem; text-align: justify; white-space: pre-wrap;&quot;&gt;1. Unit Testing&lt;/h3&gt;&lt;p style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 0px 0px 1.25em; text-align: justify; white-space: pre-wrap;&quot;&gt;The unit level is the first level of the system and the unit test is designed to check the smallest part of the system. Developers write unit tests to verify the functionality of individual code units. Automated unit testing is the first line of defense, catching issues early in the development process. &lt;/p&gt;&lt;h3 style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-headings); font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 1.25em; line-height: 1.6; margin: 1rem 0px 0.5rem; text-align: justify; white-space: pre-wrap;&quot;&gt;2. Integration Testing&lt;/h3&gt;&lt;span face=&quot;Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;&quot; style=&quot;caret-color: rgb(55, 65, 81); color: #374151; font-size: 16px; text-align: justify; white-space: pre-wrap;&quot;&gt;Integration tests validate the interactions between different components or modules of an application. The integration&lt;/span&gt;&amp;nbsp;level has wider test approaches since the context of the unit is very small and the UI is user-oriented.&lt;span style=&quot;text-align: justify;&quot;&gt;&amp;nbsp;&lt;span face=&quot;Söhne, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji&quot; style=&quot;color: #374151;&quot;&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;Everything other than the unit testing are different kind of integration testing so integration testing includes c&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;hecking the integration of units/components, services, APIs or even systems.&amp;nbsp;&lt;span style=&quot;text-align: justify;&quot;&gt;&lt;span face=&quot;Söhne, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji&quot; style=&quot;color: #374151;&quot;&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;Automated integration testing ensures that the integrated system functions as intended.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;h3 style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-headings); font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 1.25em; line-height: 1.6; margin: 1rem 0px 0.5rem; text-align: justify; white-space: pre-wrap;&quot;&gt;3. End-to-End Testing&lt;/h3&gt;&lt;p style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 0px 0px 1.25em; text-align: justify; white-space: pre-wrap;&quot;&gt;When the level goes upper, concepts of the testing are getting closer to the end-user scenarios so that we can ensure that the end-users do not having bad experience with the product. End-to-end tests simulate user scenarios and interactions with the application. Automating end-to-end testing guarantees that critical user journeys are tested consistently across various environments.&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 1.25em;&quot;&gt;4. Test Environments&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 0px 0px 1.25em; text-align: justify; white-space: pre-wrap;&quot;&gt;Tests should be run against test environments so that tests mimic real users. Establishing automated test environments that mirror production configurations is crucial for accurate testing. This minimizes the risk of discrepancies between testing and production environments.&lt;/p&gt;&lt;h3 style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-headings); font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 1.25em; line-height: 1.6; margin: 1rem 0px 0.5rem; text-align: justify; white-space: pre-wrap;&quot;&gt;5. Continuous Monitoring&lt;/h3&gt;&lt;p style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 0px 0px 1.25em; text-align: justify; white-space: pre-wrap;&quot;&gt;We can run automated tests whenever possible and meaningful so tests should be run regularly on the production environment to ensure that the prod functioning correctly. Implementing automated monitoring and alerting mechanisms allows teams to detect and address issues in real-time. This proactive approach ensures the reliability of the software in production. Whenever there is an issue with the automated tests, monitoring helps the developer team to  &lt;/p&gt;&lt;h2 style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-headings); font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; line-height: 1.33333; margin: 2rem 0px 1rem; text-align: justify; white-space: pre-wrap;&quot;&gt;The Significance of Automated Testing in CI/CD&lt;/h2&gt;&lt;h3 style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-headings); font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 1.25em; line-height: 1.6; margin: 1rem 0px 0.5rem; text-align: justify; white-space: pre-wrap;&quot;&gt;1. Rapid Feedback Loop&lt;/h3&gt;&lt;p style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 0px 0px 1.25em; text-align: justify; white-space: pre-wrap;&quot;&gt;Automated tests can be written to all levels so any failures in any levels can raise a red flag.  Automated testing ensures a quick and consistent feedback loop. With every code change, automated tests are executed, providing immediate feedback to developers. This accelerates the identification and resolution of bugs, fostering a culture of quick iteration and continuous improvement.&lt;/p&gt;&lt;h3 style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-headings); font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 1.25em; line-height: 1.6; margin: 1rem 0px 0.5rem; text-align: justify; white-space: pre-wrap;&quot;&gt;2. Ensuring Code Stability&lt;/h3&gt;&lt;p style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 0px 0px 1.25em; text-align: justify; white-space: pre-wrap;&quot;&gt;In a CI/CD pipeline, code moves through various stages, from development to testing to deployment. Automated testing guarantees that only stable and thoroughly tested code progresses through these stages, minimizing the likelihood of introducing defects into production environments.&lt;/p&gt;&lt;h3 style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-headings); font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 1.25em; line-height: 1.6; margin: 1rem 0px 0.5rem; text-align: justify; white-space: pre-wrap;&quot;&gt;3. Faster Time to Market&lt;/h3&gt;&lt;p style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 0px 0px 1.25em; text-align: justify; white-space: pre-wrap;&quot;&gt;By automating testing processes, organizations can significantly reduce the time required for manual testing. This results in faster and more frequent releases, allowing businesses to respond swiftly to market demands and gain a competitive edge. In today&#39;s agile world, we want to deliver small and frequently so there are always packages waiting to be delivered. Each package passes through an automated development process, with appropriate automated tests. These tests make sure that the deliverable is good enough for the production.&lt;/p&gt;&lt;h3 style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-headings); font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 1.25em; line-height: 1.6; margin: 1rem 0px 0.5rem; text-align: justify; white-space: pre-wrap;&quot;&gt;4. Cost-Efficiency&lt;/h3&gt;&lt;p style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 0px 0px 1.25em; text-align: justify; white-space: pre-wrap;&quot;&gt;Automated testing contributes to cost reduction by decreasing the need for manual testing efforts and minimizing the chances of post-deployment issues. The up-front investment in automated testing tools and infrastructure is outweighed by the long-term benefits of increased efficiency and reduced operational costs.&lt;/p&gt;&lt;h3 style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-headings); font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 1.25em; line-height: 1.6; margin: 1rem 0px 0.5rem; text-align: justify; white-space: pre-wrap;&quot;&gt;5. Comprehensive Test Coverage&lt;/h3&gt;&lt;p style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 0px 0px 1.25em; text-align: justify; white-space: pre-wrap;&quot;&gt;Automated testing enables the creation and execution of a comprehensive suite of tests, including unit tests, integration tests, and end-to-end tests. This ensures that the entire application is thoroughly examined, enhancing the overall quality of the software.&lt;/p&gt;&lt;h2 style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-headings); font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; line-height: 1.33333; margin: 2rem 0px 1rem; text-align: justify; white-space: pre-wrap;&quot;&gt;Challenges and Best Practices&lt;/h2&gt;&lt;h3 style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-headings); font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 1.25em; line-height: 1.6; margin: 1rem 0px 0.5rem; text-align: justify; white-space: pre-wrap;&quot;&gt;1. Test Data Management&lt;/h3&gt;&lt;p style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 0px 0px 1.25em; text-align: justify; white-space: pre-wrap;&quot;&gt;Managing test data is a common challenge in automated testing. Implementing strategies for generating and maintaining realistic test data is essential for accurate testing scenarios.&lt;/p&gt;&lt;h3 style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-headings); font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 1.25em; line-height: 1.6; margin: 1rem 0px 0.5rem; text-align: justify; white-space: pre-wrap;&quot;&gt;2. Test Script Maintenance&lt;/h3&gt;&lt;p style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 0px 0px 1.25em; text-align: justify; white-space: pre-wrap;&quot;&gt;As the application evolves, test scripts may require updates. Regularly reviewing and updating automated test scripts ensures their relevance and effectiveness.&lt;/p&gt;&lt;h3 style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-headings); font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 1.25em; line-height: 1.6; margin: 1rem 0px 0.5rem; text-align: justify; white-space: pre-wrap;&quot;&gt;3. Parallel Execution&lt;/h3&gt;&lt;p style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 0px 0px 1.25em; text-align: justify; white-space: pre-wrap;&quot;&gt;To expedite testing, executing tests in parallel is a best practice. This requires scalable testing infrastructure and tools that support parallel test execution.&lt;/p&gt;&lt;h3 style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-headings); font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 1.25em; line-height: 1.6; margin: 1rem 0px 0.5rem; text-align: justify; white-space: pre-wrap;&quot;&gt;4. Collaboration Between Teams&lt;/h3&gt;&lt;p style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 0px 0px 1.25em; text-align: justify; white-space: pre-wrap;&quot;&gt;Collaboration between development, testing, and operations teams is crucial for the success of automated testing in a CI/CD pipeline. Clear communication and shared responsibilities foster a collaborative culture.&lt;/p&gt;&lt;h2 style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-headings); font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; line-height: 1.33333; margin: 2rem 0px 1rem; text-align: justify; white-space: pre-wrap;&quot;&gt;Conclusion&lt;/h2&gt;&lt;p style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 0px; text-align: justify; white-space: pre-wrap;&quot;&gt;In the era of DevOps, where speed and reliability are paramount, automated testing stands as a linchpin in the CI/CD process. By providing rapid feedback, ensuring code stability, and enabling faster time to market, automated testing contributes significantly to the success of DevOps initiatives. Organizations that embrace automated testing as an integral part of their CI/CD pipeline are better positioned to deliver high-quality software at an accelerated pace, meeting the demands of today&#39;s dynamic business landscape. As technology continues to advance, the role of automated testing in DevOps will only become more critical, shaping the future of software development and delivery.&lt;/p&gt;&lt;p style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 0px; text-align: justify; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 0px; text-align: justify; white-space: pre-wrap;&quot;&gt;image from &lt;a href=&quot;https://globalittrainers.com/course/devops/#component=course&quot; target=&quot;_blank&quot;&gt;globalittrainers&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Mesut Güneş&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/7225533790823878855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/7225533790823878855'/><link rel='alternate' type='text/html' href='http://www.testrisk.com/2023/11/enhancing-devops-efficiency-crucial.html' title='Enhancing DevOps Efficiency: The Crucial Role of Automated Testing in CI/CD'/><author><name>Mesut Güneş</name><uri>http://www.blogger.com/profile/06466018199442112635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhksmGlHvp6B2fPh5-Ci5g2Ek3nRvfSdq2utvdyhnryXZklRvpFlzP3eIBz3y293tW1q2N1RoPfPSvGGcAydIDlFj2h39vGzq85o7GRl3wG1Q2ez99aSFJE9AdZT8DAQ80/s220/10371365_778508612195086_5198865414746812917_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEhfho7lLG4yI7SdJFlIwheoYioOfHRn0OBq_u_OzTMoJv_5F_otFvfmplUof86jJfiGhl6jozIe-87ZIhu_ZUbKubbmbVKF7ozi48mdsJZnAPpaRBmIkafQJChFy343ID4l7EGEOmUafhHLb8r_D0j88xBPDFIRkF8WMTChHxAbKdb18ANIHyLmsrdwmfM=s72-w640-h304-c" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-8264657588618504333.post-158528605541441614</id><published>2023-11-05T02:02:00.001-08:00</published><updated>2024-07-02T10:52:05.663-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="challenges"/><category scheme="http://www.blogger.com/atom/ns#" term="contract testing"/><category scheme="http://www.blogger.com/atom/ns#" term="integration testing"/><category scheme="http://www.blogger.com/atom/ns#" term="software testing"/><title type='text'>What the Fact with Integration Testing </title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Integration testing, a crucial phase in the software development life cycle, plays a pivotal role in ensuring that individual components of a system work seamlessly when combined. Other than the unit tests in the unit level, every thing in the software development process is a kind of integration the pieces. This can be &amp;nbsp;integration-in-small like integration of the components or it cane integration-in-big such as integration of services/APIs. &amp;nbsp;While integration testing is essential, it is not without its challenges. In this blog post, we&#39;ll explore the issues of speed, reliability, and maintenance that often plague integration testing processes.&lt;/div&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgndlPmfg2pEXB1QCiT3H1v2v0822jYH3blpK95rs1MgmbMNAi-DBk1RxXirxOPtJXsELtP_H4dF1yOPpehhiBvUyvMkKGqwokSglUbG8nHFHt_KHunV7Ep-dDVdLh0N9k27UApiCL4cOq5vqnQBNMLsW6-CNqU8KN03Efe7hOk6J1QocIDa7mw04qbjdU/s3075/Flowchart%20-%20Integration%20Testing%20In%20Big.jpg&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1300&quot; data-original-width=&quot;3075&quot; height=&quot;270&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgndlPmfg2pEXB1QCiT3H1v2v0822jYH3blpK95rs1MgmbMNAi-DBk1RxXirxOPtJXsELtP_H4dF1yOPpehhiBvUyvMkKGqwokSglUbG8nHFHt_KHunV7Ep-dDVdLh0N9k27UApiCL4cOq5vqnQBNMLsW6-CNqU8KN03Efe7hOk6J1QocIDa7mw04qbjdU/w640-h270/Flowchart%20-%20Integration%20Testing%20In%20Big.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Integration-in-Big&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 style=&quot;text-align: justify;&quot;&gt;1. Speed&lt;/h3&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Integration testing involves testing the interactions between different components of a system. As the complexity of the software grows, so does the number of interactions that need to be tested. This increase in interactions can significantly slow down the testing process. With modern applications becoming more intricate, the time taken for integration tests can become a bottleneck, hindering the overall development speed.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;Automating integration tests are slow and more expensive because:&lt;br /&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Dependent parts must be deployed to test environments&lt;/li&gt;&lt;li&gt;All part must have latest version&lt;/li&gt;&lt;li&gt;CI must run all previous tasks like&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Static checks&lt;/li&gt;&lt;li&gt;Unit tests&lt;/li&gt;&lt;li&gt;Reviews&lt;/li&gt;&lt;li&gt;Deployments&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;OK let&#39;s run the API Testing project&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;Solutions&lt;/b&gt;: Employ parallel testing; running tests concurrently can significantly reduce the time taken for integration testing.&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;Argument&lt;/b&gt;: This is OK to be able to reduce the time spent for the integration testing but that is the final step in the process we still need to perform all the necessary steps.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;Solution&lt;/b&gt;: Prioritize tests; Identify critical integration points and focus testing efforts on these areas to ensure faster feedback on essential functionalities.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;Argument&lt;/b&gt;: Prioritization should be for any case but we must be careful not miss the necessary test cases. Reporting the issues found for the parts that are other than the essential parts will cause another problem about the overall quality. Also we still have to wait until all the process to be done to run the integration testing again.&lt;/div&gt;&lt;h3 style=&quot;text-align: justify;&quot;&gt;2. Reliability&lt;/h3&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;The reliability of integration tests is a common concern. Flaky tests, which produce inconsistent results, can erode the confidence in the testing process. Flakiness can stem from various sources such as external dependencies, race conditions, or improper test design. Unreliable tests can lead to false positives and negatives, making it challenging to identify genuine issues.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;Solution&lt;/b&gt;: Isolate tests; Minimize external dependencies and isolate integration tests to ensure they are self-contained and less susceptible to external factors.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;Argument&lt;/b&gt;: Dependencies are the required parts that should be also ready and integrated to the environments. We can reduce the dependencies by mocking but we still need to check the integration of that mocked part of the system.&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;Solution&lt;/b&gt;: Regular maintenance; Continuously update and refactor tests to ensure they remain reliable as the codebase evolves.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;Argument&lt;/b&gt;: The regular check should be done when ever there is a requirement update and failure of the tests. However we know that the integration testing is isolated from the business after the tests were created and for the most of the case, the integration testing project is driven by the QA team now. For the best case update will be done when the failures occur on the CI pipeline.&lt;/div&gt;&lt;h3 style=&quot;text-align: justify;&quot;&gt;3. Maintenance&lt;/h3&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Maintaining integration tests can be cumbersome, especially in agile environments where the codebase undergoes frequent changes. As the software evolves, integration points may shift, leading to outdated or irrelevant tests. Outdated tests can provide false assurance, leading to potential issues slipping through the cracks.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;Solution&lt;/b&gt;: Automation; automate the integration testing process as much as possible to quickly detect issues when new code is introduced.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;Argument&lt;/b&gt;: Automation is in the essence. We have to automate not only the tests but also the process. But the for the most case, integration testing process is not an integral part of the development process so this cause the decomposition. &amp;nbsp;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;Solution&lt;/b&gt;: Version control; Store test cases alongside the codebase in version control systems, ensuring that tests are updated alongside the code changes.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;Argument&lt;/b&gt;: Version control inside the integration project helps protecting main branch to be safe but the version of the code that aimed to be tested is not reconciled with the version of the code that is testing. This is not providing extra benefits for the overall quality.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;In conclusion, while integration testing is crucial for identifying issues that arise when different components interact, it is essential to be aware of and address the challenges related to speed, reliability, and maintenance. By employing the right strategies and tools, development teams can mitigate these challenges and ensure that integration testing remains effective, efficient, and reliable throughout the software development process. Because of these reasons, it is time to think about &quot;&lt;b&gt;contract testing&lt;/b&gt;&quot;.&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;Conclusion&lt;/span&gt;&lt;/h3&gt;&lt;div style=&quot;text-align: start;&quot;&gt;&lt;div&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Integration testing plays a vital role in uncovering issues that arise from component interactions, but it is crucial to address challenges related to speed, reliability, and maintenance. By implementing effective strategies and utilizing appropriate tools, development teams can overcome these obstacles and maintain the efficacy, efficiency, and reliability of integration testing throughout the software development lifecycle.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Although contract testing can significantly enhance the testing process, it is important to recognize that integration testing remains indispensable for large, intricate systems with complex component interactions. Integration testing serves as a crucial validation layer in such scenarios, ensuring the seamless functionality of the entire system. By integrating contract testing with traditional integration testing practices, development teams can achieve comprehensive testing coverage, enhancing the reliability and efficiency of their software systems.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Mesut Güneş&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/158528605541441614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/158528605541441614'/><link rel='alternate' type='text/html' href='http://www.testrisk.com/2023/11/what-fact-with-integration-testing.html' title='What the Fact with Integration Testing '/><author><name>Mesut Güneş</name><uri>http://www.blogger.com/profile/06466018199442112635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhksmGlHvp6B2fPh5-Ci5g2Ek3nRvfSdq2utvdyhnryXZklRvpFlzP3eIBz3y293tW1q2N1RoPfPSvGGcAydIDlFj2h39vGzq85o7GRl3wG1Q2ez99aSFJE9AdZT8DAQ80/s220/10371365_778508612195086_5198865414746812917_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgndlPmfg2pEXB1QCiT3H1v2v0822jYH3blpK95rs1MgmbMNAi-DBk1RxXirxOPtJXsELtP_H4dF1yOPpehhiBvUyvMkKGqwokSglUbG8nHFHt_KHunV7Ep-dDVdLh0N9k27UApiCL4cOq5vqnQBNMLsW6-CNqU8KN03Efe7hOk6J1QocIDa7mw04qbjdU/s72-w640-h270-c/Flowchart%20-%20Integration%20Testing%20In%20Big.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-8264657588618504333.post-572072749799480089</id><published>2023-02-08T12:15:00.005-08:00</published><updated>2024-07-02T10:52:17.512-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Automation"/><category scheme="http://www.blogger.com/atom/ns#" term="contract testing"/><category scheme="http://www.blogger.com/atom/ns#" term="integration"/><category scheme="http://www.blogger.com/atom/ns#" term="pact"/><title type='text'>Why Contract Testing Matters</title><content type='html'>&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;/p&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Integration testing has an important role in the test pyramid, it aims to test the integrations of the software products in the integration environments. This means that the software should be built and deployed to an integration test environment and then run the test against the version in the testing environment. If anything wrong occurs as a regression issue then the CI gives feedback about the failures. As a result, the issue should be fixed and built and deployed to the integration test environment. Therefore this process is very expensive and is so late for the modern approach to SDLC, for the shift-left approach. As a solution to this problem, we should consider testing the integration isolatedly within the context of the software itself. Contract testing is an approach to testing the integration depending on the written contract during the build phase. In this post, I want to explain the importance of contract testing.&lt;/div&gt;&lt;/span&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSCLK--cGAgYouYQVm1u-tOBtpizhtxNvP9LTOBGJZP-P0mDuZ83h16x2IS56igNciWzbPp_knS7DpAD3qdADQg3rx5hdIDE1NSZtVJ19nFBqGjIiAGB_CiiMDYNaPhcM0KYH0pJQ8xE10S6RlTTBRs9pgX0Y-NEUENXZy21TSaI5AkuQ6I1ZKxgDj/s763/contract-testing.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;485&quot; data-original-width=&quot;763&quot; height=&quot;203&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSCLK--cGAgYouYQVm1u-tOBtpizhtxNvP9LTOBGJZP-P0mDuZ83h16x2IS56igNciWzbPp_knS7DpAD3qdADQg3rx5hdIDE1NSZtVJ19nFBqGjIiAGB_CiiMDYNaPhcM0KYH0pJQ8xE10S6RlTTBRs9pgX0Y-NEUENXZy21TSaI5AkuQ6I1ZKxgDj/w320-h203/contract-testing.png&quot; width=&quot;320&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;What is Contract&lt;/span&gt;&lt;/h3&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;The contract is a document created by the consumers to list the required functionalities that are used by the consumers. Therefore, the consumer should create a contract for every change in the requirements then, it should be shared with the providers to follow the up-to-date contracts.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;What is Contract Testing&lt;/span&gt;&lt;/h3&gt;&lt;div&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;/p&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;Contract testing is testing the integrations of the applications in isolation so is complimentary to integration testing with some extra benefits. Contract testing has a very important role in the software development lifecycle as a good approach to making the integration testing shift left. The contract is a document created by the consumers to list the required functionalities that are used by the consumers. Therefore the contract should be created by the consumer for every change in the requirements then it should be shared with the providers to follow the up-to-date contracts.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;There is a misunderstanding about the contract test is rewriting the unit tests against a mock service. But in reality, it is not as simple as this definition since it is bi-directional and it checks the requirement as well as the implementation in build time. The following image also shows where is the contract test in the test matrix. The contract test is basically non-functional testing at the integration level. It is non-functional because we are not aiming to check logic or consumer flows, and also it is checking the integration of the services/APIs so it is an integration level testing.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: verdana; text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLAmReSeJ6UzidA3tckLQ0uqiT3-72B4CbyzXnIgVMpZmeQfFT7OstG4OJd7yfBuLXu6omClRktdrfGn2O01jTUA5T6Q6rqW92xfKHuLfUQArbZ6t-jccg-9jKyO80hLbmzI2uusvtM1IeCpKwPKknJNEwKMXShqJ8fFutlPOCyK5E4TPdhMKXVFz_/s1871/test-types-levels.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;705&quot; data-original-width=&quot;1871&quot; height=&quot;242&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLAmReSeJ6UzidA3tckLQ0uqiT3-72B4CbyzXnIgVMpZmeQfFT7OstG4OJd7yfBuLXu6omClRktdrfGn2O01jTUA5T6Q6rqW92xfKHuLfUQArbZ6t-jccg-9jKyO80hLbmzI2uusvtM1IeCpKwPKknJNEwKMXShqJ8fFutlPOCyK5E4TPdhMKXVFz_/w640-h242/test-types-levels.png&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;What is the Problem with Classical Integration Testing&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;An integration testing project is mostly a project that checks the integration of microservices/services/APIs with some libraries like rest-assured, requests, airbone, etc. Most of the time this project is contributed by the quality team by writing tests for each requirement as soon as the related requirements are turned into functionalities in the product. This is an asynchronous process which means development teams do their jobs and the quality team does their job separately. &lt;b&gt;This causes isolation instead of integration. &lt;/b&gt;This is not only done by doing the job but also by running and reporting the results of the tests.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;Everyone will be happy until there is a failure in the result of the integration test run. When an error is caught, a hero should be chosen and take responsibility and start investigating the issue. There might have already been changes in the requirement or there is an intermittent issue, so this is most of the time a time-consuming job. Also, there will be job failures until the issue is fixed which will reduce the reliability of the integration test.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;Basically, these are the problems of the integration testing:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;Flakiness&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;Data management for each MSs and APIs&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;Testing different MSs in the same test&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;Slow&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;Requires network&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;Data creation process&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;Network calls between MSs&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;Independent from Clients&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;Tests are not created by clients&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;Updates are not made by clients&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;Testing more general instead of the client&#39;s requirements&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Mesut Güneş&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/572072749799480089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/572072749799480089'/><link rel='alternate' type='text/html' href='http://www.testrisk.com/2023/02/why-contract-testing-matters.html' title='Why Contract Testing Matters'/><author><name>Mesut Güneş</name><uri>http://www.blogger.com/profile/06466018199442112635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhksmGlHvp6B2fPh5-Ci5g2Ek3nRvfSdq2utvdyhnryXZklRvpFlzP3eIBz3y293tW1q2N1RoPfPSvGGcAydIDlFj2h39vGzq85o7GRl3wG1Q2ez99aSFJE9AdZT8DAQ80/s220/10371365_778508612195086_5198865414746812917_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSCLK--cGAgYouYQVm1u-tOBtpizhtxNvP9LTOBGJZP-P0mDuZ83h16x2IS56igNciWzbPp_knS7DpAD3qdADQg3rx5hdIDE1NSZtVJ19nFBqGjIiAGB_CiiMDYNaPhcM0KYH0pJQ8xE10S6RlTTBRs9pgX0Y-NEUENXZy21TSaI5AkuQ6I1ZKxgDj/s72-w320-h203-c/contract-testing.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-8264657588618504333.post-1938588422275640790</id><published>2022-02-18T06:46:00.003-08:00</published><updated>2022-02-18T07:38:32.691-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="android"/><category scheme="http://www.blogger.com/atom/ns#" term="espresso"/><category scheme="http://www.blogger.com/atom/ns#" term="mobile testing"/><category scheme="http://www.blogger.com/atom/ns#" term="Test Automation"/><title type='text'>Implementation of Page-Object-Model (POM) to Espresso (Native Android Testing) with Kotlin</title><content type='html'>&lt;h3 style=&quot;text-align: left;&quot;&gt;What is Espresso&lt;/h3&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgEKwqyphLFeeFYCFZ2dBc_eAKuAAqTY1DVBL8KlUk_OJdzoYuuL5TGcE_EY-4P7JQ4Nw60F17v2mlwFnUenXWvGeDF5pQ9kz81yOOGe9Y-wHtRK6kjV_qMRAlANSsRRKMf7WwMURFucTOqgfUWQ-sM8_MXtdSw468ijFsnwmQAMv-NV6WEk4EyyTSk=s1268&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1268&quot; data-original-width=&quot;1101&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgEKwqyphLFeeFYCFZ2dBc_eAKuAAqTY1DVBL8KlUk_OJdzoYuuL5TGcE_EY-4P7JQ4Nw60F17v2mlwFnUenXWvGeDF5pQ9kz81yOOGe9Y-wHtRK6kjV_qMRAlANSsRRKMf7WwMURFucTOqgfUWQ-sM8_MXtdSw468ijFsnwmQAMv-NV6WEk4EyyTSk=w174-h200&quot; width=&quot;174&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Espresso is a native test automation tooling developed by Google for Android UI Tests. Espresso is open-source, very stable, and there are many frameworks that have been developed around Espresso. The&amp;nbsp;&lt;a href=&quot;http://developer.android.com/training/testing/ui-testing/espresso-testing.html&quot; target=&quot;_blank&quot;&gt;Espresso testing framework&lt;/a&gt;, provided by &lt;i&gt;the Android Testing Support Library&lt;/i&gt;, provides APIs for&lt;/div&gt;writing UI tests to simulate user interactions within a single target app.&amp;nbsp;&lt;div&gt;&lt;ul&gt;&lt;li&gt;It has a full feature-set of Junit that works with Espresso&lt;/li&gt;&lt;li&gt;Android Studio provides everything you need&lt;/li&gt;&lt;li&gt;It provides white-box testing&lt;/li&gt;&lt;li&gt;What Google says about it&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/bkamAJhXKNs_5Tx-yTV-w-z4mgTxXMvRG8wMCUsF9Hwagh3KficCBhIt3A1ogzrVxCiM7iD8R_CC06eA2FVFjjm_0AuPfQKlQv3l2nmY8G_yB-fyJxUyl-4lmIhC-E4AWjrR9l5DDjY=s400&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;114&quot; data-original-width=&quot;400&quot; height=&quot;114&quot; src=&quot;https://1.bp.blogspot.com/bkamAJhXKNs_5Tx-yTV-w-z4mgTxXMvRG8wMCUsF9Hwagh3KficCBhIt3A1ogzrVxCiM7iD8R_CC06eA2FVFjjm_0AuPfQKlQv3l2nmY8G_yB-fyJxUyl-4lmIhC-E4AWjrR9l5DDjY=w400-h114&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;
	&lt;/ul&gt;
&lt;/div&gt;
&lt;h4 style=&quot;text-align: justify;&quot;&gt;Page Object Model (POM)&lt;/h4&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;The main idea behind the Page Object Model (POM) design pattern, is to create an object repository for the pages in the application, which will then be used in the tests. In other words, instead of including the page elements and the test code together within the test, we separate them into 2 different entities: the pages and the test scenarios. Using this concept, each screen in the application will have a corresponding page class. The page classes will identify the elements in the page and contain methods that perform operations on these page elements.&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhfM3PEBfmRxx6Z18aWlNNeyoxIP3bhdsfiyoTVYsRSPeFrK7qei7GZJib2cS0XLs422FMqmimDne2zkDZX5DHe0KzSTafrLwOHzgWFuUDCn2eUGS3UTA6KE5rmxCYpSV9uT0I6aGYwiTMkOsMzTJXwNiPpAeftFr4x7fvUAPq0DNrkbgS4dw8ivOn3=s640&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Android - Espresso Page Object Model (POM)&quot; border=&quot;0&quot; data-original-height=&quot;400&quot; data-original-width=&quot;640&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhfM3PEBfmRxx6Z18aWlNNeyoxIP3bhdsfiyoTVYsRSPeFrK7qei7GZJib2cS0XLs422FMqmimDne2zkDZX5DHe0KzSTafrLwOHzgWFuUDCn2eUGS3UTA6KE5rmxCYpSV9uT0I6aGYwiTMkOsMzTJXwNiPpAeftFr4x7fvUAPq0DNrkbgS4dw8ivOn3=w640-h400&quot; title=&quot;Android - Espresso Page Object Model (POM)&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;This framework adopts the POM design pattern and is structured as follows:&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
	&lt;br /&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;&#39;Pages&#39; folder&lt;/b&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;Contains all Page object classes.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;These classes represent the actual screens of the application. A Page Object class will contain a series of objects, representing the application screen, and a series of methods, representing the features of that screen.&amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
	&lt;br /&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;&#39;Tests&#39; folder:&lt;/b&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;Contains all test classes or scripts.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;These classes define the user flow or end-to-end test scenario by referencing the page object class methods.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
	&lt;br /&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;&#39;Utilities&#39; folder:&lt;/b&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Contains helpers, extensions to the Espresso, and scripts.&amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;h4 style=&quot;text-align: justify;&quot;&gt;How to Write Tests&lt;/h4&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;All page object classes and tests will extend the &lt;i&gt;BasePage&lt;/i&gt; or &lt;i&gt;BaseTest&lt;/i&gt;, thus inheriting all the base methods. These classes contain common functionality for e.g. setting up the app,&amp;nbsp; terminating the sessions, or initializing page objects.&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
	&lt;br /&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;1. Create the &lt;i&gt;BaseScreen&lt;/i&gt;&lt;/div&gt;
&lt;script src=&quot;https://gist.github.com/gunesmes/6c59a4585d47e03b2aa76550424cdeb4.js&quot;&gt;&lt;/script&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;2. Create a Screen class named as DictionaryScreen by extending the &lt;i&gt;BaseScreen&lt;/i&gt;. Define UI elements via the app using the accessibility identifiers of the elements&lt;/div&gt;
&lt;script src=&quot;https://gist.github.com/gunesmes/87a9b5548c26276d0678c026fac9a355.js&quot;&gt;&lt;/script&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
	&lt;br /&gt;3. Create the &lt;i&gt;BaseTest. &lt;/i&gt;The&amp;nbsp;&lt;i&gt;BaseTest &lt;/i&gt;should handle all the basic things for launching, terminating the app also it should include creating basic test objects for writing tests.&lt;/div&gt;
&lt;script src=&quot;https://gist.github.com/gunesmes/325c00beefd8f04deb77b30eeed406f4.js&quot;&gt;&lt;/script&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
	&lt;br /&gt;4. Create a test class for the dictonary screen named as &lt;i&gt;DictionaryScreenTests&lt;/i&gt; by extending the &lt;i&gt;BaseTest&lt;/i&gt; and calling them for the test steps. Test setup should handle all the required actions&lt;/div&gt;
&lt;script src=&quot;https://gist.github.com/gunesmes/f094c077284d62f680fc2f7123235391.js&quot;&gt;&lt;/script&gt;
&lt;div&gt;
	&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;Do you want to run these tests in your local and have experience with Espresso for UI tests, Junit test for unit tests, and also overall Android app structure then you are good to go with my repo here: &lt;a href=&quot;https://github.com/gunesmes/testdictionary-android-app&quot; target=&quot;_blank&quot;&gt;testdictionary-android-app&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;Mesut Güneş&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/1938588422275640790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/1938588422275640790'/><link rel='alternate' type='text/html' href='http://www.testrisk.com/2022/02/implementation-of-page-object-model-pom_01177266742.html' title='Implementation of Page-Object-Model (POM) to Espresso (Native Android Testing) with Kotlin'/><author><name>Mesut Güneş</name><uri>http://www.blogger.com/profile/06466018199442112635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhksmGlHvp6B2fPh5-Ci5g2Ek3nRvfSdq2utvdyhnryXZklRvpFlzP3eIBz3y293tW1q2N1RoPfPSvGGcAydIDlFj2h39vGzq85o7GRl3wG1Q2ez99aSFJE9AdZT8DAQ80/s220/10371365_778508612195086_5198865414746812917_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEgEKwqyphLFeeFYCFZ2dBc_eAKuAAqTY1DVBL8KlUk_OJdzoYuuL5TGcE_EY-4P7JQ4Nw60F17v2mlwFnUenXWvGeDF5pQ9kz81yOOGe9Y-wHtRK6kjV_qMRAlANSsRRKMf7WwMURFucTOqgfUWQ-sM8_MXtdSw468ijFsnwmQAMv-NV6WEk4EyyTSk=s72-w174-h200-c" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-8264657588618504333.post-7610001543357793266</id><published>2022-02-07T22:51:00.003-08:00</published><updated>2022-02-08T00:34:23.650-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ios"/><category scheme="http://www.blogger.com/atom/ns#" term="mobile testing"/><category scheme="http://www.blogger.com/atom/ns#" term="page-object"/><category scheme="http://www.blogger.com/atom/ns#" term="pom"/><category scheme="http://www.blogger.com/atom/ns#" term="Test Automation"/><category scheme="http://www.blogger.com/atom/ns#" term="xcuitest"/><title type='text'>Implementation of Page-Object-Model (POM) to XCUITest (Native iOS Testing) with Swift</title><content type='html'>&lt;h3 style=&quot;text-align: left;&quot;&gt;What is XCUITest and XCTest&lt;/h3&gt;
&lt;div&gt;
	&lt;br /&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9xhQHMLzee5Vxxmp6JMhE9iMtkwAnSzPMbZlUpor8nKto_InAg08hRCv1hQOniFZHHA03IRs8PM0Tm1Q0TD4VM84SgzCrMqet1HIRsPUgmR8tDDMnS3RKOazRdxjjYfRb7tCAFHbhu5uRqxYrtJIeIMyxPYyPRSjEGOKmA461SZp8Z3XrsaIJ-hNG/s225/xcuitest.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;225&quot; data-original-width=&quot;225&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9xhQHMLzee5Vxxmp6JMhE9iMtkwAnSzPMbZlUpor8nKto_InAg08hRCv1hQOniFZHHA03IRs8PM0Tm1Q0TD4VM84SgzCrMqet1HIRsPUgmR8tDDMnS3RKOazRdxjjYfRb7tCAFHbhu5uRqxYrtJIeIMyxPYyPRSjEGOKmA461SZp8Z3XrsaIJ-hNG/w200-h200/xcuitest.jpeg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Xcode UI Testing is also known as &lt;a href=&quot;https://developer.apple.com/library/archive/documentation/DeveloperTools/Conceptual/testing_with_xcode/chapters/09-ui_testing.html&quot; rel=&quot;&quot; target=&quot;_blank&quot;&gt;XCUITest&lt;/a&gt;&amp;nbsp;is a huge expansion of the testing technology in the Apple&lt;br /&gt; platform apps like iOS.XCTest is a general testing framework, used for unit integration, network, or performance testing of Apple platform apps. With XCTest you can treat it as a xUnit type of test framework, which can be used for lower-level testing.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
	&lt;br /&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;The XCUITest framework is an extension of the XCTest framework but there are some basic differences between XCTest and XCUITest framework.&lt;/div&gt;
&lt;div&gt;
	&lt;ul style=&quot;text-align: left;&quot;&gt;
		&lt;li&gt;XCTest framework is a completely white-box framework where you can access the data and API in your main app.&lt;/li&gt;
		&lt;li&gt;XCUITest is completely black-box to your app, so you cannot access the data or API of your main app.&lt;/li&gt;
	&lt;/ul&gt;
&lt;/div&gt;
&lt;h4 style=&quot;text-align: justify;&quot;&gt;Page Object Model (POM)&lt;/h4&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;The main idea behind the Page Object Model (POM) design pattern, is to create an object repository for the pages in the application, which will then be used in the tests. In other words, instead of including the page elements and the test code together within the test, we separate them into 2 different entities: the pages and the test scenarios. Using this concept, each screen in the application will have a corresponding page class. The page classes will identify the elements in the page and contain methods that perform operations on these page elements.&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/qLXSltWSFmdvWqACxPD0uAHZvg8n_ZwXLLEsgs7jaZmMQK2vYq8AemvzxS9AacdzKQRjk37yVaUnAzP1vkSiRkigtRLjTi0R0hIg70SkUYYfJkqPhy_lMthToAKnq5w2DMS5AB9mizk=s640&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Page Object Model for XCUITest&quot; border=&quot;0&quot; data-original-height=&quot;400&quot; data-original-width=&quot;640&quot; height=&quot;400&quot; src=&quot;https://1.bp.blogspot.com/qLXSltWSFmdvWqACxPD0uAHZvg8n_ZwXLLEsgs7jaZmMQK2vYq8AemvzxS9AacdzKQRjk37yVaUnAzP1vkSiRkigtRLjTi0R0hIg70SkUYYfJkqPhy_lMthToAKnq5w2DMS5AB9mizk=w640-h400&quot; title=&quot;Page Object Model for XCUITest&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;This framework adopts the POM design pattern and is structured as follows:&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
	&lt;br /&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;&#39;Pages&#39; folder&lt;/b&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;Contains all Page object classes.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;These classes represent the actual screens of the application. A Page Object class will contain a series of objects, representing the application screen, and a series of methods, representing the features of that screen.&amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
	&lt;br /&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;&#39;Tests&#39; folder:&lt;/b&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;Contains all test classes or scripts.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;These classes define the user flow or end-to-end test scenario by referencing the page object class methods.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
	&lt;br /&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;&#39;Utilities&#39; folder:&lt;/b&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Contains helpers, extensions to the XCTUITest, scripts.&amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;h4 style=&quot;text-align: justify;&quot;&gt;How to Write Tests&lt;/h4&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;All page object classes and tests will extend the &lt;i&gt;BasePage&lt;/i&gt; or &lt;i&gt;BaseTest&lt;/i&gt;, thus inheriting all the base methods. These classes contain common functionality for e.g. setting up the app,&amp;nbsp; terminating the sessions, or initializing page objects.&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
	&lt;br /&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;1. Create the &lt;i&gt;BaseScreen&lt;/i&gt;&lt;/div&gt;
&lt;script src=&quot;https://gist.github.com/gunesmes/b4f0fb8bff2fd2cca7ede2b5f131f228.js&quot;&gt;&lt;/script&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;2. Create a Screen class named as HomeScreen by extending the &lt;i&gt;BaseScreen&lt;/i&gt;. Define UI elements via the app using the accessibility identifiers of the elements&lt;/div&gt;
&lt;script src=&quot;https://gist.github.com/gunesmes/5475c15a285e4eb665b2e2a126e6cbfb.js&quot;&gt;&lt;/script&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
	&lt;br /&gt;3. If the element doesn&#39;t have an accessibility element then find the relevant view and add the accessibility identifier for it. ex: `&lt;i&gt;homeText&lt;/i&gt;` that is used `&lt;i&gt;readmeMd&lt;/i&gt;`. This is an example of why XCUITest is not only a black-box solution. It enables us to modify source code for the sake of writing better-automated UI tests. This is one of the advantages over the non-native automation toolings.&lt;/div&gt;
&lt;script src=&quot;https://gist.github.com/gunesmes/8fc824dd22f1c16e691c1bf7abdce14b.js&quot;&gt;&lt;/script&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
	&lt;br /&gt;4. Create the &lt;i&gt;BaseTest. &lt;/i&gt;The&amp;nbsp;&lt;i&gt;BaseTest &lt;/i&gt;should handle all the basic things for launching, terminating the app also it should include creating basic test objects for writing tests.&lt;/div&gt;
&lt;script src=&quot;https://gist.github.com/gunesmes/1f4c787cdd3fd719d0812247d61a0ca4.js&quot;&gt;&lt;/script&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
	&lt;br /&gt;5. Create a test class for the screen by extending the &lt;i&gt;BaseTest&lt;/i&gt; and calling them for the test steps. Test setup should handle all the required actions&lt;/div&gt;
&lt;script src=&quot;https://gist.github.com/gunesmes/8fc824dd22f1c16e691c1bf7abdce14b.js&quot;&gt;&lt;/script&gt;
&lt;div&gt;
	&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;Do you want to run these tests in your local and have experience with XCUITest for UI tests, XCTest for unit tests, and also overall iOS app structure then you are ready to go with my repo here: &lt;a href=&quot;https://github.com/gunesmes/testdictionary-ios-app&quot; target=&quot;_blank&quot;&gt;testdictionary-ios-app&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;Mesut Güneş&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/7610001543357793266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/7610001543357793266'/><link rel='alternate' type='text/html' href='http://www.testrisk.com/2022/02/implementation-of-page-object-model-pom.html' title='Implementation of Page-Object-Model (POM) to XCUITest (Native iOS Testing) with Swift'/><author><name>Mesut Güneş</name><uri>http://www.blogger.com/profile/06466018199442112635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhksmGlHvp6B2fPh5-Ci5g2Ek3nRvfSdq2utvdyhnryXZklRvpFlzP3eIBz3y293tW1q2N1RoPfPSvGGcAydIDlFj2h39vGzq85o7GRl3wG1Q2ez99aSFJE9AdZT8DAQ80/s220/10371365_778508612195086_5198865414746812917_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9xhQHMLzee5Vxxmp6JMhE9iMtkwAnSzPMbZlUpor8nKto_InAg08hRCv1hQOniFZHHA03IRs8PM0Tm1Q0TD4VM84SgzCrMqet1HIRsPUgmR8tDDMnS3RKOazRdxjjYfRb7tCAFHbhu5uRqxYrtJIeIMyxPYyPRSjEGOKmA461SZp8Z3XrsaIJ-hNG/s72-w200-h200-c/xcuitest.jpeg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-8264657588618504333.post-7844720384747045779</id><published>2022-02-07T10:12:00.001-08:00</published><updated>2022-02-07T21:22:36.012-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="aws device farm"/><category scheme="http://www.blogger.com/atom/ns#" term="browserstack"/><category scheme="http://www.blogger.com/atom/ns#" term="cloud"/><category scheme="http://www.blogger.com/atom/ns#" term="firebase"/><category scheme="http://www.blogger.com/atom/ns#" term="mobile testing"/><category scheme="http://www.blogger.com/atom/ns#" term="saucelabs"/><category scheme="http://www.blogger.com/atom/ns#" term="test-cloud"/><category scheme="http://www.blogger.com/atom/ns#" term="xamarin"/><title type='text'>Testing Mobile Apps in the Cloud - Product Comparison</title><content type='html'>
&lt;meta content=&quot;width=device-width, initial-scale=1&quot; name=&quot;viewport&quot;&gt;&lt;/meta&gt;
&lt;style&gt;
table {
  border-collapse: collapse;
  border-spacing: 0;
  width: 100%;
  border: 1px solid #ddd;
}

th, td {
  text-align: left;
  padding: 8px;
}

tr:nth-child(even){background-color: #f2f2f2}
&lt;/style&gt;

&lt;p&gt;Cloud testing is raising, especially for mobile automated testing it is even going faster. Basically, cloud testing means that an application is installed on real devices or simulators/emulators that are hosted in one of the cloud testing services providers. These devices are maintained by the service providers and promise to be up and ready for service with a subscribed contract so no need to tackle these kinds of stuff for the sake of focusing on building the right product with well-tested features. In this post, I want to share some info about main mobile cloud solutions in the market.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;table&gt;
	&lt;tbody&gt;
		&lt;tr&gt;
			&lt;th data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;PRODUCT&amp;quot;}&quot;&gt;PRODUCT&lt;/th&gt;
			&lt;th data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;PRICE&amp;quot;}&quot;&gt;PRICE&lt;/th&gt;
			&lt;th data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;FEATURES&amp;quot;}&quot;&gt;SUPPORTED TOOLS&lt;/th&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;AWS Device Farm&amp;quot;}&quot;&gt;AWS Device Farm&lt;/td&gt;
			&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;Pay as you go \n $0.17 / DEVICE MINUTE\n Test on any of our devices in parallel and pay just for what you use\n Your first 1000 minutes are free* \n Unlimited testing \n STARTS AT $250.00 / MONTH\n Test as much as you want each month for a flat rate \n Private devices \n STARTS AT $200/MONTH\n Test on dedicated devices deployed exclusively for your account&amp;quot;}&quot;&gt;
				&lt;ul&gt;
					&lt;li&gt;Pay as you go&lt;/li&gt;
					&lt;ul&gt;
						&lt;li&gt;$0.17 / DEVICE MINUTE&lt;/li&gt;
						&lt;li&gt;Test on any of our devices in parallel and pay just for what you use&lt;/li&gt;
						&lt;li&gt;Your first 1000 minutes are free*&lt;/li&gt;
					&lt;/ul&gt;
					&lt;li&gt;&lt;span&gt;Unlimited testing&lt;/span&gt;&lt;/li&gt;
					&lt;ul&gt;
						&lt;li&gt;STARTS AT $250.00 / MONTH&lt;/li&gt;
						&lt;li&gt;Test as much as you want each month for a flat rate&lt;/li&gt;
					&lt;/ul&gt;
					&lt;li&gt;&lt;span&gt;Private devices&lt;/span&gt;&lt;/li&gt;
					&lt;ul&gt;
						&lt;li&gt;STARTS AT $200/MONTH&lt;/li&gt;
						&lt;li&gt;Test on dedicated devices deployed exclusively for your account&lt;/li&gt;
					&lt;/ul&gt;
				&lt;/ul&gt;
			&lt;/td&gt;
			&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;Appium \n Java (TestNG)\n Currently, Device Farm supports Java 8 for running Appium Java tests. Java (JUnit)\n Currently, Device Farm supports Java 8 for running Appium Java tests. Node.JS\n You can use any Node.js version when you run Appium Node.js tests on Device Farm. Specify the Node.js version in the test spec YAML file. Python\n In standard mode, Device Farm supports Python version 2.7 for running tests. In custom mode, both Python 2.7 and Python 3 (3.7) are available. Ruby\n You can use any Ruby version when you run Appium Ruby tests on Device Farm. Specify the Ruby version (for example, 2.5.1) in the test spec YAML file.\n Calabash\n Espresso\n XCUITest\n UI Automater&amp;quot;}&quot;&gt;
				&lt;ul&gt;
					&lt;li&gt;Appium&lt;/li&gt;
					&lt;ul&gt;
						&lt;li&gt;Java (TestNG)&lt;/li&gt;
						&lt;ul&gt;
							&lt;li&gt;Currently, Device Farm supports Java 8 for running Appium Java tests.&amp;nbsp;&lt;/li&gt;
						&lt;/ul&gt;
						&lt;li&gt;&lt;span&gt;Java (JUnit)&lt;/span&gt;&lt;/li&gt;
						&lt;ul&gt;
							&lt;li&gt;Currently, Device Farm supports Java 8 for running Appium Java tests.&amp;nbsp;&lt;/li&gt;
						&lt;/ul&gt;
						&lt;li&gt;&lt;span&gt;Node.JS&lt;/span&gt;&lt;/li&gt;
						&lt;ul&gt;
							&lt;li&gt;You can use any Node.js version when you run Appium Node.js tests on Device Farm. Specify the Node.js version in the test spec YAML file.&amp;nbsp;&lt;/li&gt;
						&lt;/ul&gt;
						&lt;li&gt;&lt;span&gt;Python&lt;/span&gt;&lt;/li&gt;
						&lt;ul&gt;
							&lt;li&gt;In standard mode, Device Farm supports Python version 2.7 for running tests. In custom mode, both Python 2.7 and Python 3 (3.7) are available.&amp;nbsp;&lt;/li&gt;
						&lt;/ul&gt;
						&lt;li&gt;&lt;span&gt;Ruby&lt;/span&gt;&lt;/li&gt;
						&lt;ul&gt;
							&lt;li&gt;You can use any Ruby version when you run Appium Ruby tests on Device Farm. Specify the Ruby version (for example, 2.5.1) in the test spec YAML file.&lt;/li&gt;
						&lt;/ul&gt;
					&lt;/ul&gt;
					&lt;li&gt;&lt;span&gt;Calabash&lt;/span&gt;&lt;/li&gt;
					&lt;li&gt;Espresso&lt;/li&gt;
					&lt;li&gt;XCUITest&lt;/li&gt;
					&lt;li&gt;UI Automater&lt;/li&gt;
				&lt;/ul&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;Firebase Test Lab&amp;quot;}&quot;&gt;Firebase Test Lab&lt;/td&gt;
			&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;Free \n pay as you go \n Virtual Device Tests $1/device/hour Physical Device Tests $5/device/hour \n \n \n   Virtual Device Tests 10 tests/day\n Physical Device Tests 5 tests/day&amp;quot;}&quot;&gt;
				&lt;ul&gt;
					&lt;li&gt;Free&lt;/li&gt;
					&lt;ul&gt;
						&lt;li&gt;Virtual Device Tests $1/device/hour&amp;nbsp;&lt;/li&gt;
						&lt;li&gt;Physical Device Tests $5/device/hour&lt;/li&gt;
					&lt;/ul&gt;
					&lt;li&gt;pay as you go&lt;/li&gt;
					&lt;ul&gt;
						&lt;li&gt;Virtual Device Tests 10 tests/day&lt;/li&gt;
						&lt;li&gt;Physical Device Tests 5 tests/day&lt;/li&gt;
					&lt;/ul&gt;
				&lt;/ul&gt;
			&lt;/td&gt;
			&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;Test Tools \n Espresso\n UI Automator 2.0 XCUITest&amp;quot;}&quot;&gt;
				&lt;ul&gt;
					&lt;li&gt;Test Tools&lt;/li&gt;
					&lt;ul&gt;
						&lt;li&gt;Espresso&lt;/li&gt;
						&lt;li&gt;UI Automator 2.0&amp;nbsp;&lt;/li&gt;
						&lt;li&gt;XCUITest&lt;/li&gt;
					&lt;/ul&gt;
				&lt;/ul&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;App Center / Visual Studio App Center&amp;quot;}&quot;&gt;App Center / Visual Studio App Center&lt;/td&gt;
			&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;30 days free trial \n \n \n   For 30 days, you will be able to test your app on more than 450 device configurations.\n With the trial, you can test your app on 1 test device concurrency with unlimited device hours. \n Run unlimited, faster builds \n Ship your app faster with multiple builds running in parallel.\n Each build you pay for comes with unlimited build time, ensuring all builds run and complete. \n $40/month\n per build concurrency \n Standard Test Plan \n Each device concurrency comes with 30 device hours.\n $99/month per device concurrency \n Enterprise Test Plan \n Unlimited test hours on thousands of real devices and OS configurations.\n Each device concurrency comes with unlimited device hours. \n $499/month per device concurrency&amp;quot;}&quot;&gt;
				&lt;ul&gt;
					&lt;li&gt;30 days free trial&lt;/li&gt;
					&lt;ul&gt;
						&lt;li&gt;For 30 days, you will be able to test your app on more than 450 device configurations.&lt;/li&gt;
						&lt;li&gt;With the trial, you can test your app on 1 test device concurrency with unlimited device hours.&lt;/li&gt;
					&lt;/ul&gt;
					&lt;li&gt;&lt;span&gt;Run unlimited, faster builds&lt;/span&gt;&lt;/li&gt;
					&lt;ul&gt;
						&lt;li&gt;Ship your app faster with multiple builds running in parallel.&lt;/li&gt;
						&lt;li&gt;Each build you pay for comes with unlimited build time, ensuring all builds run and complete.&lt;/li&gt;
						&lt;li&gt;$40/month per build concurrency&lt;/li&gt;
					&lt;/ul&gt;
					&lt;li&gt;&lt;span&gt;Standard Test Plan&lt;/span&gt;&lt;/li&gt;
					&lt;ul&gt;
						&lt;li&gt;Each device concurrency comes with 30 device hours.&lt;/li&gt;
						&lt;li&gt;$99/month per device concurrency&lt;/li&gt;
					&lt;/ul&gt;
					&lt;li&gt;&lt;span&gt;Enterprise Test Plan&lt;/span&gt;&lt;/li&gt;
					&lt;ul&gt;
						&lt;li&gt;Unlimited test hours on thousands of real devices and OS configurations.&lt;/li&gt;
						&lt;li&gt;Each device concurrency comes with unlimited device hours.&lt;/li&gt;
						&lt;li&gt;$499/month per device concurrency&lt;/li&gt;
					&lt;/ul&gt;
				&lt;/ul&gt;
			&lt;/td&gt;
			&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;Test Tools \n \n \n   Appium Espresso XCUITest Calabash&amp;quot;}&quot;&gt;
				&lt;ul&gt;
					&lt;li&gt;Test Tools&lt;/li&gt;
					&lt;ul&gt;
						&lt;li&gt;Appium&amp;nbsp;&lt;/li&gt;
						&lt;li&gt;Espresso&lt;/li&gt;
						&lt;li&gt;XCUITest&lt;/li&gt;
						&lt;li&gt;Calabash -&amp;nbsp;&lt;strong&gt;no support anymore&lt;/strong&gt;&lt;/li&gt;
					&lt;/ul&gt;
				&lt;/ul&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;Browserstack&amp;quot;}&quot;&gt;Browserstack&lt;/td&gt;
			&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;App Automate \n 199$ / month - 1 parallel 399$ / month - 2 parallel 999$ / month - 5 parallel \n Live Testing \n 29$ / month - 1 parallel 99$ / month - 2 parallel 199$ / month - 4 parallel&amp;quot;}&quot;&gt;
				&lt;ul&gt;
					&lt;li&gt;App Automate&lt;/li&gt;
					&lt;ul&gt;
						&lt;li&gt;199$ / month - 1 parallel&lt;/li&gt;
						&lt;li&gt;399$ / month - 2 parallel&lt;/li&gt;
						&lt;li&gt;999$ / month - 5 parallel&lt;/li&gt;
					&lt;/ul&gt;
					&lt;li&gt;&lt;span&gt;Live Testing&lt;/span&gt;&lt;/li&gt;
					&lt;ul&gt;
						&lt;li&gt;29$ / month - 1 parallel&amp;nbsp;&lt;/li&gt;
						&lt;li&gt;99$ / month - 2 parallel&amp;nbsp;&lt;/li&gt;
						&lt;li&gt;199$ / month - 4 parallel&lt;/li&gt;
					&lt;/ul&gt;
				&lt;/ul&gt;
			&lt;/td&gt;
			&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;Test Tools \n Appium Espresso XCUITest&amp;quot;}&quot;&gt;
				&lt;ul&gt;
					&lt;li&gt;Test Tools&lt;/li&gt;
					&lt;ul&gt;
						&lt;li&gt;Appium&amp;nbsp;&lt;/li&gt;
						&lt;li&gt;Espresso&amp;nbsp;&lt;/li&gt;
						&lt;li&gt;XCUITest&lt;/li&gt;
					&lt;/ul&gt;
				&lt;/ul&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;SauceLabs&amp;quot;}&quot;&gt;SauceLabs&lt;/td&gt;
			&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;App Automation \n 399$ / month - 2 parallel\n Unlimited automated testing minutes 799$ / month - 4 parallel\n Unlimited automated testing minutes \n Live Testing \n 49$ / month - ? parallel&amp;quot;}&quot;&gt;
				&lt;ul&gt;
					&lt;li&gt;App Automation&lt;/li&gt;
					&lt;ul&gt;
						&lt;li&gt;399$ / month - 2 parallel&lt;/li&gt;
						&lt;ul&gt;
							&lt;li&gt;Unlimited automated testing minutes&lt;/li&gt;
						&lt;/ul&gt;
						&lt;li&gt;&lt;span&gt;799$ / month - 4 parallel&lt;/span&gt;&lt;/li&gt;
						&lt;ul&gt;
							&lt;li&gt;Unlimited automated testing minutes&lt;/li&gt;
						&lt;/ul&gt;
					&lt;/ul&gt;
					&lt;li&gt;&lt;span&gt;Live Testing&lt;/span&gt;&lt;/li&gt;
					&lt;ul&gt;
						&lt;li&gt;49$ / month - ? parallel&lt;/li&gt;
					&lt;/ul&gt;
				&lt;/ul&gt;
			&lt;/td&gt;
			&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;Test Tools \n Appium Espresso XCUITest&amp;quot;}&quot;&gt;
				&lt;ul&gt;
					&lt;li&gt;Test Tools&lt;/li&gt;
					&lt;ul&gt;
						&lt;li&gt;Appium&amp;nbsp;&lt;/li&gt;
						&lt;li&gt;Espresso&amp;nbsp;&lt;/li&gt;
						&lt;li&gt;XCUITest&lt;/li&gt;
					&lt;/ul&gt;
				&lt;/ul&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;Kobiton&amp;quot;}&quot;&gt;Kobiton&lt;/td&gt;
			&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;App Automation \n 40$ / month - Unlimited parallel 500min /month\n 167$ / month - Unlimited parallel 2000min /month \n Live Testing \n Included&amp;quot;}&quot;&gt;
				&lt;ul&gt;
					&lt;li&gt;App Automation&lt;/li&gt;
					&lt;ul&gt;
						&lt;li&gt;40$ / month&amp;nbsp;&lt;/li&gt;
						&lt;ul&gt;
							&lt;li&gt;Unlimited parallel&amp;nbsp;&lt;/li&gt;
							&lt;li&gt;500min /month&lt;/li&gt;
						&lt;/ul&gt;
						&lt;li&gt;167$ / month&amp;nbsp;&lt;/li&gt;
						&lt;ul&gt;
							&lt;li&gt;Unlimited parallel&amp;nbsp;&lt;/li&gt;
							&lt;li&gt;2000min /month&lt;/li&gt;
						&lt;/ul&gt;
					&lt;/ul&gt;
					&lt;li&gt;&lt;span&gt;Live Testing&lt;/span&gt;&lt;/li&gt;
					&lt;ul&gt;
						&lt;li&gt;Included&lt;/li&gt;
					&lt;/ul&gt;
				&lt;/ul&gt;
			&lt;/td&gt;
			&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;Test Tools \n Appium\n Espresso\n XCUITest\n Scriptless automation&amp;quot;}&quot;&gt;
				&lt;ul&gt;
					&lt;li&gt;Test Tools&lt;/li&gt;
					&lt;ul&gt;
						&lt;li&gt;Appium&amp;nbsp;&lt;/li&gt;
						&lt;li&gt;Espresso&amp;nbsp;&lt;/li&gt;
						&lt;li&gt;XCUITest&lt;/li&gt;
						&lt;li&gt;Scriptless automation&lt;/li&gt;
					&lt;/ul&gt;
				&lt;/ul&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

&lt;div&gt;
  &lt;p&gt;Let&#39;s look at the high-level to detail by mindmap picture&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjj0fbWmKYBcznjEamEF7yLnb76Wn4lv32UuBRw0V38dSKEwwRxoZmN-9xHzcm-7XBM9r9ufH3uuBZK7PTXqOVaICvWcFGGvgpRlHUbZjP3Wa4c2XzfOlwXuASgBUfKB6l5T3GAtXbcHwhIQcVhPmq7_zRgrr2cvhODIyIT-_W7ZnpCCh0TV3RQc-UZ=s2304&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1542&quot; data-original-width=&quot;2304&quot; height=&quot;428&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjj0fbWmKYBcznjEamEF7yLnb76Wn4lv32UuBRw0V38dSKEwwRxoZmN-9xHzcm-7XBM9r9ufH3uuBZK7PTXqOVaICvWcFGGvgpRlHUbZjP3Wa4c2XzfOlwXuASgBUfKB6l5T3GAtXbcHwhIQcVhPmq7_zRgrr2cvhODIyIT-_W7ZnpCCh0TV3RQc-UZ=w640-h428&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
    &lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Mesut Güneş&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/7844720384747045779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/7844720384747045779'/><link rel='alternate' type='text/html' href='http://www.testrisk.com/2022/02/testing-mobile-apps-in-cloud-product.html' title='Testing Mobile Apps in the Cloud - Product Comparison'/><author><name>Mesut Güneş</name><uri>http://www.blogger.com/profile/06466018199442112635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhksmGlHvp6B2fPh5-Ci5g2Ek3nRvfSdq2utvdyhnryXZklRvpFlzP3eIBz3y293tW1q2N1RoPfPSvGGcAydIDlFj2h39vGzq85o7GRl3wG1Q2ez99aSFJE9AdZT8DAQ80/s220/10371365_778508612195086_5198865414746812917_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEjj0fbWmKYBcznjEamEF7yLnb76Wn4lv32UuBRw0V38dSKEwwRxoZmN-9xHzcm-7XBM9r9ufH3uuBZK7PTXqOVaICvWcFGGvgpRlHUbZjP3Wa4c2XzfOlwXuASgBUfKB6l5T3GAtXbcHwhIQcVhPmq7_zRgrr2cvhODIyIT-_W7ZnpCCh0TV3RQc-UZ=s72-w640-h428-c" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-8264657588618504333.post-6605472204096050425</id><published>2022-01-21T03:32:00.006-08:00</published><updated>2022-01-21T03:32:34.145-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="bitrise"/><category scheme="http://www.blogger.com/atom/ns#" term="browserstack"/><category scheme="http://www.blogger.com/atom/ns#" term="CD"/><category scheme="http://www.blogger.com/atom/ns#" term="CI"/><category scheme="http://www.blogger.com/atom/ns#" term="devops"/><category scheme="http://www.blogger.com/atom/ns#" term="ios"/><category scheme="http://www.blogger.com/atom/ns#" term="mobil test otomasyonu"/><category scheme="http://www.blogger.com/atom/ns#" term="mobile testing"/><category scheme="http://www.blogger.com/atom/ns#" term="xcuitest"/><title type='text'>Bitrise integrate Browserstack to Run XCUITest</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiuG7mIPKQ97ilFMPPsYcP-q5MqJ-FI7lL1uGqoBQXXLs2ZuIK4DeKwnGARbudGMV0CCu21kTr4u4aGjYhGeMe5idSSEGGKmKgqCIM0yyiEcBpq1WPuzMvj_CzVm06GXjdOlZ1Zm5RcVxi8Nliqz-ZkyiX6RHFsO4xVVtBrDtuS5qjuAooe-Jl0aywA=s225&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;225&quot; data-original-width=&quot;225&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiuG7mIPKQ97ilFMPPsYcP-q5MqJ-FI7lL1uGqoBQXXLs2ZuIK4DeKwnGARbudGMV0CCu21kTr4u4aGjYhGeMe5idSSEGGKmKgqCIM0yyiEcBpq1WPuzMvj_CzVm06GXjdOlZ1Zm5RcVxi8Nliqz-ZkyiX6RHFsO4xVVtBrDtuS5qjuAooe-Jl0aywA=w200-h200&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Bitrise is one of the best solutions for mobile application development. It gives us many mobile app-related steps to create CI/CD (continuous integration / continuous deployment) pipelines (or workflows as in the Bitrise).  Around the mobile application development ecosystem, we have many cloud solutions to make quick and reliable development processes. Browserstack is also one of them, it is widely used in web development and testing but also it also has nice features like &#39;App Live&#39; and &#39;App Automate&#39; for mobile app testing.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;In this post, I want to share how we can integrate Browserstack to Bitrise to run XCUITest.&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Run XCUITest on Browserstack via Bitrise&lt;/h2&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;If you want to run XCUITest on a real device then you must build the for generic iOS devices. Building for generic iOS devices requires provisioning so you should ensure that you added the provisioning step to the workflow. Also to be able to run an iOS build on a real device, the device should be registered to the Apple console. This is required by Apple security concerns. However, device farms Firebase Test Lab and Browserstack handle this issue, so no need to be concerned about the limit of registered devices.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEg71M4vf6n54LKlHIOgy_Y95P0kXOBd0PVu8wqr0LwXVRhm_WI5CDfVi39jrb4fXp3fmAryMB27_SVoId8lFvOpjiJxM4MsvULEe1O9deWdUFRXQOXMCrLV2HtMASAtgdo2ehiWux8ktdv7rD2n82h97P-ht0z_NErWmWohN6oSP8glWxd8LGWvy2tB=s1233&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;692&quot; data-original-width=&quot;1233&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEg71M4vf6n54LKlHIOgy_Y95P0kXOBd0PVu8wqr0LwXVRhm_WI5CDfVi39jrb4fXp3fmAryMB27_SVoId8lFvOpjiJxM4MsvULEe1O9deWdUFRXQOXMCrLV2HtMASAtgdo2ehiWux8ktdv7rD2n82h97P-ht0z_NErWmWohN6oSP8glWxd8LGWvy2tB=w640-h360&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In this example, we are using a script to handle all the staff for us. So it does the followings:&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;ol style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Create a .ipa file from the derived artifact&lt;/li&gt;&lt;li&gt;ZIP the test file - UITests-Runner.app to&amp;nbsp;UITests-Runner.zip&lt;/li&gt;&lt;li&gt;Upload the app - .ipa created at Step-1&lt;/li&gt;&lt;li&gt;Upload the test file - .zip file created at Step-2&lt;/li&gt;&lt;li&gt;Trigger test with uploaded files and desired devices and test options&lt;/li&gt;&lt;li&gt;Wait until tests to finish and evaluate the result&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;For the script, all the required files are created by the step &quot;Xcode Build for testing for iOS&quot; so this step be set up correctly. We are using file under &quot;$BITRISE_TEST_DIR_PATH&quot;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEirOskrY9T1vONjD3OcDwhdqCAieduVbid5vnhYhn0Yab6W25OKplkfVIcwIAsqg7k2rs9CmBEwQzfoUBl9fVDK9LyCYZE9osumBR9ycCYyzXTtetf6k77jHl012z1zVLD1SkV7EL4trGAYFAB2xu8fmyfmQog2b-4u9wf99mFzeEW7jjgQuv-zxzLT=s869&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;259&quot; data-original-width=&quot;869&quot; height=&quot;190&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEirOskrY9T1vONjD3OcDwhdqCAieduVbid5vnhYhn0Yab6W25OKplkfVIcwIAsqg7k2rs9CmBEwQzfoUBl9fVDK9LyCYZE9osumBR9ycCYyzXTtetf6k77jHl012z1zVLD1SkV7EL4trGAYFAB2xu8fmyfmQog2b-4u9wf99mFzeEW7jjgQuv-zxzLT=w640-h190&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;See the script to run XCUITest on Browserstack&lt;/div&gt;&lt;script src=&quot;https://gist.github.com/gunesmes/0e4e89f56562ac030048a3ce68005b69.js&quot;&gt;&lt;/script&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Mesut Güneş&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/6605472204096050425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/6605472204096050425'/><link rel='alternate' type='text/html' href='http://www.testrisk.com/2022/01/bitrise-integrate-browserstack-to-run_21.html' title='Bitrise integrate Browserstack to Run XCUITest'/><author><name>Mesut Güneş</name><uri>http://www.blogger.com/profile/06466018199442112635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhksmGlHvp6B2fPh5-Ci5g2Ek3nRvfSdq2utvdyhnryXZklRvpFlzP3eIBz3y293tW1q2N1RoPfPSvGGcAydIDlFj2h39vGzq85o7GRl3wG1Q2ez99aSFJE9AdZT8DAQ80/s220/10371365_778508612195086_5198865414746812917_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEiuG7mIPKQ97ilFMPPsYcP-q5MqJ-FI7lL1uGqoBQXXLs2ZuIK4DeKwnGARbudGMV0CCu21kTr4u4aGjYhGeMe5idSSEGGKmKgqCIM0yyiEcBpq1WPuzMvj_CzVm06GXjdOlZ1Zm5RcVxi8Nliqz-ZkyiX6RHFsO4xVVtBrDtuS5qjuAooe-Jl0aywA=s72-w200-h200-c" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-8264657588618504333.post-8828564592154544999</id><published>2022-01-21T03:20:00.002-08:00</published><updated>2022-01-21T03:35:44.827-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="android"/><category scheme="http://www.blogger.com/atom/ns#" term="bitrise"/><category scheme="http://www.blogger.com/atom/ns#" term="browserstack"/><category scheme="http://www.blogger.com/atom/ns#" term="CD"/><category scheme="http://www.blogger.com/atom/ns#" term="CI"/><category scheme="http://www.blogger.com/atom/ns#" term="devops"/><category scheme="http://www.blogger.com/atom/ns#" term="espresso"/><category scheme="http://www.blogger.com/atom/ns#" term="mobil test otomasyonu"/><category scheme="http://www.blogger.com/atom/ns#" term="mobile testing"/><title type='text'>Bitrise Integrate Browserstack to Run Espresso Tests</title><content type='html'>&lt;p&gt;&lt;span style=&quot;text-align: justify;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEh6IoJscdH6Zp7B8Lrc9-jUtukeFrxdU71QTvHTxSP69z1oNDalarIE8CKogozCz6UkzRml_7x_teHKMRrOMWdYdTWvaLXDMvX72UlvwZ4bxTCKKUOg0_bbWDKlT9BWnRqb7XvuDd4Bqcb90jzKTYsVUYelInDj0uMmjqTEAHVnYsL7UKHV_E7fWMfh=s1268&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1268&quot; data-original-width=&quot;1101&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEh6IoJscdH6Zp7B8Lrc9-jUtukeFrxdU71QTvHTxSP69z1oNDalarIE8CKogozCz6UkzRml_7x_teHKMRrOMWdYdTWvaLXDMvX72UlvwZ4bxTCKKUOg0_bbWDKlT9BWnRqb7XvuDd4Bqcb90jzKTYsVUYelInDj0uMmjqTEAHVnYsL7UKHV_E7fWMfh=w174-h200&quot; width=&quot;174&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Bitrise is one of the best solutions for mobile application development. It gives us many mobile app-related steps to create CI/CD (continuous integration / continuous deployment) pipelines (or workflows as in the Bitrise). Around the mobile application development ecosystem, we have many cloud solutions to make quick and reliable development processes. Browserstack is also one of them, it is widely used in web development and testing but also it also has nice features like &#39;App Live&#39; and &#39;App Automate&#39; for mobile app testing.&lt;p&gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;In this post, I want to share how we can integrate Browserstack to Bitrise to run Espresso by directly calling the Browserstack API.&lt;/div&gt;&lt;h2&gt;Run Espresso on Browserstack via Bitrise&lt;/h2&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;If you want to run Espresso tests on a real device then you must build the android project testing so we need to add the &#39;&lt;i&gt;Android Build for UI Testing&lt;/i&gt;&#39; step then add a script runner to run the Browserstack script. See the workflow:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhZKmOzxRk9HckMXgrJcOLQ80GSgrXHiTnUVuUoeKO0txAkV-YkwjK9uAyBi8mBbqh_3TsFVeEjHeIyJ-6Fll7j7DpTd0GiffVsRUa2e1Q3dH2RPgMcKdM_XJK_OXnztEuv9SqwXDqBmt4ubryw810QjxihSbhJQT_BZFUodOu9QMmCeKmC4qsbBE1d=s897&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;259&quot; data-original-width=&quot;897&quot; height=&quot;184&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhZKmOzxRk9HckMXgrJcOLQ80GSgrXHiTnUVuUoeKO0txAkV-YkwjK9uAyBi8mBbqh_3TsFVeEjHeIyJ-6Fll7j7DpTd0GiffVsRUa2e1Q3dH2RPgMcKdM_XJK_OXnztEuv9SqwXDqBmt4ubryw810QjxihSbhJQT_BZFUodOu9QMmCeKmC4qsbBE1d=w640-h184&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In this example, we are using a script to handle all the things required for running the Espresso tests on Browserstack. So it does the followings:&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Upload the app - debug.apk created by &quot;Build for Test&quot; step&lt;/li&gt;&lt;li&gt;Upload the app - debug-androidTest.apk created by &quot;Build for Test&quot; step&lt;/li&gt;&lt;li&gt;Trigger test with uploaded files and desired devices and test options&lt;/li&gt;&lt;li&gt;Wait until tests to finish and evaluate the result&lt;/li&gt;&lt;/ol&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;For the script, all the required files are created by the step &quot;&lt;i&gt;&lt;span style=&quot;text-align: justify;&quot;&gt;Android Build for UI Testing&lt;/span&gt;&quot;&lt;/i&gt; so this step be set up correctly. We are using files that are added as environment variables:&amp;nbsp;&lt;i&gt;BITRISE_APK_PATH&lt;/i&gt; and&amp;nbsp;&lt;i&gt;BITRISE_TEST_APK_PATH&lt;/i&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiLNq1o6zBrRew38TUSNNMkFYhCLGgMh6452n1ibu03C7klizXPit69Va5I5zESOHZXrxkac9OWFNg8YsAUDvqDSRaTWbyXCSgPu5wuY8xp0b_imROmra9D0r-bYXak5L5f8kj6RDGFMGPD5gUvExQYpZ-dEJI_A30rfHnndDMK9fgpq4x3NGZY4b1X=s871&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;220&quot; data-original-width=&quot;871&quot; height=&quot;162&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiLNq1o6zBrRew38TUSNNMkFYhCLGgMh6452n1ibu03C7klizXPit69Va5I5zESOHZXrxkac9OWFNg8YsAUDvqDSRaTWbyXCSgPu5wuY8xp0b_imROmra9D0r-bYXak5L5f8kj6RDGFMGPD5gUvExQYpZ-dEJI_A30rfHnndDMK9fgpq4x3NGZY4b1X=w640-h162&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;See the script to run the Espresso tests on Browserstack&lt;/div&gt;&lt;script src=&quot;https://gist.github.com/gunesmes/67e8873416abe7a1442c63292e7afcb7.js&quot;&gt;&lt;/script&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Mesut Güneş&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/8828564592154544999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/8828564592154544999'/><link rel='alternate' type='text/html' href='http://www.testrisk.com/2022/01/bitrise-integrate-browserstack-to-run.html' title='Bitrise Integrate Browserstack to Run Espresso Tests'/><author><name>Mesut Güneş</name><uri>http://www.blogger.com/profile/06466018199442112635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhksmGlHvp6B2fPh5-Ci5g2Ek3nRvfSdq2utvdyhnryXZklRvpFlzP3eIBz3y293tW1q2N1RoPfPSvGGcAydIDlFj2h39vGzq85o7GRl3wG1Q2ez99aSFJE9AdZT8DAQ80/s220/10371365_778508612195086_5198865414746812917_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEh6IoJscdH6Zp7B8Lrc9-jUtukeFrxdU71QTvHTxSP69z1oNDalarIE8CKogozCz6UkzRml_7x_teHKMRrOMWdYdTWvaLXDMvX72UlvwZ4bxTCKKUOg0_bbWDKlT9BWnRqb7XvuDd4Bqcb90jzKTYsVUYelInDj0uMmjqTEAHVnYsL7UKHV_E7fWMfh=s72-w174-h200-c" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-8264657588618504333.post-1474988965405052992</id><published>2021-11-22T08:43:00.001-08:00</published><updated>2022-01-21T03:43:02.307-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="android"/><category scheme="http://www.blogger.com/atom/ns#" term="Automation"/><category scheme="http://www.blogger.com/atom/ns#" term="benfits"/><category scheme="http://www.blogger.com/atom/ns#" term="espresso"/><category scheme="http://www.blogger.com/atom/ns#" term="ios"/><category scheme="http://www.blogger.com/atom/ns#" term="mobile testing"/><category scheme="http://www.blogger.com/atom/ns#" term="native automation tooling"/><category scheme="http://www.blogger.com/atom/ns#" term="xcuitest"/><title type='text'>Benefits of Using Native Mobile Automation Tooling: Espresso and XCUITest</title><content type='html'>&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;background-color: white; color: #1a2943; font-family: verdana; font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: white; color: #1a2943; font-family: verdana; font-size: 16px;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgkylH4JIUPjJ4NUNC0YBRHL_L4UncTrHH7pEP85-DNVFkeBb0DjjiK9xEqGWDyJ8CTU-D_SXlRAJlU4fwYSQK_9VNo7gpx_f0MmhjEheFGF-4K4QqiVv4gb0RJ14eH-6CJJpgo2r4Kml2CbYyoj6kuB5C1trrpDuWv2JY9sIddYsN1L-ILTm2Nvq3S=s225&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;225&quot; data-original-width=&quot;225&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgkylH4JIUPjJ4NUNC0YBRHL_L4UncTrHH7pEP85-DNVFkeBb0DjjiK9xEqGWDyJ8CTU-D_SXlRAJlU4fwYSQK_9VNo7gpx_f0MmhjEheFGF-4K4QqiVv4gb0RJ14eH-6CJJpgo2r4Kml2CbYyoj6kuB5C1trrpDuWv2JY9sIddYsN1L-ILTm2Nvq3S=w200-h200&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;background-color: white; color: #1a2943; font-family: verdana; font-size: 16px;&quot;&gt;&lt;br /&gt;Testing will be more efficient when testers and developers work in collaboration. Especially when it comes to automated testing, we have many challenging points that should be solved with the help of the other team members. This is a basic explanation of the cross-functional team. For mobile application automated end-to-end testing, this cross-functional team approach can be easily applied by contributing the same code base so native toolings give us this. This can increase the quality of the tests code and the framework by the feedback from the developers, and increase the quality of the tests by the feedback from the testers.&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;In this post, I want to give some idea about the benefits of using native mobile automation toolings such as Espresso and XCUITest.&lt;/span&gt;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;What is Native Tooling&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;&lt;span id=&quot;docs-internal-guid-46cf4730-7fff-231d-0530-a1567632fb21&quot;&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 3pt; text-align: justify;&quot;&gt;&lt;span style=&quot;clear: left; color: #434343; float: left; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; margin-bottom: 1em; margin-right: 1em; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;img height=&quot;146&quot; src=&quot;https://lh3.googleusercontent.com/jzVFk9ab0zczhAYRicYLJ2aGbJxc4PqqrxSRnqI6TcajgNiVZtTr1-QQt0vnJoH2lI6e86YH2NXs-SArsZxEmHHfGh7AYhMuTKGqvNmBlZLW5QrqPmXAwvAVVxiaVKiUsvI_GNGZWyo=w126-h146&quot; width=&quot;126&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span id=&quot;docs-internal-guid-faecbcf7-7fff-3868-332c-410547fda539&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;font-family: Verdana; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;&quot;&gt;Native mobile automation toolings are &lt;/span&gt;&lt;/span&gt;integrated libraries&lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; to the mobile application development framework so that &lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;developers can write UI tests&lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; for the products under development. &lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Native toolings are part of the &lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;development frameworks&lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; so it is always guaranteed&lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; that the tools are &lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;always up to date&lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; with the development frameworks and upcoming new features. Native toolings use the same development languages as the development frameworks so the contribution to tests and the application development would be similar approach and strategy. &lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 3pt; text-align: justify;&quot;&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 3pt; text-align: justify;&quot;&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Since we are talking about two major mobile device operating systems, we are just focusing on Android and iOS. &lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; white-space: pre-wrap;&quot;&gt;Native mobile automation toolings are&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 3pt; text-align: justify;&quot;&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;&quot;&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Android - &lt;/span&gt;&lt;span style=&quot;font-size: 12pt; white-space: pre-wrap;&quot;&gt;Espresso&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 16pt; margin-top: 0pt; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;iOS - &lt;/span&gt;&lt;span style=&quot;font-size: 12pt; white-space: pre-wrap;&quot;&gt;XCUITest &lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;color: #434343;&quot;&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;How Native Toolings Work&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;/span&gt;&lt;div&gt;&lt;span id=&quot;docs-internal-guid-8712e692-7fff-1d55-ca0a-20e2dbd9ddce&quot;&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 3pt;&quot;&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Native tools work natively, which means that they are providing direct methods via APIs that are done inside the development project globally.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Interactions are made by &lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;directly calling the UI objects&lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; inside project architecture by the APIs.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 16pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;So these are the &lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;main benefits&lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;:&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;&quot;&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 3pt;&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;APIs know the state of the objects&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;We are free to use tools as black-box as well as contribute the development code as white-box&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;We are free to reach the UI objects&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 3pt;&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;If the app is the Matrix, native tools are the agents &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; inside the matrix&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;color: #434343;&quot;&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;How Espresso Works&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;Espresso is a test automation tool &lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-align: justify; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;developed by Google&lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-align: justify; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; for Android UI Tests. Espresso is &lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-align: justify; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;open-source&lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-align: justify; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-align: justify; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;very stable,&lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-align: justify; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; and there are &lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-align: justify; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;many frameworks&lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-align: justify; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; have been developed around Espresso.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;span id=&quot;docs-internal-guid-f8a58162-7fff-5908-37e8-d8f21e85c026&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;ul style=&quot;margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px; text-align: left;&quot;&gt;&lt;li aria-level=&quot;1&quot; style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 3pt; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;It has a full feature-set of &lt;/span&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Junit&lt;/span&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; that works with Espresso&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level=&quot;1&quot; style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Android Studio&lt;/span&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; provides everything you need&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level=&quot;1&quot; style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 3pt; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;It provides white-box testing&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level=&quot;1&quot; style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 3pt; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;What Google says about it&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;img height=&quot;114&quot; src=&quot;https://lh3.googleusercontent.com/bkamAJhXKNs_5Tx-yTV-w-z4mgTxXMvRG8wMCUsF9Hwagh3KficCBhIt3A1ogzrVxCiM7iD8R_CC06eA2FVFjjm_0AuPfQKlQv3l2nmY8G_yB-fyJxUyl-4lmIhC-E4AWjrR9l5DDjY=w400-h114&quot; style=&quot;color: #434343; font-size: 12pt; text-align: justify; white-space: pre-wrap;&quot; width=&quot;400&quot; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;This is a basic implementation for Espresso. You can see source code, unit tests as well as UI tests. For more information about the implementation, please check &lt;a href=&quot;https://draft.blogger.com/#&quot;&gt;this project.&lt;/a&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span&gt;&lt;/span&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span id=&quot;docs-internal-guid-17c6d3d4-7fff-86d5-4f08-c2d70fb600fa&quot;&gt;&lt;img height=&quot;400&quot; src=&quot;https://lh3.googleusercontent.com/AcrceNJXnCQgoitrumUKsojWJGlsj6AIwjtouz98S3J0J8589xGgmfAULlEEB4q6aDE_6AixpHE_ByWxcLXbBJMdTNfuQjYrDZkoXi7nyYV29aRdrVV6Bl7popFgxrn2yIK3y6TjcsY=w640-h400&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;How XCUITests Works&lt;/span&gt;&lt;/h3&gt;&lt;div&gt;&lt;span id=&quot;docs-internal-guid-d013c476-7fff-6386-7213-22a2916b360a&quot;&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;XCUITest&lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; stands for &lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Xcode User Interface Testing &lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;and it is UI automation framework for &lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;iOS applications&lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;. XCUITest is developed on top of &lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;XCTest&lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; and &lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Accessibility&lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;. It is launched by &lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Apple in 2015&lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;. It supports all iOS functionality in terms of testing them by &lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;white-box&lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; testing techniques.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span id=&quot;docs-internal-guid-5d2c50d6-7fff-1b5f-6bd3-7d15dd19589a&quot;&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;&lt;br /&gt;&lt;ul style=&quot;margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;&quot;&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 3pt;&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;XCUITest &lt;/span&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;is native&lt;/span&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; and &lt;/span&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;inside the app source code&lt;/span&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; with different target&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;XCode&lt;/span&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; provides everything you need&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;It provides &lt;/span&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;white-box&lt;/span&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; testing&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;XCTest&lt;/span&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; provides everything you need for &lt;/span&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;testing capabilities&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Accessibility&lt;/span&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; provides &lt;/span&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;UI interaction&lt;/span&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; for all kinds of XCode product&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;This is a basic implementation for XCUITest. Again you can see source code, unit tests as well as UI tests. For more detail about the implementation please check &lt;a href=&quot;https://draft.blogger.com/#&quot;&gt;this project&lt;/a&gt;.&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;&lt;img height=&quot;400&quot; src=&quot;https://lh5.googleusercontent.com/qLXSltWSFmdvWqACxPD0uAHZvg8n_ZwXLLEsgs7jaZmMQK2vYq8AemvzxS9AacdzKQRjk37yVaUnAzP1vkSiRkigtRLjTi0R0hIg70SkUYYfJkqPhy_lMthToAKnq5w2DMS5AB9mizk=w640-h400&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;Benefits: Handling Objects&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;&lt;span id=&quot;docs-internal-guid-4ee3a401-7fff-4000-2132-bb0b40fcf8a7&quot;&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 3pt; text-align: justify;&quot;&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Native toolings are inside the projects so no need to worry about the use of external tool to get the related objects.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 16pt; margin-top: 0pt; text-align: justify;&quot;&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Espresso &lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;and &lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;XCUITest &lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;provides the following benefits&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 16pt; margin-top: 0pt;&quot;&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;APIs provide methods for &lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;all kinds of object&lt;/span&gt;&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;Methods are always &lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;up-to-date&lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; with the latest improvements/updates&lt;/span&gt;&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;Freely update the source code&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; for the sake of UI-test&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;Benefits: IDEs are Friendly&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;&lt;span style=&quot;color: #434343; font-family: verdana;&quot;&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;Android studio or the XCode comes with development experience so we use these experiences for the development of the test. Dependency management inside the projects IDEs allow us to write, run, debug the tests. Debugging for both android studio and XCode provides a great experience for real-time test writing. &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #434343; font-family: verdana;&quot;&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span id=&quot;docs-internal-guid-22fd1343-7fff-fdd7-1d0b-2fa5eef46a72&quot;&gt;&lt;img height=&quot;399&quot; src=&quot;https://lh5.googleusercontent.com/ysVNPsilJLXcCaNrQ1tUO0T9KNHo8hXlP5NsHjAGIH11TPlmNowffJ5xRpxqJc9c83pv0DL2DSkDLrdZ0ug_S3IDd5yOB29rm7Nh9r3zF2BwWPxqoPMjM8-E-zmeB76whXGbePDpoBo=w640-h399&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #434343; font-family: verdana;&quot;&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #434343; font-family: verdana;&quot;&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;color: #434343; font-family: verdana;&quot;&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;Benefits: Servers -- NO&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;&lt;span id=&quot;docs-internal-guid-04049af5-7fff-926d-4d1f-0a232de2f17b&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 3pt;&quot;&gt;&lt;span style=&quot;color: #434343; font-family: Verdana; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Performance is very important when you grow and have to handle hounderents tests. The main point for the performance is how much time your tests require for running them locally and in cloud services&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;ul style=&quot;margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;&quot;&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;color: #434343; font-family: Verdana; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 3pt;&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Simple UI frameworks interact with the objects so &lt;/span&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;no need to translate&lt;/span&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;with servers&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;color: #434343; font-family: Verdana; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Native tooling know the state of the elements so &lt;/span&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;no need to check them regularly&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;color: #434343; font-family: Verdana; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Automation code is inside the test package&lt;/span&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; so no need to handle it differently while testing on the cloud. This reduces the time drastically&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #434343; font-family: verdana;&quot;&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #434343; font-family: verdana;&quot;&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span id=&quot;docs-internal-guid-c324882f-7fff-4703-e1de-f14fda6879af&quot;&gt;&lt;span style=&quot;color: #434343; font-family: Verdana; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;A simple test to compare the performance of the tools shows that native toolings are always better than Appium. This was done by TestProject engineers,  so for more detail, please read &lt;a href=&quot;https://blog.testproject.io/2020/04/08/fastest-mobile-automation-testing-tool-appium-vs-xcuitest-vs-testproject-vs-uiautomator-vs-espresso/ &quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;this post&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span style=&quot;color: #434343; font-family: Verdana; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span style=&quot;color: #434343; font-family: Verdana; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;span id=&quot;docs-internal-guid-8dee9fed-7fff-a08e-c9ee-d9747b4f1edb&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img height=&quot;202&quot; src=&quot;https://lh5.googleusercontent.com/nVp8LMO7MITUEyfRKYFH1rnQBumEJ3lXDGyBfT_DtkRQoIDR6HApOgY9LlziCfDROS72Jw-OmpmzDw_p9YUoU0lzsWXL10YhfXlOlvlo6OjKf3wfzlCWRsODgne0cgmwQpFKAbLfTHQ=w400-h202&quot; width=&quot;400&quot; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;span id=&quot;docs-internal-guid-c1053c34-7fff-b4e2-934d-084d0bb449f8&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img height=&quot;202&quot; src=&quot;https://lh3.googleusercontent.com/7IreTE-e2y5iyk1wEguBAWNcZ5WLEt64r_Uh8z-eIUzhiPgJ9c5bK8it3CzxRjquE5wkUfePbsaFhChKokI_FrdPBbSb6AyMyWqt0PRY8vn1yd3YasdOUk_nCns-B8zSplMnCemDzWU=w400-h202&quot; width=&quot;400&quot; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;color: #434343; font-family: verdana;&quot;&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;Benefits: Team Building Around Quality&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;&lt;span id=&quot;docs-internal-guid-44ccc4ad-7fff-e823-b8e9-be7a2b17b004&quot;&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 3pt; text-align: justify;&quot;&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Better performance from an automation project can be only get when the developers and testers work cooperatively. Developers are always result-oriented people so they focus on the development of the features, but the QAs/SDETs must be keen on the quality. This quality not only the product quality but also the quality of the tests, process, and documentation. This can be achieved by cross-functional team building.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 3pt;&quot;&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Cross-functional-team requires the followings:&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;&quot;&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 3pt;&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Team spirit&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Shared &lt;/span&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;common knowledge&lt;/span&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;, every team member should know &lt;/span&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;basics&lt;/span&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; about&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;ul style=&quot;margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;&quot;&gt;&lt;li aria-level=&quot;2&quot; dir=&quot;ltr&quot; style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: circle; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;What is being built&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level=&quot;2&quot; dir=&quot;ltr&quot; style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: circle; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;How things are developed&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level=&quot;2&quot; dir=&quot;ltr&quot; style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: circle; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;How things are being tested&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;The absence of one person from a role can be filled by another role&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;ul style=&quot;margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;&quot;&gt;&lt;li aria-level=&quot;2&quot; dir=&quot;ltr&quot; style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: circle; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;QA/SDET can be a developer&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level=&quot;2&quot; dir=&quot;ltr&quot; style=&quot;color: #434343; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: circle; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Developer can be QA/SDET&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #434343; font-family: verdana;&quot;&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #434343; font-family: Verdana; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Mesut Güneş&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/1474988965405052992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/1474988965405052992'/><link rel='alternate' type='text/html' href='http://www.testrisk.com/2021/11/benefits-of-using-native-mobile.html' title='Benefits of Using Native Mobile Automation Tooling: Espresso and XCUITest'/><author><name>Mesut Güneş</name><uri>http://www.blogger.com/profile/06466018199442112635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhksmGlHvp6B2fPh5-Ci5g2Ek3nRvfSdq2utvdyhnryXZklRvpFlzP3eIBz3y293tW1q2N1RoPfPSvGGcAydIDlFj2h39vGzq85o7GRl3wG1Q2ez99aSFJE9AdZT8DAQ80/s220/10371365_778508612195086_5198865414746812917_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEgkylH4JIUPjJ4NUNC0YBRHL_L4UncTrHH7pEP85-DNVFkeBb0DjjiK9xEqGWDyJ8CTU-D_SXlRAJlU4fwYSQK_9VNo7gpx_f0MmhjEheFGF-4K4QqiVv4gb0RJ14eH-6CJJpgo2r4Kml2CbYyoj6kuB5C1trrpDuWv2JY9sIddYsN1L-ILTm2Nvq3S=s72-w200-h200-c" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-8264657588618504333.post-6451802245490903433</id><published>2020-06-23T08:15:00.002-07:00</published><updated>2020-06-29T00:04:00.702-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Automation"/><category scheme="http://www.blogger.com/atom/ns#" term="elasticsearch"/><category scheme="http://www.blogger.com/atom/ns#" term="espresso"/><category scheme="http://www.blogger.com/atom/ns#" term="firebase"/><category scheme="http://www.blogger.com/atom/ns#" term="gcloud"/><category scheme="http://www.blogger.com/atom/ns#" term="gsutil"/><category scheme="http://www.blogger.com/atom/ns#" term="kibana"/><category scheme="http://www.blogger.com/atom/ns#" term="monitoring"/><category scheme="http://www.blogger.com/atom/ns#" term="Test Automation"/><category scheme="http://www.blogger.com/atom/ns#" term="XCTest"/><category scheme="http://www.blogger.com/atom/ns#" term="XCTUITest"/><title type='text'>Centralized Monitoring System for Automated Tests with Elasticsearch and Kibana</title><content type='html'>In this post, I want to give you some practical information about a monitoring
system for automated tests. I will touch the following topics:&lt;br /&gt;
&lt;ul&gt;
  &lt;li&gt;Why we need a monitoring system for automated tests&lt;/li&gt;
  &lt;li&gt;What are the potential benefits of the monitoring system&lt;/li&gt;
  &lt;li&gt;A simple approach using the following technologies:&lt;/li&gt;
  &lt;ul&gt;
    &lt;li&gt;Elasticsearch&lt;/li&gt;
    &lt;li&gt;Kibana&lt;/li&gt;
    &lt;li&gt;Firebase test lab, gcloud and gsutil&lt;/li&gt;
    &lt;li&gt;XCTest and Espresso&lt;/li&gt;
  &lt;/ul&gt;
&lt;/ul&gt;
&lt;iframe allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/UgXxSy36Lvg&quot; width=&quot;600&quot;&gt;&lt;/iframe&gt;
&lt;h2&gt;
  What is the Centralization of Log Systems
&lt;/h2&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
  In a development pipeline, we have a variety of tools and technologies with
  different languages and scripts. CI/CD pipeline is a good place the see the
  process of the development, but to get the detail of an item in the pipeline,
  we need to get into that item and tackle with logs and data. Some times this
  investigation requires some capabilities to understand it. One of the easiest
  ways to get a common understanding from the logs in the pipeline is using one
  easy tool for the whole process. When we collect all the logs and data into
  one place then we can start debugging activity from here. Therefore the
  centralized log system means that all the logs and data related to the
  development pipeline should be stored in one place with a timestamp and/or
  tags for data separation.
&lt;/div&gt;
&lt;h2 style=&quot;text-align: justify;&quot;&gt;
  What are Automated Tests
&lt;/h2&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
  Any types at any testing level which are scripted and run over tools can be
  called as automated tests. Therefore, it is not aiming to one level just as
  a&amp;nbsp;&lt;i&gt;unit test &lt;/i&gt;or an&amp;nbsp;&lt;i&gt;integration&lt;/i&gt;&amp;nbsp;level testing and
  not also &lt;i&gt;functional &lt;/i&gt;or &lt;i&gt;non-functional &lt;/i&gt;tests, any tests that we
  can run on CI/CD pipeline could be considered in the fashion. Basically, the
  following test matrix shows the test types considering the test levels. As the
  test pyramid suggests that the more test in the low-level, the more reliable
  and fast automated tests we would get so staring from
  &lt;i&gt;the unit level&amp;nbsp;&lt;/i&gt;most of the tests could be automated and bonded to
  the monitoring system.
&lt;/div&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center;&quot;&gt;
        &lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWQuFSFI77oP88sh93ED_HV5vlM4uEfYvLOVMVyQHGPIB48WenEFc-E__ApBJFOk_7ESFKh5whXLxqrgD8Ib__XNMuC-hVhXB61LdPZYfG0Fdiawz1ZR502B0n3WhqV38mTfT5IyW6U3Y/s1600/test-levels-test-types.png&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;350&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWQuFSFI77oP88sh93ED_HV5vlM4uEfYvLOVMVyQHGPIB48WenEFc-E__ApBJFOk_7ESFKh5whXLxqrgD8Ib__XNMuC-hVhXB61LdPZYfG0Fdiawz1ZR502B0n3WhqV38mTfT5IyW6U3Y/s640/test-levels-test-types.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;
        &lt;span style=&quot;font-size: small; text-align: justify;&quot;&gt;The test types considering the test levels&lt;/span&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 style=&quot;text-align: justify;&quot;&gt;
  What Means the Monitoring System for Automated Tests
&lt;/h2&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
  As we can see from the testing types table, we have lots of testing types and
  each testing types have a great variety of tools with different language
  support. Each test type produces different kinds of output, such as XML, JSON,
  HTML, and so on, in a different environment so reaching these outputs and
  understanding them is a pretty hard and time-consuming task and it also
  requires credential management for each environment.&amp;nbsp;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
  &lt;br /&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
  The monitoring system for the automated test can collect the test results from
  the different environments as soon as the tests completed or during a test
  run. Then the data can be used to draw graphs, create tables, and some
  simulations. In this way, everyone can see the result of all the automated
  tests written for the product in realtime.
&lt;/div&gt;
&lt;h2 style=&quot;text-align: justify;&quot;&gt;
  Why We Need a Monitoring System For Automated Tests
&lt;/h2&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
  As defined in the previous section, collecting the logs and data into one
  common place makes it easier to work with these data. These data can be used
  for monitoring, debugging, reporting, alerting, and other purposes so
  important thing is collecting data and making them available for the whole
  team.&amp;nbsp;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
  &lt;br /&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
  The benefits of the monitoring system for automated tests can be summarized
  into the following topics:
&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
  1. Team Awareness
&lt;/h3&gt;
&lt;h4 style=&quot;text-align: justify;&quot;&gt;
  &lt;span style=&quot;font-weight: normal;&quot;&gt;If everything in a system is transparent, then the system itself shows what
    it is. There will no extra word to explain it. Every day the monitoring
    system shows the result of the tests run against the product and it
    highlights how much of them passed and failed. If there are two kinds of
    tests on the monitor and one has a red part, then there is no more word to
    explain that the red part test has a problem and it needs to be solved. This
    can create team awareness of the product to take any action about
    failure.&amp;nbsp;&lt;/span&gt;
&lt;/h4&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
  2. Contribution
&lt;/h3&gt;
&lt;div&gt;
  Anyone can write a test for any test type if he is willing to write. The
  monitoring system can be itself a self-explained system that you can easily
  see the separation between test types and products. If the number of unit
  tests written for the Android app is half of the number of the unit tests
  written for the iOS app then the team should take action to remove this
  gap.&amp;nbsp;&amp;nbsp;
&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
  3. Quality-Centric Development
&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
  Software development is a continuous effort so every commits adds something
  new on the product. If there is something wrong with one of the quality
  metrics then the related action should be taken to improve the related
  metric.&amp;nbsp;
&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
  4. Increased Number of the Automated Test
&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
  The stability in the results is good as far as the numbers of the tests go up.
  If the number of the test stay stable for every commit, we will get lower code
  coverage. Each new requires new automated tests and fixing defects also
  requires updating correctness of tests or adding some extra tests for edge
  cases. Monitoring these metrics, courage us to write more tests and make them
  passed.
&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
  5. Complete-Working Process - CI
&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
  In practice, sometimes, the CI process doesn&#39;t have tests, or these steps are
  somehow skipped. The main responsibility of the team is to develop a
  high-quality product. The meaning of the high-quality product depends on the
  requirement but there is only one way to understand the quality of the product
  is to check requirements, or other meaning testing it against to the
  requirements. The good news is that; if we can monitor the tests, we should
  have already implemented those tests to the CI.&amp;nbsp;
&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
  6. Easier Debugging
&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
  The best part of the centralized logging system, having a starting point for
  debugging errors, failures, exceptions. Logging not only results but also
  logging the deepest info of the failures and the exceptions make debugging
  easier.&amp;nbsp;
&lt;/div&gt;
&lt;h2&gt;
  What is Elasticsearch
&lt;/h2&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
  &lt;b&gt;Elasticsearch&lt;/b&gt; is the heart of the Elastic (ELK) Stack. Elasticsearch is
  an open-source search engine. It is built on Apache Lucene. It provides a
  Restful API. The first version of Elasticsearch was released in 2010, then it
  became the de facto search engine and it is commonly used for full-text
  search, business analytics, log analytics, security intelligence, and some of
  the operational intelligence.&amp;nbsp;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
  &lt;br /&gt;
&lt;/div&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center;&quot;&gt;
        &lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggaObF5a_x-oog_033ba_F0rEOGTPeZyBSBVP713sz70bl-j3M-e3_oZxrcqn14bOCn_rb82uRKWjKd3TOTX-Igbk9WOZA7fdMh3hn1XXfYJqbE8HJRcRGzgtcTJBt9tMa_i4W0PBDnjI/s1600/ELK-Stack.png&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;201&quot; data-original-width=&quot;748&quot; height=&quot;170&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggaObF5a_x-oog_033ba_F0rEOGTPeZyBSBVP713sz70bl-j3M-e3_oZxrcqn14bOCn_rb82uRKWjKd3TOTX-Igbk9WOZA7fdMh3hn1XXfYJqbE8HJRcRGzgtcTJBt9tMa_i4W0PBDnjI/s640/ELK-Stack.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Elastic Stack&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
  &lt;br /&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
  Elasticsearch is a full-text and distributed NoSQL database so it stores
  documents with indexing them instead of tables and schemes. We can send data
  in JSON format to the Elasticsearch database by Restful API or
  &lt;b&gt;Logstash&lt;/b&gt;, another tool for logs operations.&amp;nbsp;
&lt;/div&gt;
&lt;h2 style=&quot;text-align: justify;&quot;&gt;
  What is Kibana
&lt;/h2&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
  &lt;b&gt;Kibana&lt;/b&gt; is a product from ELK Stack. It is an open-source data
  virtualization tool that is designed to use Elasticsearch as a data source.
  Once you integrated Elasticsearch and Kibana and fed the Elasticsearch
  database with data then you use the Kibana.&amp;nbsp; Kibana has a user-friendly
  web user interface to create indexes, search, and dashboards. On the
  dashboard, you can add flexible chars, graphs, heat maps, histograms.
&lt;/div&gt;
&lt;h2 style=&quot;text-align: justify;&quot;&gt;
  Setting Up Elasticsearch and Kibana in Docker
&lt;/h2&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
  &lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEge21M1c0eUergTBg4AnRowmtYYfOFmzvX6GZkqAddr8ltz41pkTPM_ruEvUWO9h0nSYUuTlACdzfRvedcWH0n92KbjF_28IIUBa6XOn_oYyhe3haqtycsbHkbDoelOmIyz25OTp9VaA0c/s1600/elasticsearch-running-local.png&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;686&quot; data-original-width=&quot;1010&quot; height=&quot;135&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEge21M1c0eUergTBg4AnRowmtYYfOFmzvX6GZkqAddr8ltz41pkTPM_ruEvUWO9h0nSYUuTlACdzfRvedcWH0n92KbjF_28IIUBa6XOn_oYyhe3haqtycsbHkbDoelOmIyz25OTp9VaA0c/s200/elasticsearch-running-local.png&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;Containers make everything easier, we can run Elasticsearch and Kibana easily with a docker-compose.yaml. Basically, I am using the docker images provided
  by Elastic company officially with the version of 6.6.0 for both Elasticsearch
  and Kibana. Then it runs the Elasticsearch on port 9200 and the Kibana on port
  5601. Therefore after the &lt;i&gt;docker-compose up&lt;/i&gt; command, you can navigate
  to&amp;nbsp;&lt;a href=&quot;http://localhost:9200/&quot;&gt;http://localhost:9200&lt;/a&gt;&amp;nbsp;for
  Elasticsearch and&amp;nbsp;&lt;a href=&quot;http://localhost:9200/&quot;&gt;http://localhost:5601&lt;/a&gt;&amp;nbsp;for Kibana.
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
  &lt;script src=&quot;https://gist.github.com/gunesmes/e5fe1213594a90d403a3f7fd39cfa408.js&quot;&gt;&lt;/script&gt;

  &lt;br /&gt;
  &lt;h2&gt;
    Export Data from Firebase to Elasticsearch
  &lt;/h2&gt;
  &lt;div&gt;
    I mentioned above, to feed the Elasticsearch database Logstash is used for
    most generic architecture. However, in this post, we want to integrate
    mobile application testing in the cloud. We use Firebase as a cloud mobile
    testing provider.&amp;nbsp; Firebase provides &lt;i&gt;test labs&lt;/i&gt;&amp;nbsp;to run
    mobile application testing. For mobile application testing we have
    implemented tests with native tools so for Android testing, we will use
    Espresso and for iOS testing, we will use XCTest.&lt;br /&gt;
    &lt;br /&gt;
  &lt;/div&gt;
  &lt;div&gt;
    &lt;script src=&quot;https://gist.github.com/gunesmes/c1604bfaafca6f8c56fee23bc2f477a6.js&quot;&gt;&lt;/script&gt;

    To be able to export data from Firebase to Elasticsearch we need to follow
    these steps:&lt;br /&gt;
    &lt;ol&gt;
      &lt;li&gt;
        Run mobile tests with auto-generated UUID by using GCLOUD cli&amp;nbsp;
      &lt;/li&gt;
      &lt;li&gt;Calculate the related test result files with this UUID&lt;/li&gt;
      &lt;li&gt;Grasp the .XML files from Google Storage by using GSUTIL&lt;/li&gt;
      &lt;li&gt;
        Export data on those .XML files to Elasticseach by using Restful API.
        For each run to be distinctive, create new label called
        &lt;b style=&quot;font-style: italic;&quot;&gt;timeString&lt;/b&gt;. This variable will be
        used to separate the test runs and make them ordered.
      &lt;/li&gt;
    &lt;/ol&gt;
    &lt;div&gt;You run the script with &lt;b&gt;android&lt;/b&gt; or &lt;b&gt;ios&lt;/b&gt; options:&lt;/div&gt;
    &lt;div&gt;
      &lt;!--HTML generated using hilite.me--&gt;&lt;br /&gt;
      &lt;div style=&quot;background: rgb(255, 255, 255); border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;&quot;&gt;
        &lt;pre style=&quot;line-height: 125%; margin: 0px;&quot;&gt;&lt;span style=&quot;color: #008800; font-style: italic;&quot;&gt;# run test and export data&lt;/span&gt;
bash run_tests.sh android
bash run_tests.sh ios

&lt;span style=&quot;color: #008800; font-style: italic;&quot;&gt;# only export data&lt;/span&gt;
python3.6 export_xml_data_elastic.py android
python3.6 export_xml_data_elastic.py ios
&lt;/pre&gt;
      &lt;/div&gt;
      &lt;br /&gt;
      and this is the Python script to export the data
      &lt;script src=&quot;https://gist.github.com/gunesmes/220b3fbd927fe50826ee6aa94017498a.js&quot;&gt;&lt;/script&gt;
    &lt;/div&gt;
    &lt;h2&gt;
      Creating Interactive Dashboard on Kibana&amp;nbsp;
    &lt;/h2&gt;
    &lt;h3&gt;
      Search on Kibana with &lt;b&gt;&lt;i&gt;Filters&lt;/i&gt;&lt;/b&gt;&lt;/h3&gt;
  &lt;/div&gt;
  &lt;div&gt;Go to the &lt;i&gt;Discover&lt;/i&gt; menu and select one item in the list then click the &lt;b&gt;+&lt;/b&gt; button of the related filter item. Once you click the &lt;b&gt;+&lt;/b&gt; button next to the name item it filters the search item with value name has and then I want to add the &lt;i&gt;testProject&lt;/i&gt; to filter both ios project with unit tests.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEih64wrsXbbJc4Gnia8eN3a1bpj5kvpWFsSxbXv8aL4xn9x8LYPOYDpcqajTfiwWaYy_72nmlqMK2mBO2sWzWgG2YReooatyZA-2u67bJ7uHE3U6Yxs_-JR9OfGu3W9otMMo9MmwbikWNo/s2874/kibana-filter-ios-unittest.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1492&quot; data-original-width=&quot;2874&quot; height=&quot;325&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEih64wrsXbbJc4Gnia8eN3a1bpj5kvpWFsSxbXv8aL4xn9x8LYPOYDpcqajTfiwWaYy_72nmlqMK2mBO2sWzWgG2YReooatyZA-2u67bJ7uHE3U6Yxs_-JR9OfGu3W9otMMo9MmwbikWNo/w625-h325/kibana-filter-ios-unittest.png&quot; width=&quot;625&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Kibana searching with filters&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
    &lt;h3&gt;
      Create Visualizations&lt;/h3&gt;
    Click &lt;i&gt;Visualize &lt;/i&gt;then click + button on the middle of the page, it
    will pop-up types of visualization menu then you can select one of your
    favorite charts. Then it opens the saved search item, you can select the
    search you saved in the previous step.&lt;br /&gt;
    &lt;br /&gt;
    &lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;
      &lt;tbody&gt;
        &lt;tr&gt;
          &lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsmoxJaPQO9yDOe0U88tBGBYrMyaz98Z4XBztN8XbeY2jGtT8JKxQG2s1htJ4_20EG_3GsB20dSonLIypiXIZA6uLMkEf29GPNlXBcjfhpABiRE4bamtWC7PICFhGhELgWygqZDYsf5RE/s1600/kibana-setting-metrics.png&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;328&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsmoxJaPQO9yDOe0U88tBGBYrMyaz98Z4XBztN8XbeY2jGtT8JKxQG2s1htJ4_20EG_3GsB20dSonLIypiXIZA6uLMkEf29GPNlXBcjfhpABiRE4bamtWC7PICFhGhELgWygqZDYsf5RE/s640/kibana-setting-metrics.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;
          &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;
            Kibana setting the metrics
          &lt;/td&gt;
        &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
    &lt;br /&gt;
    &lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
      I choose the bar chart, later I will add one column to show the number
      of&amp;nbsp;&lt;i&gt;success, failure,&lt;/i&gt;&amp;nbsp;and&lt;i&gt;&amp;nbsp;error.&amp;nbsp;&lt;/i&gt;&amp;nbsp;As
      you can see from the picture above you need to define the
      &lt;i&gt;Metrics&lt;/i&gt;&amp;nbsp;and the picture below shows how to split the chart for
      each run by setting the&amp;nbsp;&lt;i&gt;Buckets&lt;/i&gt;.&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZLGaySrFCjUuOCRW4e8FIY6wZNSSLs4qUcaReJQv-Ro-V60M8AKqJ5pm2Ck5J_GWvCiODNIfLLh_x2Gu24zqfBEwX7U9xJz9mVk-w-N-cURIENMKJR3HoRnPD4jbFf1N_L8rJROLsEQ4/s2872/kibana-bucket-setting.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1416&quot; data-original-width=&quot;2872&quot; height=&quot;310&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZLGaySrFCjUuOCRW4e8FIY6wZNSSLs4qUcaReJQv-Ro-V60M8AKqJ5pm2Ck5J_GWvCiODNIfLLh_x2Gu24zqfBEwX7U9xJz9mVk-w-N-cURIENMKJR3HoRnPD4jbFf1N_L8rJROLsEQ4/w625-h310/kibana-bucket-setting.png&quot; width=&quot;625&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot;&gt;Kibana setting Buckets&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3&gt;Creating an Interactive Dashbord&lt;/h3&gt;
    &lt;div&gt;
      Finally, we can create a Kibana Dashboard that can display every chart
      related to the automated test results. Click on the&amp;nbsp;&lt;i&gt;Dashboard&lt;/i&gt;&amp;nbsp;menu and click the &lt;i&gt;add&lt;/i&gt;&amp;nbsp;button
      on the top-right then select the visualization that you created in the
      previous step. That&#39;s all! Now we can check the dashboard.
    &lt;/div&gt;
    &lt;div&gt;
      &lt;br /&gt;
    &lt;/div&gt;
    &lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;
      &lt;tbody&gt;
        &lt;tr&gt;
          &lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIwVFTOcwEDUkjW9HhisyfLncVdMWx6_tolLFQTusNE_7APQdoJZsVWyeMZ_69xxQFlAAX5994dYnbqjfn8L_p3P-x2D1dilIWKoOKwHDNykhAfN3xfMjE6jAQ0GSMMkvUGBcgJ-IhRoA/s1600/kibana-dashboard.png&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;886&quot; data-original-width=&quot;1600&quot; height=&quot;354&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIwVFTOcwEDUkjW9HhisyfLncVdMWx6_tolLFQTusNE_7APQdoJZsVWyeMZ_69xxQFlAAX5994dYnbqjfn8L_p3P-x2D1dilIWKoOKwHDNykhAfN3xfMjE6jAQ0GSMMkvUGBcgJ-IhRoA/s640/kibana-dashboard.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;
          &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;
            Kibana dashboard with the result of automated tests
          &lt;/td&gt;
        &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
    &lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;
    &lt;b&gt;If you want to see the repository and contribute it, you can
    &lt;a href=&quot;https://github.com/gunesmes/monitoring-test-result&quot; target=&quot;_blank&quot;&gt;fork it from Github&lt;/a&gt;
    :)&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
  &lt;div&gt;
    &lt;br /&gt;
  &lt;/div&gt;
  &lt;div&gt;
    &lt;br /&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;Mesut Güneş&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/6451802245490903433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/6451802245490903433'/><link rel='alternate' type='text/html' href='http://www.testrisk.com/2020/06/centralized-monitoring-system-for.html' title='Centralized Monitoring System for Automated Tests with Elasticsearch and Kibana'/><author><name>Mesut Güneş</name><uri>http://www.blogger.com/profile/06466018199442112635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhksmGlHvp6B2fPh5-Ci5g2Ek3nRvfSdq2utvdyhnryXZklRvpFlzP3eIBz3y293tW1q2N1RoPfPSvGGcAydIDlFj2h39vGzq85o7GRl3wG1Q2ez99aSFJE9AdZT8DAQ80/s220/10371365_778508612195086_5198865414746812917_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/UgXxSy36Lvg/default.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-8264657588618504333.post-5424424658823501229</id><published>2020-05-11T08:14:00.001-07:00</published><updated>2020-05-11T09:19:05.270-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="airborne"/><category scheme="http://www.blogger.com/atom/ns#" term="api"/><category scheme="http://www.blogger.com/atom/ns#" term="Automation"/><category scheme="http://www.blogger.com/atom/ns#" term="framework"/><category scheme="http://www.blogger.com/atom/ns#" term="quality"/><category scheme="http://www.blogger.com/atom/ns#" term="ruby"/><category scheme="http://www.blogger.com/atom/ns#" term="ruby-gems"/><category scheme="http://www.blogger.com/atom/ns#" term="services"/><category scheme="http://www.blogger.com/atom/ns#" term="Test Automation"/><category scheme="http://www.blogger.com/atom/ns#" term="test framework"/><category scheme="http://www.blogger.com/atom/ns#" term="testing"/><title type='text'>(Framework) API Test automation with Ruby Rspec and Airborne  </title><content type='html'>&lt;div style=&quot;line-height: 1.5; text-align: justify;&quot;&gt;
&lt;div style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;span style=&quot;text-align: justify;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;line-height: 1.5; text-align: justify;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjN3NHVjcT8fhjQ8gOPZx9dOOYZalaS7WbONPOvOOfJzyH2KZvpno2K26EejaBN2YCimu_REdpkbv1q03CEUarYuqiRrcSV4pFlIzb7A5M1QjqhDJk9pbDcxprWcyqwzRxJph_32U-onME/s1600/airborne-rspec-ruby-api-test-framework.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;522&quot; data-original-width=&quot;538&quot; height=&quot;307&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjN3NHVjcT8fhjQ8gOPZx9dOOYZalaS7WbONPOvOOfJzyH2KZvpno2K26EejaBN2YCimu_REdpkbv1q03CEUarYuqiRrcSV4pFlIzb7A5M1QjqhDJk9pbDcxprWcyqwzRxJph_32U-onME/s320/airborne-rspec-ruby-api-test-framework.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;Automated tests for API and services are very important so there are lots of solutions for API test automation in the market. These solutions can be
  commercial-off-the-shelf (COT) or opensource libraries also, there are many
  frameworks created around these opensource libraries. Testing APIs with tools
  that have IDE can be easy to start and learn but it can be challenging to
  customize for your unique problems or integration to CI/CD tools can be hard.
  Therefore I can suggest you use one of the opensource libraries by implementing it with your favorite language. In this way, it can run faster,&amp;nbsp; easily extendable, and configurable.&amp;nbsp; I have created a
  framework with &lt;/span&gt;&lt;a href=&quot;https://github.com/brooklynDev/airborne&quot; style=&quot;line-height: 1.5;&quot; target=&quot;_blank&quot;&gt;Airborne&lt;/a&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt; and Rspec for automating API tests, you can&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://github.com/gunesmes/ruby-airbone-rspec-api&quot; style=&quot;line-height: 1.5;&quot; target=&quot;_blank&quot;&gt;check it from Github&lt;/a&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;.&amp;nbsp; In this post, I want to explain what is Airborne and how I implemented a framework around it. You can simply update the environment variables and write your specs file in the `&lt;/span&gt;&lt;b style=&quot;line-height: 1.5;&quot;&gt;specs&lt;/b&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;` folder.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;line-height: 1.5; text-align: justify;&quot;&gt;
&lt;span style=&quot;line-height: 1.5; text-align: justify;&quot;&gt;&lt;span style=&quot;line-height: 1.5; text-align: justify;&quot;&gt;&lt;span style=&quot;line-height: 1.5; text-align: justify;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;

&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;span style=&quot;line-height: 1.5; text-align: justify;&quot;&gt;&lt;span style=&quot;line-height: 1.5; text-align: justify;&quot;&gt;&lt;span style=&quot;line-height: 1.5; text-align: justify;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 style=&quot;line-height: 1.5; text-align: justify;&quot;&gt;
What is API Testing&lt;/h2&gt;
&lt;div style=&quot;line-height: 1.5; text-align: justify;&quot;&gt;
API stands for an application programming interface. APIs are providing an interface of your system to the world. API&#39;s endpoints can be called by requests and these calls return relevant data. An API can be considered as a source for clients such as web, android, ios, desktop applications, or even other APIs. Testing APIs from these clients will be difficult, expensive, and slow, therefore it is very important to test APIs as soon as any changes are introduced in the codebase.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;line-height: 1.5; text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;line-height: 1.5; text-align: justify;&quot;&gt;
API testing includes calling endpoints of APIs with relevant data and credentials. Each call should be asserted in terms of validity and verification. Some of the scenarios can be end-to-end tests, which means that you can not test these scenarios in one single call, instead, you need to call several API calls in accordance with your user-scenarios. All these works called API testing. API testing can be performed manually with some tools or you can write your automation project and run them automatically. In terms of `&lt;b style=&quot;line-height: 1.5;&quot;&gt;exploratory testing&lt;/b&gt;`, you should adapt your testing tools to perform manual testing for exploration.&amp;nbsp;&lt;/div&gt;
&lt;h2 style=&quot;line-height: 1.5; text-align: justify;&quot;&gt;
What is Airborne&lt;/h2&gt;
&lt;div style=&quot;line-height: 1.5; text-align: justify;&quot;&gt;
Airborne is a GEM created to test APIs on top of the &lt;a href=&quot;https://github.com/rspec/rspec&quot; style=&quot;line-height: 1.5;&quot; target=&quot;_blank&quot;&gt;Rspec&lt;/a&gt; and &lt;a href=&quot;https://github.com/rest-client/rest-client&quot; style=&quot;line-height: 1.5;&quot; target=&quot;_blank&quot;&gt;RestClient&lt;/a&gt;. Airborne provides a framework to write automated tests for APIs. There are many tools and libraries created for API test but Airbone is Ruby equivalent and it provides a simple response check so that you can whole JSON response at on with expected data or type of data. It also uses the RestClient for handling HTTP requests, which is very mature and reliable. If you have a struggle using Airborne you can call RestClient directly in your test either. The bad part is that Airborne doesn&#39;t have good documentation but once you start writing simple tests it becomes easier.&lt;/div&gt;
&lt;h2 style=&quot;line-height: 1.5; text-align: justify;&quot;&gt;
How to Write Tests&amp;nbsp;&lt;/h2&gt;
&lt;div style=&quot;line-height: 1.5; text-align: justify;&quot;&gt;
Airborne is an abstraction layer on top of rest_client, it makes testing easier with providing simple syntax. Airborne provides basic HTTP methods such as &lt;b style=&quot;line-height: 1.5;&quot;&gt;get, post, put, patch, delete, head, &lt;/b&gt;and&lt;b style=&quot;line-height: 1.5;&quot;&gt; options&lt;/b&gt; requests. You can use any of these methods to write your tests, see the example below:&lt;/div&gt;
&lt;script src=&quot;https://gist.github.com/gunesmes/68a839a40560f77edd93d0a970cf5083.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;
&lt;div style=&quot;line-height: 1.5; text-align: justify;&quot;&gt;
Testing needs assertion, for API testing assertions are written to check the object types, object values in the JSON. Airborne has built-in assertions to check the JSON effectively.&amp;nbsp; These are the Rspec based asserting functions:&lt;/div&gt;
&lt;div style=&quot;line-height: 1.5;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;line-height: 1.5;&quot;&gt;
&lt;ul style=&quot;background-color: white; box-sizing: border-box; color: #24292e; font-family: -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; line-height: 1.5; margin-bottom: 16px; margin-top: 0px; padding-left: 2em;&quot;&gt;
&lt;li style=&quot;box-sizing: border-box; line-height: 1.5;&quot;&gt;&lt;code style=&quot;background-color: rgba(27, 31, 35, 0.05); border-radius: 3px; box-sizing: border-box; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace; font-size: 13.6px; line-height: 1.5; margin: 0px; padding: 0.2em 0.4em;&quot;&gt;expect_json_types&lt;/code&gt;&amp;nbsp;- Tests the types of JSON property values returned&lt;/li&gt;
&lt;li style=&quot;box-sizing: border-box; line-height: 1.5; margin-top: 0.25em;&quot;&gt;&lt;code style=&quot;background-color: rgba(27, 31, 35, 0.05); border-radius: 3px; box-sizing: border-box; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace; font-size: 13.6px; line-height: 1.5; margin: 0px; padding: 0.2em 0.4em;&quot;&gt;expect_json&lt;/code&gt;&amp;nbsp;- Tests the values of the JSON property values returned&lt;/li&gt;
&lt;li style=&quot;box-sizing: border-box; line-height: 1.5; margin-top: 0.25em;&quot;&gt;&lt;code style=&quot;background-color: rgba(27, 31, 35, 0.05); border-radius: 3px; box-sizing: border-box; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace; font-size: 13.6px; line-height: 1.5; margin: 0px; padding: 0.2em 0.4em;&quot;&gt;expect_json_keys&lt;/code&gt;&amp;nbsp;- Tests the existence of the specified keys in the JSON object&lt;/li&gt;
&lt;li style=&quot;box-sizing: border-box; line-height: 1.5; margin-top: 0.25em;&quot;&gt;&lt;code style=&quot;background-color: rgba(27, 31, 35, 0.05); border-radius: 3px; box-sizing: border-box; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace; font-size: 13.6px; line-height: 1.5; margin: 0px; padding: 0.2em 0.4em;&quot;&gt;expect_json_sizes&lt;/code&gt;&amp;nbsp;- Tests the sizes of the JSON property values returned, also test if the values are arrays&lt;/li&gt;
&lt;li style=&quot;box-sizing: border-box; line-height: 1.5; margin-top: 0.25em;&quot;&gt;&lt;code style=&quot;background-color: rgba(27, 31, 35, 0.05); border-radius: 3px; box-sizing: border-box; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace; font-size: 13.6px; line-height: 1.5; margin: 0px; padding: 0.2em 0.4em;&quot;&gt;expect_status&lt;/code&gt;&amp;nbsp;- Tests the HTTP status code returned&lt;/li&gt;
&lt;li style=&quot;box-sizing: border-box; line-height: 1.5; margin-top: 0.25em;&quot;&gt;&lt;code style=&quot;background-color: rgba(27, 31, 35, 0.05); border-radius: 3px; box-sizing: border-box; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace; font-size: 13.6px; line-height: 1.5; margin: 0px; padding: 0.2em 0.4em;&quot;&gt;expect_header&lt;/code&gt;&amp;nbsp;- Tests for a specified header in the response&lt;/li&gt;
&lt;li style=&quot;box-sizing: border-box; line-height: 1.5; margin-top: 0.25em;&quot;&gt;&lt;code style=&quot;background-color: rgba(27, 31, 35, 0.05); border-radius: 3px; box-sizing: border-box; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace; font-size: 13.6px; line-height: 1.5; margin: 0px; padding: 0.2em 0.4em;&quot;&gt;expect_header_contains&lt;/code&gt;&amp;nbsp;- Partial match test on a specified header&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;line-height: 1.5;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;Mesut Güneş&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/5424424658823501229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/5424424658823501229'/><link rel='alternate' type='text/html' href='http://www.testrisk.com/2020/05/framework-api-test-automation-with-ruby.html' title='(Framework) API Test automation with Ruby Rspec and Airborne  '/><author><name>Mesut Güneş</name><uri>http://www.blogger.com/profile/06466018199442112635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhksmGlHvp6B2fPh5-Ci5g2Ek3nRvfSdq2utvdyhnryXZklRvpFlzP3eIBz3y293tW1q2N1RoPfPSvGGcAydIDlFj2h39vGzq85o7GRl3wG1Q2ez99aSFJE9AdZT8DAQ80/s220/10371365_778508612195086_5198865414746812917_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjN3NHVjcT8fhjQ8gOPZx9dOOYZalaS7WbONPOvOOfJzyH2KZvpno2K26EejaBN2YCimu_REdpkbv1q03CEUarYuqiRrcSV4pFlIzb7A5M1QjqhDJk9pbDcxprWcyqwzRxJph_32U-onME/s72-c/airborne-rspec-ruby-api-test-framework.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-8264657588618504333.post-7592932400220863411</id><published>2020-05-10T18:19:00.002-07:00</published><updated>2024-07-20T01:11:44.329-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CD"/><category scheme="http://www.blogger.com/atom/ns#" term="CI"/><category scheme="http://www.blogger.com/atom/ns#" term="contract testing"/><category scheme="http://www.blogger.com/atom/ns#" term="devops"/><category scheme="http://www.blogger.com/atom/ns#" term="Load Test"/><category scheme="http://www.blogger.com/atom/ns#" term="microservice"/><category scheme="http://www.blogger.com/atom/ns#" term="monitoring"/><category scheme="http://www.blogger.com/atom/ns#" term="operations"/><category scheme="http://www.blogger.com/atom/ns#" term="Performance"/><category scheme="http://www.blogger.com/atom/ns#" term="QA"/><category scheme="http://www.blogger.com/atom/ns#" term="talks"/><category scheme="http://www.blogger.com/atom/ns#" term="Test Automation"/><category scheme="http://www.blogger.com/atom/ns#" term="testing"/><category scheme="http://www.blogger.com/atom/ns#" term="testops"/><title type='text'>TestOps: What is it and Why we need it</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;Years of experiences in the software industry shows that there are many more thing that has not been discovered yet. Every approach found in the software industry aims to accelerate the development speed with more customer satisfaction.&amp;nbsp; Hence the new term &quot;TestOps&quot; is also creating different perspectives on the relationship between test activities to the operational activities within the DevOps culture. In the post, I want to explain my experience with the TestOps.&amp;nbsp;&lt;/div&gt;&lt;h3 style=&quot;text-align: justify;&quot;&gt;What is TestOps&lt;/h3&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;It shortly stands for tests and operations. Within the DevOps culture, it is a sub-discipline DevOps. There are two approaches to TestOps, these are related to the test approach that you are applying the overall test approach. Mainly if you are applying `&lt;b&gt;shift-left testing&lt;/b&gt;` then the TestOps should be adopted to have more collaboration with the development team, `&lt;b&gt;TestOps shift-right&lt;/b&gt;`. On the other hand, if you are applying `&lt;b&gt;shift-right testing&lt;/b&gt;` then the TestOps should be adopted to have more collaboration with the operation team, this can be called `&lt;b&gt;TestOps shift-left&lt;/b&gt;`.&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: justify;&quot;&gt;Why We Need TestOps&lt;/h3&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Developing something from idea to a product is needing different expertise such as product owner, developer, tester, DevOps. This shows that one can not handle everything by himself, or doing one responsibility doesn&#39;t mean that you are the expert and doing the correct thing. In the testing, there are always changes. We need to adapt ourselves to the waterfall, v-model, agile development process, and also application architectures patterns like monolithic, microservices. Required tests for each process and pattern are different so the required capabilities of the testers are also different. The emerging pattern nowadays is microservices and the most popular development process is agile.&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;With emerging trends in the microservice architectural pattern, shift-right testing has risen significantly.&amp;nbsp; One of the pioneers who applied the microservice pattern widely is Netflix, and they are suggesting to test those hundred of microservices in the later stage of development as well. Let&#39;s look at the real-world example of Amazon and Netflix below:&lt;/div&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnSX3DTvyCqLDyZdO7i1OW-Bz84HbWz7xUhPBJpoS14u0xt6wxjudJbYAaQz4ozov2F9_QMvEnN8sKOaBiL5sAVI6FY5pbpuhuKBPMBKONS12t6q4dvVUUafxmNuWordV_3q3D8ir903g/&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;628&quot; data-original-width=&quot;1200&quot; height=&quot;334&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnSX3DTvyCqLDyZdO7i1OW-Bz84HbWz7xUhPBJpoS14u0xt6wxjudJbYAaQz4ozov2F9_QMvEnN8sKOaBiL5sAVI6FY5pbpuhuKBPMBKONS12t6q4dvVUUafxmNuWordV_3q3D8ir903g/w640-h334/microservice-architecture-netflix-amazon.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Number of Integration Point For Amazon and Netflix&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Since there are hundreds of microservices and the number of integration points between each of them is very high.&amp;nbsp; Let&#39;s just think 2 services then the integration points become 2. If there are 3 services, then it becomes 3. Respectively 6, 10, 15, 21, and so on. It increases drastically when the number reaches to hundreds, for example, 100 services have &lt;b&gt;4950&lt;/b&gt;; 500 services have&amp;nbsp;&lt;b&gt;124750 two subset&lt;/b&gt; integration points.&amp;nbsp; Basically, the combination formula is below, where the &lt;b&gt;n&lt;/b&gt; is the number of microservices, &lt;b&gt;r&lt;/b&gt; is subset/subgroup which is &lt;b&gt;2&lt;/b&gt;&amp;nbsp;for integration calculation.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg76PpfKiMU0bQZrZhUYozzVEm2zXVKAllPIAz5ztwv3Hy4uHfy0Yzf0Igw-tdh9Apfb2Y6MF38zNbN1EUx77wrAxCpVYNsFVMrgXY1EiO3kjo69aL0kFEYDRQvjg_FdZkST3kD1lTFLt8/&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;622&quot; data-original-width=&quot;1946&quot; height=&quot;64&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg76PpfKiMU0bQZrZhUYozzVEm2zXVKAllPIAz5ztwv3Hy4uHfy0Yzf0Igw-tdh9Apfb2Y6MF38zNbN1EUx77wrAxCpVYNsFVMrgXY1EiO3kjo69aL0kFEYDRQvjg_FdZkST3kD1lTFLt8/w200-h64/combination-formula.png&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Netflix, as well as Google and Amazon, also has been the pioneer in the testing of the Microservices. Thanks to Netflix, they explained the experience &lt;a href=&quot;https://www.youtube.com/watch?v=CZ3wIuvmHeM&quot; target=&quot;_blank&quot;&gt;transformation publicly&lt;/a&gt;. Netflix and also Spotify have changed the use of the traditional test pyramid. It is reverted and it becomes a test diamond, which is saying that the unit test is still important but instead of writing exhaustive unit tests we should focus on integration test more. For detail how Spotify change the test pyramid for microservice testing&amp;nbsp;&lt;a href=&quot;https://labs.spotify.com/2018/01/11/testing-of-microservices/&quot; target=&quot;_blank&quot;&gt;you can read this post&lt;/a&gt;.&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxIrvzy2XH4sFlRrQXZHwxW2LUuGVgKcJfHuh5nhK-N9mKtwUDtJvdC0Wqbgho8FYNmA2WB0jzS8bUFuKE8YSvJg6gtp9tuZUPT2P-oOLgN0JWRxQ4nq_kFQNnwpCx0Jk8JNjW4HJAVGQ/&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;251&quot; data-original-width=&quot;600&quot; height=&quot;268&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxIrvzy2XH4sFlRrQXZHwxW2LUuGVgKcJfHuh5nhK-N9mKtwUDtJvdC0Wqbgho8FYNmA2WB0jzS8bUFuKE8YSvJg6gtp9tuZUPT2P-oOLgN0JWRxQ4nq_kFQNnwpCx0Jk8JNjW4HJAVGQ/w640-h268/netflix-microservice-traffic.gif&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Traffic in Netflix&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;So far I want to explain the system that we need to make an impact on the quality of the overall system becomes more and more complicated. Handling the test activities of those systems should be updated with new approaches. Whatever your testing approach is &lt;b&gt;shift-left&lt;/b&gt; or &lt;b&gt;shift-right&lt;/b&gt;, you should use the discipline of TestOps effectively.&lt;/div&gt;&lt;h3 style=&quot;text-align: justify;&quot;&gt;TestOps shift-left&amp;nbsp;&lt;/h3&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;TestOps is needed when you want to leverage the test automation benefits. This requires lots of expertise for&amp;nbsp;&lt;b&gt;TestOps shift-left, t&lt;/b&gt;hese are some basic tasks that you will need to do for a good test automation practice, such as:&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;Using containers&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;Using container orchestration tools&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;Creating test pipelines with automation tools&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;Integrating test tools the pipeline&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;Integration test pipeline to the main development pipeline&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;Creating or using a well-known automation framework&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;Writing deterministic tests&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;Creating test data&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;Removing dependency in the tests&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;Creating isolated test environments&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;Running test parallel&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;Creating test reports&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;Binding these test reports&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;Rerunning failed tests&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;Extracting flaky tests and making them investigated&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;Destroying the test environments after tests&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;Removing test data&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;Creating a monitoring system for the visibility of tests&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;so on ...&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&quot;text-align: justify;&quot;&gt;TestOps shift-right&lt;/h3&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Let&#39;s look at the&amp;nbsp;&lt;b&gt;TestOps shift-right&lt;/b&gt;, which is mostly focusing on the collaboration with the operation team. Even though it includes most of the items for&amp;nbsp;&lt;b&gt;TestOps shift-left&lt;/b&gt;&amp;nbsp;since it requires continues testing practice, its requirements are also different and we can list them as:&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;ul&gt;&lt;li&gt;Having continues testing&lt;/li&gt;&lt;li&gt;Testing on the live environment&lt;/li&gt;&lt;li&gt;Effective use of a monitoring system&lt;/li&gt;&lt;li&gt;Leveraging data on the live&amp;nbsp; environment to grasp anomalies&lt;/li&gt;&lt;li&gt;Creating dashboards/charts from the live data&lt;/li&gt;&lt;li&gt;Chaos engineering, defined by &lt;a href=&quot;https://www.gremlin.com/chaos-monkey/&quot; target=&quot;_blank&quot;&gt;Netflix&lt;/a&gt;. Basically, identifying failures before an outage happens by injecting controlled failure scenarios for the reliability of the system.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: justify;&quot;&gt;Where We can Apply TestOps&lt;/h3&gt;&lt;div&gt;We can see the benefits of TestOps in some situations more such as performance testing, test automation. For a well-designed performance testing, the strategy should include the real user scenarios. To be able to draw these scenarios, we need to tackle the real user data which is collected from the live environment. Let&#39;s list the items needed for performance testing:&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Real user flow data should be collected&lt;/li&gt;&lt;li&gt;Data should be analyzed to create a distribution table for each user flow&lt;/li&gt;&lt;li&gt;This distribution should be converted to a percentage of usage&lt;/li&gt;&lt;li&gt;Test scenarios should be created depending on the real users&lt;/li&gt;&lt;li&gt;Each test scenarios should be weighted with the percentage&lt;/li&gt;&lt;li&gt;The test environment should be created if necessary, most of the time live environment should be used&lt;/li&gt;&lt;li&gt;Environments for running performance scripts should be prepared, use the cloud services. If the master-slave configuration needed, the environment for each slave should be prepared. The better way is to create an &lt;b&gt;IAAC&lt;/b&gt; file to handle this creation and scalability automatically.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Prepare monitoring tools&lt;/li&gt;&lt;li&gt;Run the tests&lt;/li&gt;&lt;li&gt;Check the monitoring tools if loads are received correctly&lt;/li&gt;&lt;li&gt;If any failure occurs, reconfigure the test/live environment and re-run the script. If everything goes well, stop the performance scripts&lt;/li&gt;&lt;li&gt;Collect the data&lt;/li&gt;&lt;li&gt;Stop every environment&amp;nbsp;&lt;/li&gt;&lt;li&gt;Create a report&lt;/li&gt;&lt;li&gt;Possible I missed something&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Since these activities are not done by a single person, TestOps discipline helps to handle these tasks. In the same way, test automation also includes most of the technical expertise to leverage the benefits.&amp;nbsp;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;How We can Align to TestOps&amp;nbsp;&lt;/h3&gt;&lt;/div&gt;&lt;div&gt;TestOps requires some new qualifications for QA/Test Engineers such as learning how DevOps tools can accelerate the testing experiences and also how the QA team helps the operation team to get better customer experiences. Let&#39;s summaries the qualifications which are needed to align TestOps discipline:&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Learn DevOps tools&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Containers&lt;/li&gt;&lt;li&gt;Container orchestration tools&lt;/li&gt;&lt;li&gt;Cloud testing ability&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Learn scripting languages&lt;/li&gt;&lt;li&gt;How to spot defects&lt;/li&gt;&lt;li&gt;How to debug defects&lt;/li&gt;&lt;li&gt;More automation, not only test but also process&lt;/li&gt;&lt;li&gt;Apply continues testing&lt;/li&gt;&lt;li&gt;Adapt yourself to new tools and technologies&lt;/li&gt;&lt;li&gt;Monitoring tool experiences&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Search data&lt;/li&gt;&lt;li&gt;Create charts/graphs&lt;/li&gt;&lt;li&gt;Create reports&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Learn how to communicate with the operation team&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span style=&quot;text-align: justify;&quot;&gt;I have given a talk about &lt;b&gt;What is TestOps in Five Question&lt;/b&gt;, you can it watch it (in Turkish)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;text-align: justify;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;iframe allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/ZkIzVwyEgb0&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Mesut Güneş&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/7592932400220863411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/7592932400220863411'/><link rel='alternate' type='text/html' href='http://www.testrisk.com/2020/05/testops-what-is-it-and-why-we-need-it.html' title='TestOps: What is it and Why we need it'/><author><name>Mesut Güneş</name><uri>http://www.blogger.com/profile/06466018199442112635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhksmGlHvp6B2fPh5-Ci5g2Ek3nRvfSdq2utvdyhnryXZklRvpFlzP3eIBz3y293tW1q2N1RoPfPSvGGcAydIDlFj2h39vGzq85o7GRl3wG1Q2ez99aSFJE9AdZT8DAQ80/s220/10371365_778508612195086_5198865414746812917_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnSX3DTvyCqLDyZdO7i1OW-Bz84HbWz7xUhPBJpoS14u0xt6wxjudJbYAaQz4ozov2F9_QMvEnN8sKOaBiL5sAVI6FY5pbpuhuKBPMBKONS12t6q4dvVUUafxmNuWordV_3q3D8ir903g/s72-w640-h334-c/microservice-architecture-netflix-amazon.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-8264657588618504333.post-3985555090150872849</id><published>2020-05-02T08:19:00.003-07:00</published><updated>2021-11-22T22:59:22.016-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CD"/><category scheme="http://www.blogger.com/atom/ns#" term="CI"/><category scheme="http://www.blogger.com/atom/ns#" term="devops"/><category scheme="http://www.blogger.com/atom/ns#" term="github"/><category scheme="http://www.blogger.com/atom/ns#" term="rspec"/><category scheme="http://www.blogger.com/atom/ns#" term="ruby"/><category scheme="http://www.blogger.com/atom/ns#" term="ruby-gems"/><title type='text'>GitHub Actions: CI / CD Tools - Applying for Ruby / Rspec Project</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;Github released the beta version of &quot;&lt;i&gt;&lt;a href=&quot;https://github.blog/2019-10-08-github-actions-from-open-source-maintainers/?utm_campaign=1570558644&amp;amp;utm_medium=social&amp;amp;utm_source=twitter&amp;amp;utm_content=1570558644&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;actions&lt;/a&gt;&lt;/i&gt;&quot; last year for creating a CI/CD pipeline for the projects. This feature enables us to create a pipeline easily with the web interface of Github.&amp;nbsp; I want to run the tests for one of my public project in the Github before merging branches to the master. For &lt;i&gt;&lt;a href=&quot;https://github.com/gunesmes/testsozluk&quot; target=&quot;_blank&quot;&gt;testsozluk&lt;/a&gt;&lt;/i&gt; aka &quot;&lt;i&gt;&lt;b&gt;test dictionary&lt;/b&gt;&lt;/i&gt;&quot;, which contains terms frequently used in the software industry with the meaning and usage of them in Turkish. For the project, tests are critical because JSON files in the Github project are the data source of the application so if any corruption in the data may break &lt;a href=&quot;https://github.com/gunesmes/testdictionary-android-app&quot; target=&quot;_blank&quot;&gt;the android&lt;/a&gt; and &lt;a href=&quot;https://github.com/gunesmes/testdictionary-ios-app&quot; target=&quot;_blank&quot;&gt;the ios&lt;/a&gt; application. The tests in the project are written in Ruby by using Rspec to assert them so I used the Github actions to verify before merging code. In this post, I want to explain how this can be done.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;Github&#39;s actions are very easy to apply. You can add it just go to the Actions tab in your project and then select one of the predefined options on the list. For Ruby projects, there is one for Ruby project and one for Ruby Gems project, or you can skip these predefined workflows and create your own workflow with create yourself option. Ruby Gems project is also including deployment part so you can easily push your gem to RubyGems with the credentials easily no need to push it in your local repository. Let&#39;s look at the Ruby projects, see the image below:&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4PL0-cau_jJC-AyblGHF-F21ALwc84PTWl9Qay_jHYZDAG_yBSADcMnDRDmE_yQpZHIQpIsG9wVuLDNqAI0NjMnE0_wNCmJBKi1NP-2oMH-BTC3LN74Zw86Iv74Of3Hn1jnQRwD-g03U/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Github Actions - Ruby Project&quot; border=&quot;0&quot; data-original-height=&quot;1322&quot; data-original-width=&quot;2730&quot; height=&quot;310&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4PL0-cau_jJC-AyblGHF-F21ALwc84PTWl9Qay_jHYZDAG_yBSADcMnDRDmE_yQpZHIQpIsG9wVuLDNqAI0NjMnE0_wNCmJBKi1NP-2oMH-BTC3LN74Zw86Iv74Of3Hn1jnQRwD-g03U/w640-h310/github-actions-ruby-project.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;When you get the predefined Ruby workflow, you can add some tasks related to your pipeline and customize it. Basically, the workflow that I want to apply is to create a virtual Linux machine and install Ruby with the version of 2.6 and install requirements with the bundle. This workflow will run on push, but you can also set it on &lt;b&gt;pull_request&lt;/b&gt;, or on schedule by defining a schedule with Cron syntax. It also has a &lt;a href=&quot;https://help.github.com/en/actions/reference/events-that-trigger-workflows#webhook-events&quot; target=&quot;_blank&quot;&gt;webhook&lt;/a&gt; to trigger the workflow. I selected ubuntu-latest as a virtual machine but there are also other options as following:&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;runs-on:&amp;nbsp;&lt;/div&gt;&lt;ul style=&quot;background-color: white; box-sizing: border-box; color: #24292e; font-family: -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 14px; margin-bottom: 16px; margin-top: 0px; padding-left: 2em; text-align: left;&quot;&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;background-color: rgba(27, 31, 35, 0.05); border-radius: 3px; box-sizing: border-box; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace; font-size: 11.9px; margin: 0px; padding: 0.2em 0.4em;&quot;&gt;ubuntu-latest&lt;/code&gt;,&amp;nbsp;&lt;code style=&quot;background-color: rgba(27, 31, 35, 0.05); border-radius: 3px; box-sizing: border-box; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace; font-size: 11.9px; margin: 0px; padding: 0.2em 0.4em;&quot;&gt;ubuntu-18.04&lt;/code&gt;, or&amp;nbsp;&lt;code style=&quot;background-color: rgba(27, 31, 35, 0.05); border-radius: 3px; box-sizing: border-box; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace; font-size: 11.9px; margin: 0px; padding: 0.2em 0.4em;&quot;&gt;ubuntu-16.04&lt;/code&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;&lt;code style=&quot;background-color: rgba(27, 31, 35, 0.05); border-radius: 3px; box-sizing: border-box; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace; font-size: 11.9px; margin: 0px; padding: 0.2em 0.4em;&quot;&gt;windows-latest&lt;/code&gt;&amp;nbsp;or&amp;nbsp;&lt;code style=&quot;background-color: rgba(27, 31, 35, 0.05); border-radius: 3px; box-sizing: border-box; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace; font-size: 11.9px; margin: 0px; padding: 0.2em 0.4em;&quot;&gt;windows-2019&lt;/code&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;&lt;code style=&quot;background-color: rgba(27, 31, 35, 0.05); border-radius: 3px; box-sizing: border-box; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace; font-size: 11.9px; margin: 0px; padding: 0.2em 0.4em;&quot;&gt;macos-latest&lt;/code&gt;&amp;nbsp;or&amp;nbsp;&lt;code style=&quot;background-color: rgba(27, 31, 35, 0.05); border-radius: 3px; box-sizing: border-box; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace; font-size: 11.9px; margin: 0px; padding: 0.2em 0.4em;&quot;&gt;macos-10.15&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;For the project, tests are present in the `src/test` folder since I created the tests with RSpec it has its own structure, so I need to run tests in the test folder. Therefore running tests should have two steps; first I need to go to the test folder and then run the RSpec &lt;b&gt;&lt;i&gt;specs/test_spec.rb&lt;/i&gt;&lt;/b&gt; command to run them. The run command in the workflow supports multiple commands with adding pipe |. Let&#39;s look at the workflow as below:&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;Basically, I have created three tests to check first if the file is well-formatted JSON,&amp;nbsp; second every term has term and meaning fields, and third there is duplicated term. If one of the tests fails, it doesn&#39;t allow us to merge it. See the tests:&lt;/span&gt;&lt;div&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;&lt;script src=&quot;https://gist.github.com/gunesmes/524d8d8580e8d6f965a02ca62b44d420.js?file=validate_json_files_spec.rb&quot;&gt;&lt;/script&gt;To be able to stop merging to master when the tests are failing, you should add a rule in the Setting tab of the project and select the Branch option in the right list and add a rule that you should enable &quot;&lt;b&gt;Require status checks to pass before merging&lt;/b&gt;&quot; and check the &lt;b&gt;test &lt;/b&gt;which is a given name in your workflow yaml file. With this setup, merging action is now dependent on the result of the tests.&amp;nbsp;&lt;/span&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;table border=&quot;1&quot; bordercolor=&quot;#888&quot; cellspacing=&quot;0&quot; style=&quot;border-collapse: collapse; border-color: rgb(136, 136, 136); border-width: 1px;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;902&quot; data-original-width=&quot;2058&quot; height=&quot;175&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhp51rJ_gZX_aHhbKFkdITpIb7Il8t9ucBxwsRSD-4Z7I7i03FOzXi_axnAprrNDaRWzk3xqRfJYOoM2mqY9RaoJn8btsyKgkraf0jhDARUlT6U6mulxHvWzwoAUCzz0SGtuhlbHS1dIhc/w400-h175/github-branches-settings.png&quot; width=&quot;400&quot; /&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;558&quot; data-original-width=&quot;1444&quot; height=&quot;155&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPV-qL6QoJgRm5eKeql1QkJULSaJV4vKE1JI2v7yGL1K2XijVffdRMO1VZflVjISNf_IBQI5L5figsnjMzi3jfUpg0ntwP29rD37af5Wm2N2r8GMqt9SnbP3AGd3oqSW8ZNaMxM2sLgQY/w400-h155/github-require-status-checks-to-pass-before-merging.png&quot; width=&quot;400&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;Let&#39;s check the failing and the passing scenarios:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;table border=&quot;1&quot; bordercolor=&quot;#888&quot; cellspacing=&quot;0&quot; style=&quot;border-collapse: collapse; border-color: rgb(136, 136, 136); border-width: 1px;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWDE5oFoejblpNNRWz6SPd_pAzkGMnoQahGptpLYSAL3Xe4Ex2kXFqJoVtzLxQgePkt4EgNCf5VmNdnVtb8-6LYX5kyNuhi_6GHZmXSQX_Dnsd0qtYJyQA-8rb7i63nCVGBPslDP4sjto/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1350&quot; data-original-width=&quot;2102&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWDE5oFoejblpNNRWz6SPd_pAzkGMnoQahGptpLYSAL3Xe4Ex2kXFqJoVtzLxQgePkt4EgNCf5VmNdnVtb8-6LYX5kyNuhi_6GHZmXSQX_Dnsd0qtYJyQA-8rb7i63nCVGBPslDP4sjto/s320/github-actions-failing-workflows.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAbDhldRm_owqp_D6FGWRYmrKmdAajzjDqWxrxF-0NOTNJHnmFIaZRUYXAINHHh_5Foc1ibmhoX6NIe_zf_0Tcw71QJEGRal-Tn1pOf7vp7HTYwFGile_arTwwpdzb-s__dfl6QFs7Dpk/&quot; style=&quot;margin-left: 1em; margin-right: 1em; text-align: center;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1360&quot; data-original-width=&quot;2442&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAbDhldRm_owqp_D6FGWRYmrKmdAajzjDqWxrxF-0NOTNJHnmFIaZRUYXAINHHh_5Foc1ibmhoX6NIe_zf_0Tcw71QJEGRal-Tn1pOf7vp7HTYwFGile_arTwwpdzb-s__dfl6QFs7Dpk/s320/github-actions-passing-workflow.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&amp;nbsp; &amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;Mesut Güneş&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/3985555090150872849'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/3985555090150872849'/><link rel='alternate' type='text/html' href='http://www.testrisk.com/2020/05/github-actions-ci-cd-tools-applying-for.html' title='GitHub Actions: CI / CD Tools - Applying for Ruby / Rspec Project'/><author><name>Mesut Güneş</name><uri>http://www.blogger.com/profile/06466018199442112635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhksmGlHvp6B2fPh5-Ci5g2Ek3nRvfSdq2utvdyhnryXZklRvpFlzP3eIBz3y293tW1q2N1RoPfPSvGGcAydIDlFj2h39vGzq85o7GRl3wG1Q2ez99aSFJE9AdZT8DAQ80/s220/10371365_778508612195086_5198865414746812917_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4PL0-cau_jJC-AyblGHF-F21ALwc84PTWl9Qay_jHYZDAG_yBSADcMnDRDmE_yQpZHIQpIsG9wVuLDNqAI0NjMnE0_wNCmJBKi1NP-2oMH-BTC3LN74Zw86Iv74Of3Hn1jnQRwD-g03U/s72-w640-h310-c/github-actions-ruby-project.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-8264657588618504333.post-9127337747640607069</id><published>2019-12-31T06:12:00.000-08:00</published><updated>2020-05-13T01:25:37.720-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="devops"/><category scheme="http://www.blogger.com/atom/ns#" term="influxdb"/><category scheme="http://www.blogger.com/atom/ns#" term="Jenkins"/><category scheme="http://www.blogger.com/atom/ns#" term="k6"/><category scheme="http://www.blogger.com/atom/ns#" term="kibana"/><category scheme="http://www.blogger.com/atom/ns#" term="Load Test"/><category scheme="http://www.blogger.com/atom/ns#" term="Performance"/><category scheme="http://www.blogger.com/atom/ns#" term="Test Automation"/><category scheme="http://www.blogger.com/atom/ns#" term="testops"/><title type='text'>Automated Performance Testing with K6</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Automated testing is running the tests and reporting results by tools with scripts. Automated performance testing is designing the performance test scenarios to run them spontaneously by tools and evaluating the result by tools to decide to go or not to go further.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;
&lt;/span&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;h3&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;b style=&quot;font-family: verdana, sans-serif;&quot;&gt;Automated Performance Testing is&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;
&lt;/span&gt;
&lt;ul&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;
&lt;li style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;A subset of the performance test scenarios&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Designed to run spontaneously by tools&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Designed to evaluate the result by tools&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Designed not to break the system&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Having decision metrics, ex: max response time, max-average resp time, ...&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Designed to create reports for the concurrent and historical run&lt;/span&gt;&lt;/li&gt;
&lt;/span&gt;&lt;/ul&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;
&lt;div&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;
What Types of Performance Testing Should be Automated&lt;/span&gt;&lt;/h3&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;
&lt;/span&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Automated performance testing can be applied to all types of performance testing. However, each type needs a different level of maturity and sanity.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;h4&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;b&gt;Automated Performance Testing is&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;div&gt;
Easily applied to &lt;b&gt;load testing&lt;/b&gt;&lt;/div&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;div&gt;
&lt;b&gt;Hard to apply&lt;/b&gt; stress test, spike test, but have benefits&lt;/div&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;div&gt;
Very hard to apply &lt;b&gt;Soak-Endurance&lt;/b&gt; test&lt;/div&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;/span&gt;
    &lt;/span&gt;&lt;/ul&gt;
&lt;div&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;
Automated Load Tests&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Since the load test is aiming to the response of the system under a specific load and it is a success belongs to the pre-defined metrics, load testing is the best-suited performance testing type.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;b&gt;Automated Load Testing is&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
Needing a specific load level&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;
                &lt;div&gt;
Needing pre-defined metrics&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
Needing evaluation of the result&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
Needing exactly the same environment - only one thing can be testable&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
Needing tools and script knowledge&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
Easy to integrate CI/CD pipeline - everything is scripted&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
Reporting the performance of the system when something changes&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;/span&gt;
        &lt;/span&gt;&lt;/ul&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;
Tools Needed for Automated Performance Testing&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;
&lt;/span&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Performance testing depends on two main parts. The first part is creating loads and the second part is using these loads for test scenarios. When it comes to doing automated performance testing, we need more tools&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;
&lt;/span&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;b&gt;Tools Needed for Automated Performance Testing are&lt;/b&gt;&lt;/span&gt;
    &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;/span&gt;
    &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul class=&quot;ul1&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;
&lt;li class=&quot;li1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;strong&gt;Performance Testing tools&lt;/strong&gt;&lt;/span&gt;&lt;/li&gt;
&lt;ul class=&quot;ul2&quot;&gt;
&lt;li class=&quot;li2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;Open-source&lt;/span&gt;&lt;/li&gt;
&lt;ul class=&quot;ul3&quot;&gt;
&lt;li class=&quot;li2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;Jmeter - Apache project, v1.0 1998&lt;/span&gt;&lt;/li&gt;
&lt;li class=&quot;li2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;Gatling - Enterprise support by Frontline&lt;/span&gt;&lt;/li&gt;
&lt;li class=&quot;li2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;K6 - Enterprise support by LoadImpact&lt;/span&gt;&lt;/li&gt;
&lt;li class=&quot;li2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;Locust&lt;/span&gt;&lt;/li&gt;
&lt;li class=&quot;li2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;and many others&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li class=&quot;li2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;Commercial&lt;/span&gt;&lt;/li&gt;
&lt;ul class=&quot;ul3&quot;&gt;
&lt;li class=&quot;li2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;LoadRunner by Microfocus (previously Mercury - HP)&lt;/span&gt;&lt;/li&gt;
&lt;li class=&quot;li2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;Blazemeter - support multiple opensource tools&lt;/span&gt;&lt;/li&gt;
&lt;li class=&quot;li2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;LoadUI Pro by Smartbear&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;li class=&quot;li1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;strong&gt;Databases&lt;/strong&gt;&lt;/span&gt;&lt;/li&gt;
&lt;ul class=&quot;ul2&quot;&gt;
&lt;li class=&quot;li2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;InfluxDB - Opensourced times series database&lt;/span&gt;&lt;/li&gt;
&lt;li class=&quot;li2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;MongoDB - Opensourced document-based database&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li class=&quot;li1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;strong&gt;Reporting tools&lt;/strong&gt;&lt;/span&gt;&lt;/li&gt;
&lt;ul class=&quot;ul2&quot;&gt;
&lt;li class=&quot;li2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;Grafana&lt;/span&gt;&lt;/li&gt;
&lt;li class=&quot;li2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;Kibana&lt;/span&gt;&lt;/li&gt;
&lt;li class=&quot;li2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;Graphite&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li class=&quot;li1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;strong&gt;Orchestration Tools&lt;/strong&gt;&lt;/span&gt;&lt;/li&gt;
&lt;ul class=&quot;ul2&quot;&gt;
&lt;li class=&quot;li2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;Docker Compose&lt;/span&gt;&lt;/li&gt;
&lt;li class=&quot;li2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;Kubernetes&lt;/span&gt;&lt;/li&gt;
&lt;li class=&quot;li2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;Prometheus&lt;/span&gt;&lt;/li&gt;
&lt;li class=&quot;li2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;Mesosphere DC/OS&lt;/span&gt;&lt;/li&gt;
&lt;li class=&quot;li2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;And others&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li class=&quot;li1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;strong&gt;Automation Tools&lt;/strong&gt;&lt;/span&gt;&lt;/li&gt;
&lt;ul class=&quot;ul2&quot;&gt;
&lt;li class=&quot;li2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;And others&lt;/span&gt;&lt;/li&gt;
&lt;li class=&quot;li2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;Jenkins&lt;/span&gt;&lt;/li&gt;
&lt;li class=&quot;li2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;TravisCI&lt;/span&gt;&lt;/li&gt;
&lt;li class=&quot;li2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;TeamCity&lt;/span&gt;&lt;/li&gt;
&lt;li class=&quot;li2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;CircleCI&lt;/span&gt;&lt;/li&gt;
&lt;li class=&quot;li2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;Code Ship&lt;/span&gt;&lt;/li&gt;
&lt;li class=&quot;li2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;Gitlab CI&quot;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/span&gt;
    &lt;/span&gt;&lt;/span&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;
&lt;div&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;
A Way of Implementation of K6 for Automated Performance Testing&lt;/span&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;
&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;a href=&quot;https://grafana.com/api/dashboards/2587/logos/small?lastmod=1500414891000&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img alt=&quot;k6 Load Testing Results&quot; border=&quot;0&quot; src=&quot;https://grafana.com/api/dashboards/2587/logos/small?lastmod=1500414891000&quot; /&gt;&lt;/a&gt;&lt;b&gt;K6&lt;/b&gt; is an open-source performance testing tool. It is designed for developers, it gives us many good features to run tests in a safer, faster, easier integrated way. Very easy to integrate it to CI/CD.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;b&gt;Some of the Good Features of K6 are&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;div&gt;
&lt;div&gt;
Precious in performance, among the top 5 in comparison&lt;/div&gt;
&lt;/div&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;
                &lt;div&gt;
Written in Golang, allows writing test script in Javascript&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
                &lt;div&gt;
Already dockerized&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
                &lt;div&gt;
Easy to connect to DB (such as InfluxDB)&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
                &lt;div&gt;
Easy to create reports (Grafana)&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
                &lt;div&gt;
Has build-in Thresholds&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
                &lt;div&gt;
And many others&lt;/div&gt;
&lt;/li&gt;
&lt;/span&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;b&gt;K6&lt;/b&gt; has rich libraries that you can use in the script. The request is sending by HTTP from k6/http. Grouping is letting you run the same kind of request in a group. Check the simple test scripts which have get requests to the three URLs and post requests to register endpoint with dynamic data.&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/gunesmes/57df8a84a8d4af4dae275fd7f8190015.js?file=load_test-k6.js&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Command-line supports many parameters to run your scripts. For a load test, we have fixed virtual user and fixed test duration so the run script should look like&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/gunesmes/57df8a84a8d4af4dae275fd7f8190015.js?file=run_k6.sh&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
For a spike test, we should load the system with a nominal load and the load should increase suddenly. Let’s focus on at the --stage option for this.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/gunesmes/57df8a84a8d4af4dae275fd7f8190015.js?file=run-k6-spike.sh&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
K6 can be easily integrated with an InfluxDB instance so in the setup we are also running the docker-compose to create an InfluxDB instance with will use for feeding Grafana dashboard to visualize all the data.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/gunesmes/57df8a84a8d4af4dae275fd7f8190015.js?file=docker-compose.yml&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The K6 sends the results to the InfluxDB, we can virtualize this data with Grafana. You can use the dashboard created by the &lt;a href=&quot;https://grafana.com/grafana/dashboards/2587&quot; target=&quot;_blank&quot;&gt;LoadImpact&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlfT_r2KvxmUvA7PFbIW5SJKXAQjNOR0npxFdCGT-YaIZqrMMpDzFYghy5w1M5NQRZvm7smNiTxJIXtATZlyUHqtsEmKJzXtymyZZobDJv0X7tmlfslsRU1UeA1CeW4dEmRA1eoQ5qQ9A/s1600/k6-grafana-dashboard.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;779&quot; data-original-width=&quot;1197&quot; height=&quot;416&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlfT_r2KvxmUvA7PFbIW5SJKXAQjNOR0npxFdCGT-YaIZqrMMpDzFYghy5w1M5NQRZvm7smNiTxJIXtATZlyUHqtsEmKJzXtymyZZobDJv0X7tmlfslsRU1UeA1CeW4dEmRA1eoQ5qQ9A/s640/k6-grafana-dashboard.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Add these scripts to your CI/CD pipeline to run an automated performance test and see the result in Jenkins. To see all the scripts and data check this &lt;a href=&quot;https://github.com/gunesmes/testhive-django-unittest-behave-selenium-newman-locust-jenkins/tree/master/performance-test/k6&quot; target=&quot;_blank&quot;&gt;repo on Github&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;span id=&quot;docs-internal-guid-3a7a38bd-7fff-2b86-a71c-1a5ba1ba3ffa&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img height=&quot;301&quot; src=&quot;https://lh3.googleusercontent.com/SqDlzukd_8IfGJ7iHT7_SuPUJS6FwgiaLXhI3gheWYX1s-bBpjy8lpQHpv-Otw8Hk5ZkRtB_w_AOzIcul4Gbgmturep0Mt4ngP-nEBFzCnr13r1cxhwQ5S55rjwpb8-iIlf0gx-qMgE&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;Mesut Güneş&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/9127337747640607069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/9127337747640607069'/><link rel='alternate' type='text/html' href='http://www.testrisk.com/2019/12/automated-performance-testing-with-k6.html' title='Automated Performance Testing with K6'/><author><name>Mesut Güneş</name><uri>http://www.blogger.com/profile/06466018199442112635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhksmGlHvp6B2fPh5-Ci5g2Ek3nRvfSdq2utvdyhnryXZklRvpFlzP3eIBz3y293tW1q2N1RoPfPSvGGcAydIDlFj2h39vGzq85o7GRl3wG1Q2ez99aSFJE9AdZT8DAQ80/s220/10371365_778508612195086_5198865414746812917_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlfT_r2KvxmUvA7PFbIW5SJKXAQjNOR0npxFdCGT-YaIZqrMMpDzFYghy5w1M5NQRZvm7smNiTxJIXtATZlyUHqtsEmKJzXtymyZZobDJv0X7tmlfslsRU1UeA1CeW4dEmRA1eoQ5qQ9A/s72-c/k6-grafana-dashboard.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-8264657588618504333.post-7332169600255715644</id><published>2019-12-31T05:00:00.001-08:00</published><updated>2020-01-02T12:01:24.921-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blazemeter"/><category scheme="http://www.blogger.com/atom/ns#" term="gatling"/><category scheme="http://www.blogger.com/atom/ns#" term="Jmeter"/><category scheme="http://www.blogger.com/atom/ns#" term="k6"/><category scheme="http://www.blogger.com/atom/ns#" term="Load Test"/><category scheme="http://www.blogger.com/atom/ns#" term="LoadRunner"/><category scheme="http://www.blogger.com/atom/ns#" term="LoadUI"/><category scheme="http://www.blogger.com/atom/ns#" term="locust"/><category scheme="http://www.blogger.com/atom/ns#" term="Performance"/><category scheme="http://www.blogger.com/atom/ns#" term="stress"/><category scheme="http://www.blogger.com/atom/ns#" term="Test Automation"/><category scheme="http://www.blogger.com/atom/ns#" term="testing"/><category scheme="http://www.blogger.com/atom/ns#" term="tools"/><title type='text'>Basics about Performance Testing Tools</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-6xu2s1MpA8ZE2YZbhkKuwmX2KO7BD1ol2oi_386mF-5YXbb_LQsqObxVUT9SLmGCIeDXPDLa-HO4iRq1J_Yf1uw7_wKQ4WIxHBZPiW-PDPqlSi5U4lCUE0r0MZrx7aNgOEaNpBE2Wu0/s1600/performance-testing-tools-comparison.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;319&quot; data-original-width=&quot;422&quot; height=&quot;150&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-6xu2s1MpA8ZE2YZbhkKuwmX2KO7BD1ol2oi_386mF-5YXbb_LQsqObxVUT9SLmGCIeDXPDLa-HO4iRq1J_Yf1uw7_wKQ4WIxHBZPiW-PDPqlSi5U4lCUE0r0MZrx7aNgOEaNpBE2Wu0/s200/performance-testing-tools-comparison.png&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br class=&quot;Apple-interchange-newline&quot; /&gt;I had an opportunity to give a speech about how we can automate performance testing in CI/CD pipeline in a conference held in Istanbul for the first time &quot;&lt;a href=&quot;https://www.testingmind.com/event/test-automation-and-digital-qa-summit-istanbul-2019/&quot; target=&quot;_blank&quot;&gt;Test automation and Digital QA Submit Istanbul, #TAS19&lt;/a&gt;&quot;. My subject was &quot;Automated Performance Testing&quot;, the first part of the speech is to explain what is performance tests and the second part is to explain performance tools, and the last section is to explain what is automated performance testing and how to implement it to CI/CD.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;In this post, I want to explain my thoughts about the basics of performance testing tools. Next posts will focus on automated performance testing and using K6 as a performance testing tool.&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;How to Evaluate Performance Testing Tools&lt;/span&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Before diving into the performance testing tools and technologies we have in the industry, we should define the criteria for evaluation. Each tool has its own advantages or disadvantages and similarity between ancestors or others. When we start to use the tools and try to learn it, most of the time the learning curve is having a critical factor. It is fine since the learning is and using it efficiently is a huge impact for tools but after this period the performance of the tool during running it becomes more critical and having support from open-source community or consultancy companies is another very important factor. Let&#39;s list the factors for evaluating performance testing tools:&lt;/span&gt;&lt;/div&gt;
&lt;h4&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Criteria for Performance Testing Tools Evaluation:&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;b&gt;Learning curve&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Using a tool, in the beginning, can be difficult so a good tool should have well-defined documents and a better one ready project to run&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Tools can have many features so running simple scripts doesn&#39;t mean that the tool is efficiently using for complex test scenarios. A good tool also support complex cases to handle real-world scenarios&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;b&gt;Price&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;None of us wants to spend many if there is a free version of the tools. If the case is the money then you should go with the open-source tools but don&#39;t forget to search that the tool has a good community so that you get some support from there.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Some tools are created by the community so you can use without paying money, however if you want to get some enterprise-level support, some companies are giving this supports for the tools&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;b&gt;Supports&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Be sure that tool has a supportive community if it is open-source&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Good company support for commercial tools&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;b&gt;Maturity&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Tools may have defects, so having a buggy tool integration in your environment may cause maintenance costs. Before investing in a tools check the known issues about the tools.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;b&gt;Languages supported for performance testing scripts&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;One can not have a profession in many languages so the supported language should include your favorite one&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;In general, performance scripts are easy in the beginning but if you want to cover complex scenarios with scalable test environment then the language may be a barrier to handle these situations&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;b&gt;Performance of the tool itself&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Testing tools require resources to create virtual users and requests. This resource may increase exponentially if you want to create lots of users for your stress tests so be sure that how the performance of the tools itself&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Generally, the performance is evaluating by AB - Apache Benchmark tool. The response time and resource which is consuming by the tools are comparing with the result of the AB. To get the idea about the performance of some well-known performance testing tools, &lt;a href=&quot;https://blog.loadimpact.com/comparing-load-testing-tools&quot; target=&quot;_blank&quot;&gt;read this blog&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;b&gt;Integration to other necessary tools&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;How you can integrate it with databases, reporting tools, CI/CD and so on&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;b&gt;Embed features&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Separated load creation&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Load distribution&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Writing scenarios&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Grouping the scenarios&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Setting thresholds for automated performance tests&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;b&gt;CLI supports&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Supporting only GUI or CLI&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Working headlessly&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Dockerized or can be dockerized easily&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Performance Testing Tools&lt;/span&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;We have a variety of tools in the industry, they change from open source to commercial and/or commercial support; newly started to 20+ years old performance testing tools. Some of the well-known performance tools, that I have experienced and I can suggest you, are as follows&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;
&lt;/span&gt;
&lt;br /&gt;
&lt;h4&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;
Open-source&lt;/span&gt;&lt;/h4&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;
&lt;/span&gt;
&lt;div&gt;
&lt;ul&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;div&gt;
Jmeter - Apache project, v1.0 1998&lt;/div&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;
Gatling - Enterprise support by Frontline&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div&gt;
K6 - Enterprise support by LoadImpact&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div&gt;
Locust&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div&gt;
and many others&lt;/div&gt;
&lt;/li&gt;
&lt;/span&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;
&lt;h4&gt;
Commercial&lt;/h4&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;div&gt;
LoadRunner by Microfocus (previously Mercury - HP)&lt;/div&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;
Blazemeter - support multiple opensource tools&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div&gt;
LoadUI Pro by Smartbear&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;and many others&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;Mesut Güneş&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/7332169600255715644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/7332169600255715644'/><link rel='alternate' type='text/html' href='http://www.testrisk.com/2019/12/basics-about-performance-testing-tools.html' title='Basics about Performance Testing Tools'/><author><name>Mesut Güneş</name><uri>http://www.blogger.com/profile/06466018199442112635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhksmGlHvp6B2fPh5-Ci5g2Ek3nRvfSdq2utvdyhnryXZklRvpFlzP3eIBz3y293tW1q2N1RoPfPSvGGcAydIDlFj2h39vGzq85o7GRl3wG1Q2ez99aSFJE9AdZT8DAQ80/s220/10371365_778508612195086_5198865414746812917_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-6xu2s1MpA8ZE2YZbhkKuwmX2KO7BD1ol2oi_386mF-5YXbb_LQsqObxVUT9SLmGCIeDXPDLa-HO4iRq1J_Yf1uw7_wKQ4WIxHBZPiW-PDPqlSi5U4lCUE0r0MZrx7aNgOEaNpBE2Wu0/s72-c/performance-testing-tools-comparison.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-8264657588618504333.post-6319588131111201705</id><published>2019-12-16T01:31:00.000-08:00</published><updated>2020-01-02T12:04:15.699-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="capacity"/><category scheme="http://www.blogger.com/atom/ns#" term="endurance"/><category scheme="http://www.blogger.com/atom/ns#" term="load"/><category scheme="http://www.blogger.com/atom/ns#" term="Load Test"/><category scheme="http://www.blogger.com/atom/ns#" term="Performance"/><category scheme="http://www.blogger.com/atom/ns#" term="soak"/><category scheme="http://www.blogger.com/atom/ns#" term="spike"/><category scheme="http://www.blogger.com/atom/ns#" term="stress"/><category scheme="http://www.blogger.com/atom/ns#" term="volume"/><title type='text'>Performance Testing</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;I had an opportunity to give a speech about how we can automate performance testing in CI/CD pipeline in a conference held in Istanbul for the first time &quot;&lt;a href=&quot;https://www.testingmind.com/event/test-automation-and-digital-qa-summit-istanbul-2019/&quot; target=&quot;_blank&quot;&gt;Test automation and Digital QA Submit Istanbul, #TAS19&lt;/a&gt;&quot;. My subject was &quot;Automated Performance Testing&quot;, the first part of the speech is to explain what is performance tests.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;In this post, I want to explain my thoughts about performance testing. Next posts will focus on automated performance testing and using K6 as a performance testing tool.&lt;/span&gt;&lt;/div&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif; font-weight: normal;&quot;&gt;What is Performance Testing By Definition&lt;/span&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 3pt; text-align: justify;&quot;&gt;
&lt;span id=&quot;docs-internal-guid-e1c6b1c1-7fff-b22e-612d-6d7af418b19e&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Defining the performance of the system by testing the &lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;functionalities&lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; of the system in terms of the &lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;non-functionalities&lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span id=&quot;docs-internal-guid-e1c6b1c1-7fff-b22e-612d-6d7af418b19e&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span id=&quot;docs-internal-guid-e1c6b1c1-7fff-b22e-612d-6d7af418b19e&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span id=&quot;docs-internal-guid-e1c6b1c1-7fff-b22e-612d-6d7af418b19e&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 16pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span id=&quot;docs-internal-guid-e1c6b1c1-7fff-b22e-612d-6d7af418b19e&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Performance Testing is&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span id=&quot;docs-internal-guid-e1c6b1c1-7fff-b22e-612d-6d7af418b19e&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;ul&gt;&lt;span id=&quot;docs-internal-guid-e1c6b1c1-7fff-b22e-612d-6d7af418b19e&quot;&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;span id=&quot;docs-internal-guid-e1c6b1c1-7fff-b22e-612d-6d7af418b19e&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;A &lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;non-functional&lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; testing&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;span id=&quot;docs-internal-guid-e1c6b1c1-7fff-b22e-612d-6d7af418b19e&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Testing the &lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;functionalities&lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; of the system&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;span id=&quot;docs-internal-guid-e1c6b1c1-7fff-b22e-612d-6d7af418b19e&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Both &lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;black-box&lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; and &lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;white-box&lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; testing&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;span id=&quot;docs-internal-guid-e1c6b1c1-7fff-b22e-612d-6d7af418b19e&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Defining how the system works &lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;under any loads&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;span id=&quot;docs-internal-guid-e1c6b1c1-7fff-b22e-612d-6d7af418b19e&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Applied under &lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;different load levels&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;span id=&quot;docs-internal-guid-e1c6b1c1-7fff-b22e-612d-6d7af418b19e&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Applied under &lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;different load increments&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;span id=&quot;docs-internal-guid-e1c6b1c1-7fff-b22e-612d-6d7af418b19e&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Applied under &lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;different durations&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/span&gt;&lt;/ul&gt;
&lt;span id=&quot;docs-internal-guid-e1c6b1c1-7fff-b22e-612d-6d7af418b19e&quot;&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;color: #434343; font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;font-weight: normal; white-space: pre-wrap;&quot;&gt;What is Performance Testing in Terms of Process&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 3pt; text-align: justify;&quot;&gt;
&lt;span id=&quot;docs-internal-guid-456b1baf-7fff-a9f9-0f52-aaf114a3001a&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Performance testing should be also executed in a &lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;process&lt;/span&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;. Performance engineers should ensure that they collected requirements, created the correct amount of virtual users, created test scenarios and they can execute them. As a final, they should check the result and the system, if required after fixing, re-execution may be needed.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span id=&quot;docs-internal-guid-456b1baf-7fff-a9f9-0f52-aaf114a3001a&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span id=&quot;docs-internal-guid-456b1baf-7fff-a9f9-0f52-aaf114a3001a&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;color: #434343; font-size: 12pt; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span id=&quot;docs-internal-guid-456b1baf-7fff-a9f9-0f52-aaf114a3001a&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDs5n41Qk_JFl-2P0l8Dp_1GmXKr5U87_imngqGpxEL3Q2qYuIIvteHpnUJot0QtjVp-52DeG1GRqH913CqZNyJuQoWweUJoBsukrhYhLa9hlTm4aIUOOe6Ih6Ej8XupwDizrPLZdKpug/s1600/performance-testing-interms-of-process.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;460&quot; data-original-width=&quot;910&quot; height=&quot;322&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDs5n41Qk_JFl-2P0l8Dp_1GmXKr5U87_imngqGpxEL3Q2qYuIIvteHpnUJot0QtjVp-52DeG1GRqH913CqZNyJuQoWweUJoBsukrhYhLa9hlTm4aIUOOe6Ih6Ej8XupwDizrPLZdKpug/s640/performance-testing-interms-of-process.png&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Performance testing should start with planning, in this stage, you should align with customer/user needs. Without understanding the requirements any test can not be evaluated. Two main parts of the testing are verification and validation. By verification, we are checking the requirements and by validation, we are checking these requirements are valid with the global expectation at least the targetted users. Therefore this stage is very important.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;In the next steps, you should create performance test scripts and create test environment and in the execution stage, you can run test scripts against the requirements in the reserved/isolated performance testing environment.&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;In the monitoring stage, you should check that the execution is happening as expected by checking the system. The performance scripts create requests which are reached to the related part of the system and they create related data on the databases/caches. Which means that your scripts run as expected.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;In the analyzing stage, you can check the result and if necessary you can fix some configurative, network-related or database-related problems. After that if necessary, you can get ready for the next iteration. These iterations should keep going until the desired level of confidence is gathered.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h3 style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif; font-weight: normal;&quot;&gt;Types of Performance Testing&lt;/span&gt;&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span id=&quot;docs-internal-guid-43c50443-7fff-00ee-112f-6f5c5a013a17&quot;&gt;&lt;span style=&quot;color: #434343; font-family: &amp;quot;verdana&amp;quot;; font-size: 12pt; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Types of performance testing depend on the strategy that applied during the test by means of the loads, the duration and increment of the load.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h4 style=&quot;text-align: justify;&quot;&gt;
Load Test&lt;/h4&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The load test is to understand the behavior of the system under a specific load. It is performing under a specific amount of the load to check if the system gives the expected responses with keeping it stable for the long term&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Load Test is&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span id=&quot;docs-internal-guid-e1c6b1c1-7fff-b22e-612d-6d7af418b19e&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;
Basic form&lt;/div&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span id=&quot;docs-internal-guid-e1c6b1c1-7fff-b22e-612d-6d7af418b19e&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;
Widely known-form&lt;/div&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span id=&quot;docs-internal-guid-e1c6b1c1-7fff-b22e-612d-6d7af418b19e&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;
A specific amount of load&lt;/div&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span id=&quot;docs-internal-guid-e1c6b1c1-7fff-b22e-612d-6d7af418b19e&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;
Checking the expected response time&lt;/div&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span id=&quot;docs-internal-guid-e1c6b1c1-7fff-b22e-612d-6d7af418b19e&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;
Giving a result that users are facing&amp;nbsp;&lt;/div&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h4 style=&quot;text-align: justify;&quot;&gt;
Stress Test&lt;/h4&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The stress test is to test the upper boundary of the system. When the load is increased to the level of the upper boundary, the stress test aims to get the response of the system.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Stress Test is&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span id=&quot;docs-internal-guid-e1c6b1c1-7fff-b22e-612d-6d7af418b19e&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;
Testing the upper boundary of the system&lt;/div&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span id=&quot;docs-internal-guid-e1c6b1c1-7fff-b22e-612d-6d7af418b19e&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;
Needing more resources&lt;/div&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span id=&quot;docs-internal-guid-e1c6b1c1-7fff-b22e-612d-6d7af418b19e&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;
Needing more investigation for boundaries&lt;/div&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span id=&quot;docs-internal-guid-e1c6b1c1-7fff-b22e-612d-6d7af418b19e&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;
Needing more attention&lt;/div&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span id=&quot;docs-internal-guid-e1c6b1c1-7fff-b22e-612d-6d7af418b19e&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;
Prone to break the system, aka: soak, endurance testing&lt;/div&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span id=&quot;docs-internal-guid-e1c6b1c1-7fff-b22e-612d-6d7af418b19e&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;
Preparation for promotion like black friday, 11.11&amp;nbsp;&lt;/div&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h4 style=&quot;text-align: justify;&quot;&gt;
Soak - Endurance Test&lt;/h4&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Soak test is to test the upper boundary of the system for a prolonged time. Soak is good if you are not sure the expected amount of the user for some occasions.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Soak Test is&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span id=&quot;docs-internal-guid-e1c6b1c1-7fff-b22e-612d-6d7af418b19e&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;
Testing the upper boundary of the system&lt;/div&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span id=&quot;docs-internal-guid-e1c6b1c1-7fff-b22e-612d-6d7af418b19e&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;
Testing the system for a prolonged time&lt;/div&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span id=&quot;docs-internal-guid-e1c6b1c1-7fff-b22e-612d-6d7af418b19e&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;
Needing more resources&lt;/div&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span id=&quot;docs-internal-guid-e1c6b1c1-7fff-b22e-612d-6d7af418b19e&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;
Needing more investigation for boundaries&lt;/div&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span id=&quot;docs-internal-guid-e1c6b1c1-7fff-b22e-612d-6d7af418b19e&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;
Needing more attention&lt;/div&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span id=&quot;docs-internal-guid-e1c6b1c1-7fff-b22e-612d-6d7af418b19e&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;
Aims to break the system&lt;/div&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span id=&quot;docs-internal-guid-e1c6b1c1-7fff-b22e-612d-6d7af418b19e&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;
Preparation for campaigns like black Friday, 11.11&amp;nbsp;&lt;/div&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h4 style=&quot;text-align: justify;&quot;&gt;
Spike Test&lt;/h4&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Spike test is to test the behavior of the system when the amount of load is suddenly increased and decreased. It aims to find system failures when loads is changing to an unexpected amount.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Spike Test is&lt;/div&gt;
&lt;ul style=&quot;font-weight: 400;&quot;&gt;
&lt;li&gt;Testing the sudden increase and decrease of loads&lt;/li&gt;
&lt;li&gt;Requiring more load generations
&lt;ul&gt;
&lt;li&gt;depends on the tools (load the system, then spike it)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Good for some occasion like simulating&amp;nbsp;
&lt;ul&gt;
&lt;li&gt;push notifications for e-coms&lt;/li&gt;
&lt;li&gt;announcing critical news&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;text-align: justify;&quot;&gt;
Capacity Test&lt;/h4&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Capacity testing is aiming to find the maximum amount of the user that the system can handle. By this test we can find the how many user can use the system.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Capacity Test is&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span id=&quot;docs-internal-guid-e1c6b1c1-7fff-b22e-612d-6d7af418b19e&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;
Testing the max user&lt;/div&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span id=&quot;docs-internal-guid-e1c6b1c1-7fff-b22e-612d-6d7af418b19e&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;
Finding the behavior when more users join&lt;/div&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span id=&quot;docs-internal-guid-e1c6b1c1-7fff-b22e-612d-6d7af418b19e&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;
Providing info about the loss of user data&lt;/div&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h4 style=&quot;text-align: justify;&quot;&gt;
Volume Test&lt;/h4&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The volume test is testing the database directly instead of the whole system. With the volume testing, we can find if there is any bottleneck with the database system.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Spike Test is&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span id=&quot;docs-internal-guid-e1c6b1c1-7fff-b22e-612d-6d7af418b19e&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;
Testing the database&amp;nbsp;&lt;/div&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span id=&quot;docs-internal-guid-e1c6b1c1-7fff-b22e-612d-6d7af418b19e&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;
Testing the with a large amount of data&lt;/div&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;Mesut Güneş&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/6319588131111201705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/6319588131111201705'/><link rel='alternate' type='text/html' href='http://www.testrisk.com/2019/12/performance-testing.html' title='Performance Testing'/><author><name>Mesut Güneş</name><uri>http://www.blogger.com/profile/06466018199442112635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhksmGlHvp6B2fPh5-Ci5g2Ek3nRvfSdq2utvdyhnryXZklRvpFlzP3eIBz3y293tW1q2N1RoPfPSvGGcAydIDlFj2h39vGzq85o7GRl3wG1Q2ez99aSFJE9AdZT8DAQ80/s220/10371365_778508612195086_5198865414746812917_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDs5n41Qk_JFl-2P0l8Dp_1GmXKr5U87_imngqGpxEL3Q2qYuIIvteHpnUJot0QtjVp-52DeG1GRqH913CqZNyJuQoWweUJoBsukrhYhLa9hlTm4aIUOOe6Ih6Ej8XupwDizrPLZdKpug/s72-c/performance-testing-interms-of-process.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-8264657588618504333.post-312488068751807851</id><published>2019-12-06T00:47:00.000-08:00</published><updated>2019-12-06T00:59:05.039-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="android"/><category scheme="http://www.blogger.com/atom/ns#" term="Automation"/><category scheme="http://www.blogger.com/atom/ns#" term="espresso"/><category scheme="http://www.blogger.com/atom/ns#" term="mobil test otomasyonu"/><category scheme="http://www.blogger.com/atom/ns#" term="mobile testing"/><category scheme="http://www.blogger.com/atom/ns#" term="Test Automation"/><title type='text'>Getting the text of elements in Espresso</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCJxhmNtKR8vO77qhYki3oK-tAgF7b0Y_gb-vWMqGMsH8Tt9tZRYmQsqCrr76rsQWsmy0A2msDLzVy8FRJHpbLvpyvCJZ9PtsEyhJdjmtptM9WQi8papvRHs_709-sw1zc33spnlYtAM0/s1600/espresso-android-test-automation.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;378&quot; data-original-width=&quot;301&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCJxhmNtKR8vO77qhYki3oK-tAgF7b0Y_gb-vWMqGMsH8Tt9tZRYmQsqCrr76rsQWsmy0A2msDLzVy8FRJHpbLvpyvCJZ9PtsEyhJdjmtptM9WQi8papvRHs_709-sw1zc33spnlYtAM0/s200/espresso-android-test-automation.png&quot; width=&quot;158&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Espresso is not designed to play with UI objects. When you are considering it in terms of capability for testing, it needs to be improved more. It is not as mature as Android SDK itself so you need to customize somethings to handle your requirements. Even you may need to use other tools like UIAutomator integrated into your test suite.&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
In this post, I want to show how we can handle getting the text of ViewInteraction view.&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
ViewInteraction view does not have &lt;b&gt;.text&lt;/b&gt; function for getting the text of the object since it is designed to interact with the object. Another method which may solve the problem of the assertion is to use the &lt;b&gt;.check&lt;/b&gt; for matching the text, as follows:&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;script src=&quot;https://gist.github.com/gunesmes/9eceda390b244bdfc72a465e1ab4741f.js?file=viewAssertion.kt&quot;&gt;&lt;/script&gt;

&lt;br /&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
However, this method is not a good way to assert that a certain field text equals a value. For this purpose, we need to get the text of the element and assert it. To get the text of the ViewInteraction element, we need to cast it to TextView with getting the assignable form of it then extract the text that the view holder has. You can use the following function for this assertion:&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;script src=&quot;https://gist.github.com/gunesmes/9eceda390b244bdfc72a465e1ab4741f.js?file=getText.kt&quot;&gt;&lt;/script&gt;

&lt;br /&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Using it simple now, just call it whatever you want:&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;script src=&quot;https://gist.github.com/gunesmes/9eceda390b244bdfc72a465e1ab4741f.js?file=usingGetText.kt&quot;&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;Mesut Güneş&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/312488068751807851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/312488068751807851'/><link rel='alternate' type='text/html' href='http://www.testrisk.com/2019/12/getting-text-of-element-in-espresso.html' title='Getting the text of elements in Espresso'/><author><name>Mesut Güneş</name><uri>http://www.blogger.com/profile/06466018199442112635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhksmGlHvp6B2fPh5-Ci5g2Ek3nRvfSdq2utvdyhnryXZklRvpFlzP3eIBz3y293tW1q2N1RoPfPSvGGcAydIDlFj2h39vGzq85o7GRl3wG1Q2ez99aSFJE9AdZT8DAQ80/s220/10371365_778508612195086_5198865414746812917_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCJxhmNtKR8vO77qhYki3oK-tAgF7b0Y_gb-vWMqGMsH8Tt9tZRYmQsqCrr76rsQWsmy0A2msDLzVy8FRJHpbLvpyvCJZ9PtsEyhJdjmtptM9WQi8papvRHs_709-sw1zc33spnlYtAM0/s72-c/espresso-android-test-automation.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-8264657588618504333.post-4097115964212180400</id><published>2019-05-03T05:33:00.000-07:00</published><updated>2019-05-13T03:20:50.896-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="android"/><category scheme="http://www.blogger.com/atom/ns#" term="espresso"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="kotlin"/><category scheme="http://www.blogger.com/atom/ns#" term="mobile testing"/><category scheme="http://www.blogger.com/atom/ns#" term="shared preference"/><category scheme="http://www.blogger.com/atom/ns#" term="Test Automation"/><title type='text'>How to Set Shared Preferences in Espresso Test for Kotlin and Java</title><content type='html'>&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;I have experienced Espresso and needed to deep dive into Shared Preferences &lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyK6JtPw6SPmGAtMGrBkuTpk9WFComKwgwASw-ALBUPXG1PkSpUhQwQ3kyncJgIbHmLNswEAAwhjFYhMJ3t-iikI6NZGF7R0YaanWisf35W0QHwq08SJwmn5RwmuHN8QvBU361K917G3o/s1600/android_img.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;224&quot; data-original-width=&quot;225&quot; height=&quot;199&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyK6JtPw6SPmGAtMGrBkuTpk9WFComKwgwASw-ALBUPXG1PkSpUhQwQ3kyncJgIbHmLNswEAAwhjFYhMJ3t-iikI6NZGF7R0YaanWisf35W0QHwq08SJwmn5RwmuHN8QvBU361K917G3o/s200/android_img.jpeg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;
just because it is one of the main parameters used in the application we developed. As a long search in the online sources but there are some pretty old documents for Espresso with Java and very few documents about Espresso with Kotlin. In this post, I want to share my experiences with setting &lt;b&gt;Shared Preferences&lt;/b&gt; with Kotlin and Java and how you can use it in your test design. You can follow up the steps for your test project.&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;


&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;Shared Preferences is a way to store user data in local devices so it has been supported since the very early version of Android. Shared Preferences can be stored in the default file or custom file.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h3&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;Using Default File for Shared Preferences&lt;/span&gt;&lt;/h3&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;If your application uses the default file it should stores the shared data in the default file provide by Android as in the following path in the device:&lt;/span&gt;&lt;br /&gt;
&lt;pre style=&quot;background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; color: #24292e; line-height: 1.45; overflow-wrap: normal; overflow: auto; padding: 16px; word-break: normal;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;/data/data/com.package.name/shared_prefs/com.package.name_preferences.xml&lt;/span&gt;&lt;/pre&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;This is the &lt;a href=&quot;https://github.com/aosp-mirror/platform_frameworks_base/blob/625173c148a8b5adedbdfa754c1a03162ccf1fc2/core/java/android/preference/PreferenceManager.java#L548&quot; target=&quot;_blank&quot;&gt;source code&lt;/a&gt; for &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;&lt;b&gt;&lt;i&gt;getDefaultSharedPreferencesName&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/gunesmes/76b0144f6f91250a5c96b14fa619a59c.js?file=getDefaultSharedPreferencesName.java&quot;&gt;&lt;/script&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;
&lt;script src=&quot;https://gist.github.com/gunesmes/76b0144f6f91250a5c96b14fa619a59c.js?file=etDefaultSharedPreferencesName.java&quot;&gt;&lt;/script&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;For this case, you can set/clear/get shared preferences by the following method:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;script src=&quot;https://gist.github.com/gunesmes/76b0144f6f91250a5c96b14fa619a59c.js?file=setDefaultSharedPreferences.kt&quot;&gt;&lt;/script&gt;
&lt;br /&gt;
&lt;h3&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;Using Customized File for Shared Preferences&lt;/span&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;The same way. your application can use a custom file to store shared preferences. This time you need to get the name of the .xml file for storing shared preferences. You can find the file in the same path with the default preference file. If the file name is `&lt;b&gt;&lt;i&gt;MyAppSharedPreferences&lt;/i&gt;&lt;/b&gt;`, the file path should be like the following:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre style=&quot;background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; color: #24292e; line-height: 1.45; overflow-wrap: normal; overflow: auto; padding: 16px; word-break: normal;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;/data/data/com.package.name/shared_prefs/MyAppSharedPreferences.xml&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;For this case, you can set/clear/get shared preferences by the following method:&lt;/span&gt;&lt;/div&gt;
&lt;script src=&quot;https://gist.github.com/gunesmes/76b0144f6f91250a5c96b14fa619a59c.js?file=setCustomSharedPreferences.kt&quot;&gt;&lt;/script&gt;

&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;When there is an update in shared preference/application data,&amp;nbsp; we need to launch the application after this update. To do this,&amp;nbsp;&lt;b&gt;launchActivity&lt;/b&gt; should be set to &lt;b&gt;false &lt;/b&gt;during initialization.&lt;/span&gt;&lt;script src=&quot;https://gist.github.com/gunesmes/76b0144f6f91250a5c96b14fa619a59c.js?file=testRule.kt&quot;&gt;&lt;/script&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;See the full code in Kotlin:&lt;/span&gt;&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/gunesmes/76b0144f6f91250a5c96b14fa619a59c.js?file=setCustomSharedPreferenceKotlin.kt&quot;&gt;&lt;/script&gt;

&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;See the full code in Java:&lt;/span&gt;&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/gunesmes/76b0144f6f91250a5c96b14fa619a59c.js?file=setCustomSharedPreferenceJava.java&quot;&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;Mesut Güneş&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/4097115964212180400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/4097115964212180400'/><link rel='alternate' type='text/html' href='http://www.testrisk.com/2019/05/how-to-set-shared-preferences-in.html' title='How to Set Shared Preferences in Espresso Test for Kotlin and Java'/><author><name>Mesut Güneş</name><uri>http://www.blogger.com/profile/06466018199442112635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhksmGlHvp6B2fPh5-Ci5g2Ek3nRvfSdq2utvdyhnryXZklRvpFlzP3eIBz3y293tW1q2N1RoPfPSvGGcAydIDlFj2h39vGzq85o7GRl3wG1Q2ez99aSFJE9AdZT8DAQ80/s220/10371365_778508612195086_5198865414746812917_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyK6JtPw6SPmGAtMGrBkuTpk9WFComKwgwASw-ALBUPXG1PkSpUhQwQ3kyncJgIbHmLNswEAAwhjFYhMJ3t-iikI6NZGF7R0YaanWisf35W0QHwq08SJwmn5RwmuHN8QvBU361K917G3o/s72-c/android_img.jpeg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-8264657588618504333.post-3774961330382432710</id><published>2019-01-03T04:53:00.001-08:00</published><updated>2020-04-14T07:41:55.332-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Automation"/><category scheme="http://www.blogger.com/atom/ns#" term="CD"/><category scheme="http://www.blogger.com/atom/ns#" term="CI"/><category scheme="http://www.blogger.com/atom/ns#" term="devops"/><category scheme="http://www.blogger.com/atom/ns#" term="docker"/><category scheme="http://www.blogger.com/atom/ns#" term="microservice"/><category scheme="http://www.blogger.com/atom/ns#" term="newman"/><category scheme="http://www.blogger.com/atom/ns#" term="postman"/><category scheme="http://www.blogger.com/atom/ns#" term="QA"/><category scheme="http://www.blogger.com/atom/ns#" term="services"/><category scheme="http://www.blogger.com/atom/ns#" term="Test Automation"/><title type='text'>(Micro) Service Testing with Postman - Newman - Docker</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;Postman seems to become a defacto tool for service testing&amp;nbsp;because the Postman is very user-friendly, easy-to-learn, all-in-one, lightweight and collaborating tool. Postman has been used for a long time but recently it has growing popularity because of a stable native application, collaboration&amp;nbsp;feature after version 6.2, sharing of collections for team, interactive working with the team, mocks for isolated testing, environments for running the test for different test environments such as local, development, stage ... and many more features. For me,&amp;nbsp;one of the biggest features is easy-to-use&amp;nbsp;for everyone in a team so everyone in a&amp;nbsp;team can use and update a postman collection easily. In this post, I want to explain how postman&amp;nbsp;can be used efficiently.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;h3&gt;
&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;Testing a Service and Writing Tests&lt;/span&gt;&lt;/h3&gt;
&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;With postman testing service is simple. Postman supports many methods like &lt;b&gt;POST&lt;/b&gt;, &lt;b&gt;GET&lt;/b&gt;, &lt;b&gt;PUT&lt;/b&gt;, &lt;b&gt;PATCH&lt;/b&gt;. Just select the correct method and hit the service URL&amp;nbsp;you want to test. Postman also has everything that you need for complex requests headers, body, and parameters list. If you need something&amp;nbsp;to prepare before sending the test request you can do it in the &#39;Pre-request Script&#39;. If you need authorization&amp;nbsp;you can add it &#39;Authorization&#39; part which is an alternative to adding &#39;Authorization&#39; parameter in the &#39;Header&#39; section. If you want to check the not only the status code but also returning data you can add some assertions in the &#39;Tests&#39; section. Postman supports &lt;a href=&quot;https://www.chaijs.com/api/bdd/&quot; target=&quot;_blank&quot;&gt;Chai Assertion Library&lt;/a&gt;&amp;nbsp;as BDD you can add self-descriptive assertion functions to your tests.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNFmD7_zCZ5vIttRVzJ3Lis34RCadbixJjy75MlewRB4Li2NxyOAexlrDdq3AfPwINgabXE1e-9fZIoN9Z4nYA1K84FTtwOZS3I_w7Wy71LdLIc9bv56OF0sMZqY-GfmHp4R66W6DCJfQ/s1600/postman-newman-testing-service-and-writing-tests.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;671&quot; data-original-width=&quot;1600&quot; height=&quot;268&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNFmD7_zCZ5vIttRVzJ3Lis34RCadbixJjy75MlewRB4Li2NxyOAexlrDdq3AfPwINgabXE1e-9fZIoN9Z4nYA1K84FTtwOZS3I_w7Wy71LdLIc9bv56OF0sMZqY-GfmHp4R66W6DCJfQ/s640/postman-newman-testing-service-and-writing-tests.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;For complex scenario, you can write some javascript in the tab to simulate real behavior of your users. In the following scenario, a basic payment process is started with a post request and then the status of the request becomes `processing` but after that client needs to check the backend for each second until the status of the process become `completed`. For this scenario, in the `&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #032f62; white-space: pre;&quot;&gt;payment/payment-processing&lt;/span&gt;&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;` request, until the status of this request is `processing` it calls itself recursively. If the status is not `processing` then it calls the next requests with another great feature of postman `&lt;b&gt;setNextRequest&lt;/b&gt;` as&amp;nbsp; `&lt;/span&gt;&lt;span class=&quot;pl-smi&quot; style=&quot;background-color: white; box-sizing: border-box; color: #24292e; white-space: pre;&quot;&gt;postman&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #24292e; white-space: pre;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pl-en&quot; style=&quot;background-color: white; box-sizing: border-box; color: #6f42c1; white-space: pre;&quot;&gt;setNextRequest&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #24292e; white-space: pre;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pl-s&quot; style=&quot;background-color: white; box-sizing: border-box; color: #032f62; white-space: pre;&quot;&gt;&lt;span class=&quot;pl-pds&quot; style=&quot;box-sizing: border-box;&quot;&gt;&quot;&lt;/span&gt;payment/payment-complete&lt;span class=&quot;pl-pds&quot; style=&quot;box-sizing: border-box;&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #24292e; white-space: pre;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;` see the example:&lt;/span&gt;&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/gunesmes/a3e7fa10928cd1122b62f6c87e4da2e6.js?file=postman-recursive-and-setNextRequest-call.js&quot;&gt;&lt;/script&gt;

&lt;br /&gt;
&lt;h3&gt;
&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;Pre-Request Script For Creating Data Dynamically&lt;/span&gt;&lt;/h3&gt;
&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;The pre-request script is designed to run something before the test so we can use it creating/updating/deleting test data for comprehensive test cases. In this section, you can use the embed node packages like `&lt;b&gt;atob&lt;/b&gt;` and `&lt;b&gt;btoa&lt;/b&gt;` for base encryption or `&lt;b&gt;cheerio&lt;/b&gt;` is a form JQuery library to get value from a web object or `&lt;b&gt;CriptoJs&lt;/b&gt;` cryptographic library to encrypt data with AES, DES or SHA. You can check the full list of embed libraries from &lt;a href=&quot;https://learning.getpostman.com/docs/postman/scripts/postman_sandbox_api_reference/#require&quot; target=&quot;_blank&quot;&gt;postman document&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;In the following example, for &lt;b&gt;RSA&lt;/b&gt; encryption with &lt;b&gt;base64&lt;/b&gt;, I use an external web application. In the pre-requests tab of the request, `&lt;b&gt;myData&lt;/b&gt;` is encrypted by sending a request to this web application. This is another important feature of the postman.&lt;/span&gt;&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/gunesmes/a3e7fa10928cd1122b62f6c87e4da2e6.js?file=postman-encrypt-rsa-key-base64.js&quot;&gt;&lt;/script&gt;

&lt;br /&gt;
&lt;h3&gt;
&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;Running Postman Tests With Postman&lt;/span&gt;&lt;/h3&gt;
&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;You can run a collection with Postman collection runner easily by setting environment if necessary. Firs you can get my &lt;a href=&quot;https://www.getpostman.com/collections/ac3d0d9bbd8ae1bcfe5d&quot; target=&quot;_blank&quot;&gt;test collection&lt;/a&gt; which is written against to the blog project on &lt;a href=&quot;https://github.com/gunesmes/code-run-test-automation-ci/tree/master/service-test&quot; target=&quot;_blank&quot;&gt;GitHub&lt;/a&gt;. You can check the `service-test` section since it is a full project including every test that you need in your CI/CD. To run the tests, just click the &lt;b&gt;play button&lt;/b&gt;&amp;nbsp;next to the collection name, it opens the run panel then you click the `&lt;b&gt;Run&lt;/b&gt;` button. See the following images:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1gvRlB7P94sp29LML-YFB2rOrzlj2mKzSNr5EfA44JKQdZvTtEXSJQdBBMxOanwPa-weUB5f2yHzn_jOnVIQMzNuE0ycNpCJEsZBwNOVnVsn_LFL6q__yu3sDSk4IRaSKZQvXs5_-jG4/s1600/how-to-run-postman-collection.png&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;262&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1gvRlB7P94sp29LML-YFB2rOrzlj2mKzSNr5EfA44JKQdZvTtEXSJQdBBMxOanwPa-weUB5f2yHzn_jOnVIQMzNuE0ycNpCJEsZBwNOVnVsn_LFL6q__yu3sDSk4IRaSKZQvXs5_-jG4/s640/how-to-run-postman-collection.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHeoOGDBzxhMPo9J12Nvlu4HOi2CsuB9CJOAyH6j_weP8973czm8mj7XbV-CrL-uonfW8W_YoAQDLN1rmgAkbPRxyCDD8xXPstXqi7D7KZ09neOWFiQGJGxJgt01Pnjru55ZTFVibqLqU/s1600/postman-collection-runner-result.png&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;300&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHeoOGDBzxhMPo9J12Nvlu4HOi2CsuB9CJOAyH6j_weP8973czm8mj7XbV-CrL-uonfW8W_YoAQDLN1rmgAkbPRxyCDD8xXPstXqi7D7KZ09neOWFiQGJGxJgt01Pnjru55ZTFVibqLqU/s640/postman-collection-runner-result.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;h3&gt;
&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;Running Postman Tests With Newman&lt;/span&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;Newman is the CLI companion of postman so that you can run your tests with your environment by CLI. This is developed for integrating your test to CI/CD environment easily. In this example test data is created before the test run for a comprehensive test result. The full command is as follows:&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;You need node first, check this https://nodejs.org/en/download, then install the required packages, newman and newman-report-html:&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;!-- HTML generated using hilite.me --&gt;&lt;div style=&quot;background: #f8f8f8; overflow:auto;width:auto;padding:.2em .4em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;npm install -g newman
npm install -g newman-reporter-html
&lt;/pre&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;to run with collection json:&lt;/span&gt;&lt;/div&gt;
&lt;!-- HTML generated using hilite.me --&gt;&lt;div style=&quot;background: #f8f8f8; overflow:auto;width:auto;padding:.2em .4em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;newman run blog-sample-service.postman_collection.json &lt;span style=&quot;color: #BB6622; font-weight: bold&quot;&gt;\&lt;/span&gt;
 -e blog-local.postman_environment.json &lt;span style=&quot;color: #BB6622; font-weight: bold&quot;&gt;\&lt;/span&gt;
 --reporters cli,html &lt;span style=&quot;color: #BB6622; font-weight: bold&quot;&gt;\&lt;/span&gt;
 --reporter-html-template report-template.hbs
&lt;/pre&gt;&lt;/div&gt;

&lt;br /&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;to run with collection url:&lt;/span&gt;&lt;/div&gt;
&lt;!-- HTML generated using hilite.me --&gt;&lt;div style=&quot;background: #f8f8f8; overflow:auto;width:auto;padding:.2em .4em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;newman run https://www.getpostman.com/collections/ac3d0d9bbd8ae1bcfe5d &lt;span style=&quot;color: #BB6622; font-weight: bold&quot;&gt;\&lt;/span&gt;
 -e blog-local.postman_environment.json &lt;span style=&quot;color: #BB6622; font-weight: bold&quot;&gt;\&lt;/span&gt;
 --reporters cli,html &lt;span style=&quot;color: #BB6622; font-weight: bold&quot;&gt;\&lt;/span&gt;
 --reporter-html-template report-template.hbs
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHXaW4xgtes7EmY15miYCgSrCXo46vQr8QABQOpTc78rRFlYS_5RZkllgs_B4pL9oaxrjYVbtf-B3sPEwlLLPS21zwNEMMFwB-QMtfbkwqrH6FEUWKz_rUgXbier97K4eQUEovp6elrf8/s1600/postman-newman-run-tests-with-cli.gif&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;350&quot; data-original-width=&quot;642&quot; height=&quot;348&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHXaW4xgtes7EmY15miYCgSrCXo46vQr8QABQOpTc78rRFlYS_5RZkllgs_B4pL9oaxrjYVbtf-B3sPEwlLLPS21zwNEMMFwB-QMtfbkwqrH6FEUWKz_rUgXbier97K4eQUEovp6elrf8/s640/postman-newman-run-tests-with-cli.gif&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3 style=&quot;-webkit-text-stroke-width: 0px; color: black; font-family: times; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; letter-spacing: normal; orphans: 2; text-align: justify; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;&quot;&gt;
&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;Running Postman Tests With Newman in Docker&lt;/span&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;For a better approach to run test on CI/CD pipeline is to use Docker so that we will not need to install any test related tools/languages/technologies to the client machine. This is becoming one of the industry standards.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/gunesmes/a3e7fa10928cd1122b62f6c87e4da2e6.js?file=newman-dockerfile.sh&quot;&gt;&lt;/script&gt; &lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;Check the Dockerfile in the project. Basically, the base image is node installed Debian, we are installing the required node package which is newman and newman-reporter-html. Then we are running the test inside newman folder and the report will be created inside /newman folder. This Dockerfile gives us a newman entry point which can run it with newman commands.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;I have &lt;/span&gt;create&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt; Newman image in hub.docker, so we need to pull it first then we use it.&lt;/span&gt;&lt;br /&gt;
&lt;!-- HTML generated using hilite.me --&gt;&lt;div style=&quot;background: #f8f8f8; overflow:auto;width:auto;padding:.2em .4em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;docker run &lt;span style=&quot;color: #BB6622; font-weight: bold&quot;&gt;\&lt;/span&gt;
 --network host &lt;span style=&quot;color: #BB6622; font-weight: bold&quot;&gt;\&lt;/span&gt;
 -v &lt;span style=&quot;color: #B8860B&quot;&gt;$PWD&lt;/span&gt;:/newman &lt;span style=&quot;color: #BB6622; font-weight: bold&quot;&gt;\&lt;/span&gt;
 gunesmes/newman-postman-html-report run https://www.getpostman.com/collections/ac3d0d9bbd8ae1bcfe5d  &lt;span style=&quot;color: #BB6622; font-weight: bold&quot;&gt;\&lt;/span&gt;
 -e blog-local.postman_environment.json &lt;span style=&quot;color: #BB6622; font-weight: bold&quot;&gt;\&lt;/span&gt;
 --reporters cli,html &lt;span style=&quot;color: #BB6622; font-weight: bold&quot;&gt;\&lt;/span&gt;
 --reporter-html-template report-template.hbs
&lt;/pre&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;helvetica neue&amp;quot;, arial, helvetica, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;We need to restore data d&lt;/span&gt;&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;uring the test some data need to be ready. For each run, the database should be restored with the script provided in restore_database.sql. This file can be run by&lt;/span&gt;&lt;br /&gt;
&lt;!-- HTML generated using hilite.me --&gt;&lt;div style=&quot;background: #f8f8f8; overflow:auto;width:auto;padding:.2em .4em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;bash restore_db.sh
bash run_service_test.sh
&lt;/pre&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://github.com/gunesmes/code-run-test-automation-ci/raw/master/service-test/tty.gif&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;453&quot; data-original-width=&quot;800&quot; height=&quot;362&quot; src=&quot;https://github.com/gunesmes/code-run-test-automation-ci/raw/master/service-test/tty.gif&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: georgia, &amp;quot;times new roman&amp;quot;, serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;helvetica neue&amp;quot;, arial, helvetica, sans-serif;&quot;&gt;Get the&amp;nbsp; &lt;a href=&quot;https://www.getpostman.com/collections/ac3d0d9bbd8ae1bcfe5d&quot; target=&quot;_blank&quot;&gt;Postman Collection&lt;/a&gt;&amp;nbsp;and the &lt;a href=&quot;https://github.com/gunesmes/code-run-test-automation-ci&quot; target=&quot;_blank&quot;&gt;project&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;

&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;Mesut Güneş&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/3774961330382432710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/3774961330382432710'/><link rel='alternate' type='text/html' href='http://www.testrisk.com/2019/01/micro-service-testing-with-postman.html' title='(Micro) Service Testing with Postman - Newman - Docker'/><author><name>Mesut Güneş</name><uri>http://www.blogger.com/profile/06466018199442112635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhksmGlHvp6B2fPh5-Ci5g2Ek3nRvfSdq2utvdyhnryXZklRvpFlzP3eIBz3y293tW1q2N1RoPfPSvGGcAydIDlFj2h39vGzq85o7GRl3wG1Q2ez99aSFJE9AdZT8DAQ80/s220/10371365_778508612195086_5198865414746812917_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNFmD7_zCZ5vIttRVzJ3Lis34RCadbixJjy75MlewRB4Li2NxyOAexlrDdq3AfPwINgabXE1e-9fZIoN9Z4nYA1K84FTtwOZS3I_w7Wy71LdLIc9bv56OF0sMZqY-GfmHp4R66W6DCJfQ/s72-c/postman-newman-testing-service-and-writing-tests.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-8264657588618504333.post-8394532737084226057</id><published>2018-06-14T09:39:00.000-07:00</published><updated>2020-05-27T05:25:54.754-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Automation"/><category scheme="http://www.blogger.com/atom/ns#" term="capybara"/><category scheme="http://www.blogger.com/atom/ns#" term="cucumber"/><category scheme="http://www.blogger.com/atom/ns#" term="devops"/><category scheme="http://www.blogger.com/atom/ns#" term="docker"/><category scheme="http://www.blogger.com/atom/ns#" term="parallel"/><category scheme="http://www.blogger.com/atom/ns#" term="responsive"/><category scheme="http://www.blogger.com/atom/ns#" term="Test Automation"/><category scheme="http://www.blogger.com/atom/ns#" term="testops"/><title type='text'>Scalable Tests for Responsive Web: Running Cucumber and Capybara with Tags in Dockers</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;If you are using Capybara with Cucumber, tagging is a very efficient feature of the &lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgy1mTC0cQEq1F_xggwSQ6DGcBGooxaJa8MYeaqE2V76KuDy4JYF6Ev6rSXNf0FmkxBmKh4YtXWhMq3Ncrgx8ixZAhJ6YULePint5pE-gtn65GzTA6_JB_BhbIB5KedvI-bJokZcl8HdUw/s1600/docker.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;512&quot; data-original-width=&quot;512&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgy1mTC0cQEq1F_xggwSQ6DGcBGooxaJa8MYeaqE2V76KuDy4JYF6Ev6rSXNf0FmkxBmKh4YtXWhMq3Ncrgx8ixZAhJ6YULePint5pE-gtn65GzTA6_JB_BhbIB5KedvI-bJokZcl8HdUw/s200/docker.png&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;Cucumber&amp;nbsp;for manageable test cases. Tagging can be also used for managing test environments, like &lt;b&gt;@test&lt;/b&gt; may mean that these tests run only in the test environment so set the environment as the test for me. Likely &lt;b&gt;@live&lt;/b&gt; may mean that these tests can run on the live&amp;nbsp;environment, assume that you are applying continuous&amp;nbsp;testing. You can also give the scenarios for device-specific tags, like &lt;b&gt;@ihphone6_v&lt;/b&gt; may say these tests are for iphone6 with the vertical mode.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;Moreover, with tagging, you can also make an isolation strategy for running your test in parallel. Each parallel suits should have its own data like users, active records, address, credit card info, and ext. I have used the tagging for running tests in dockers. In this post, you can find some practical way of running Capybara with Cucumber in Dockers.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h4 style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;Creating Docker Image: Dockerfile&lt;/span&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;I am using Ruby version 2.3 so in Dockerfile getting the image of &lt;b&gt;FROM Ruby:2.3&lt;/b&gt; which is the first layer of the image comes as a Debian os. Then installing required libraries with the&amp;nbsp;&lt;b&gt;RUN&lt;/b&gt; command. Changing the working directory with &lt;b&gt;WORKDIR&lt;/b&gt; which we will use this path by mounting the project folder into the running Docker. &lt;b&gt;COPY &lt;/b&gt;Gemfile to &lt;b&gt;WORKDIR&lt;/b&gt;&amp;nbsp;so we can &lt;b&gt;RUN&lt;/b&gt; &lt;b&gt;bundle install&lt;/b&gt;&amp;nbsp;to install required gems. The last thing, we need to install Chromedriver and Chrome by &lt;b&gt;RUN&lt;/b&gt; commands. These steps executed by the Dockerfile, check it below:&lt;/span&gt;&lt;/div&gt;
&lt;script src=&quot;https://gist.github.com/gunesmes/9bd30a02ad19787ea9c24d09b80479ce.js?file=capybara_dockerfile&quot;&gt;&lt;/script&gt;&lt;br /&gt;
&lt;div&gt;
&lt;h4&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;Running Capybara in a Docker&lt;/span&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;Running the Capybara with my image is pretty simple if you run it without docker, just try other options which most suited for your&amp;nbsp;case.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;!-- HTML generated using hilite.me --&gt;&lt;br /&gt;
&lt;div style=&quot;background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;&quot;&gt;
&lt;pre style=&quot;line-height: 125%; margin: 0;&quot;&gt;&lt;span style=&quot;color: #888888;&quot;&gt;docker run --shm-size 256M --rm --name capybara_m \&lt;/span&gt;
&lt;span style=&quot;color: #888888;&quot;&gt; -v $PWD:/usr/src/app gunesmes/docker-capybara-chrome:latest bash \&lt;/span&gt;
&lt;span style=&quot;color: #888888;&quot;&gt; -c &quot;cucumber features/G001_basket_product_checks.feature DRIVER=driver_desktop&quot;&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;the meaning of the parameters in the command as follows:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;
&lt;div style=&quot;orphans: 2; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; widows: 2;&quot;&gt;
&lt;ul&gt;
&lt;li style=&quot;-webkit-text-stroke-width: 0px; color: black; font-family: Times; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; text-transform: none; white-space: normal; word-spacing: 0px;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;b&gt;run&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;: running docker&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;-webkit-text-stroke-width: 0px; color: black; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; letter-spacing: normal; text-transform: none; white-space: normal; word-spacing: 0px;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;b&gt;--shm-size:&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif; font-weight: 400;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif; font-weight: 400;&quot;&gt;Size of /dev/shm. Shared memory size, if you do not set it Chromedriver may be unreachable if there is no allocated memory.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;-webkit-text-stroke-width: 0px; color: black; font-family: Times; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; text-transform: none; white-space: normal; word-spacing: 0px;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;b&gt;--rm&lt;/b&gt;:&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;Automatically remove the container when it&amp;nbsp;exits&amp;nbsp;so we can rerun if fails&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;-webkit-text-stroke-width: 0px; color: black; font-family: Times; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; text-transform: none; white-space: normal; word-spacing: 0px;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;b&gt;--name&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;:&amp;nbsp;Assign a name to the container&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;-webkit-text-stroke-width: 0px; color: black; font-family: Times; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; letter-spacing: normal; text-transform: none; white-space: normal; word-spacing: 0px;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace; font-weight: 400;&quot;&gt;&lt;b&gt;-v&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif; font-weight: 400;&quot;&gt;: Bind mount a volume, we are mounting the local files, inside the&amp;nbsp;container.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;b&gt;$PWD:/usr/src/app&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;means to mount the path present working directory to the path called &lt;b&gt;/app&lt;/b&gt; inside the container&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;b&gt;gunesmes/docker-capybara-chrome&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;times&amp;quot;;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;times&amp;quot;; font-size: small; font-style: normal; font-weight: 400; letter-spacing: normal; text-transform: none; white-space: normal; word-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;name of the images which simulate the local machine works as Capybara machine. For the first time you run, it downloads the images from hub.docker.com, but for the later run, it will just download the updated container layers if there are.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: black; font-size: small; font-style: normal; letter-spacing: normal; text-transform: none; white-space: normal; word-spacing: 0px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;:latest&lt;/span&gt;&lt;/b&gt; :&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;version of the image, if you tagged your image when building it, you can use it.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;-webkit-text-stroke-width: 0px; color: black; font-family: Times; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; text-transform: none; white-space: normal; word-spacing: 0px;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;b&gt;. . .&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;: and the rest of commands are for the Cucumber specific. You can see them in &lt;a href=&quot;https://www.rubydoc.info/github/cucumber/cucumber-ruby/Cucumber/Cli/Options&quot; target=&quot;_blank&quot;&gt;Cucumber docs&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h4 style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;Visual Run for&amp;nbsp;iPhone6&lt;/span&gt;&lt;/h4&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;!-- HTML generated using hilite.me --&gt;For debugging purposes you may need to run the test visually to see if everything happens as expected. For this purpose set the visibility of the driver as visible by selecting the one in the list of env.rb file. Therefore the following command simply runs the test via iPhone 6, vertical mode visible. You can also see the video for this run.&lt;/div&gt;
&lt;div style=&quot;background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;&quot;&gt;
&lt;pre style=&quot;line-height: 125%; margin: 0px; text-align: justify;&quot;&gt;&lt;span style=&quot;color: #888888;&quot;&gt;cucumber features/G001_basket_product_checks.feature DRIVER=driver_mobile_iphone6_v_visible&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;height: 0; padding-bottom: 75.0%; position: relative;&quot;&gt;
&lt;br /&gt;
&lt;iframe allow=&quot;autoplay; encrypted-media&quot; allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;360&quot; src=&quot;https://www.youtube.com/embed/LHNko_0L_Vs?ecver=2&quot; style=&quot;height: 100%; left: 0; position: absolute; width: 100%;&quot; width=&quot;480&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;driver_mobile_iphone6_v_visible&gt;&lt;/driver_mobile_iphone6_v_visible&gt;&lt;/div&gt;
&lt;h4 style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;Docker run for a single tag with a single platform&lt;/span&gt;&lt;/h4&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;!-- HTML generated using hilite.me --&gt;You can run a feature for a single platform by defining the DRIVER option with the desired one. In the following run command we can run one feature file for the driver running on the desktop.&lt;/div&gt;
&lt;div style=&quot;background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;&quot;&gt;
&lt;pre style=&quot;line-height: 125%; margin: 0;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;color: #888888;&quot;&gt;docker run --shm-size 256M --rm --name capybara_m \&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;color: #888888;&quot;&gt; -v $PWD:/usr/src/app gunesmes/docker-capybara-chrome:latest bash \&lt;/span&gt;
&lt;span style=&quot;color: #888888;&quot;&gt; -c &quot;cucumber features/G001_basket_product_checks.feature DRIVER=driver_desktop&quot;&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;h4&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif; text-align: justify;&quot;&gt;Docker run for parallel execution of smoke test&lt;/span&gt;&lt;/h4&gt;
&lt;pre style=&quot;text-align: justify;&quot;&gt;bash run.sh &lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;check the reports inside the ./html_report&lt;/span&gt;&lt;/div&gt;
&lt;h4 style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;Docker run for parallel execution of all tags with all platforms&lt;/span&gt;&lt;/h4&gt;
&lt;pre style=&quot;text-align: justify;&quot;&gt;bash run_full.sh&lt;/pre&gt;
&lt;pre style=&quot;text-align: justify;&quot;&gt;&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;When we run the run_smoke.sh, there is only two parallel run&amp;nbsp;executed against the desktop version of chrome and iPhone 6 version of chrome with the vertical mode. Mobile for better experiences we both set the dimension of the mobile devices and the user-agent for mobile device operating system. However, there is still a technical problem that we don&#39;t run the test in real devices. Check the browser object in the env.rb.&amp;nbsp; You can run the run_full.sh in a dedicated environment, it just requires more resources than an ordinary machine.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt; &lt;script src=&quot;https://gist.github.com/gunesmes/9bd30a02ad19787ea9c24d09b80479ce.js?file=run_full.sh&quot;&gt;&lt;/script&gt; &lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;In the end, it creates JSON report files in the ./report folder so that you can create nice HTML reports with cucumber-JVM report plugin for Jenkins. It includes screenshots on error and the logs of the browser.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt; &lt;vides&gt;&lt;/vides&gt;&lt;/div&gt;
&lt;div style=&quot;height: 0; padding-bottom: 75.0%; position: relative;&quot;&gt;
&lt;iframe allow=&quot;autoplay; encrypted-media&quot; allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;360&quot; src=&quot;https://www.youtube.com/embed/Nd4kGeQeJgk?ecver=2&quot; style=&quot;height: 100%; left: 0; position: absolute; width: 100%;&quot; width=&quot;480&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;Check the result of the log, you can the benefit of the parallel run. Each test takes approximately 1 minute when we run the run_full.sh, there are 7 parallel runs but all test takes approximately 1minute 20seconds.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt; &lt;script src=&quot;https://gist.github.com/gunesmes/9bd30a02ad19787ea9c24d09b80479ce.js?file=running_full_regression_parallel_cucumber_capybara_responsive_docker.rb&quot;&gt;&lt;/script&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Mesut Güneş&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/8394532737084226057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/8394532737084226057'/><link rel='alternate' type='text/html' href='http://www.testrisk.com/2018/06/scalable-tests-for-responsive-web.html' title='Scalable Tests for Responsive Web: Running Cucumber and Capybara with Tags in Dockers'/><author><name>Mesut Güneş</name><uri>http://www.blogger.com/profile/06466018199442112635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhksmGlHvp6B2fPh5-Ci5g2Ek3nRvfSdq2utvdyhnryXZklRvpFlzP3eIBz3y293tW1q2N1RoPfPSvGGcAydIDlFj2h39vGzq85o7GRl3wG1Q2ez99aSFJE9AdZT8DAQ80/s220/10371365_778508612195086_5198865414746812917_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgy1mTC0cQEq1F_xggwSQ6DGcBGooxaJa8MYeaqE2V76KuDy4JYF6Ev6rSXNf0FmkxBmKh4YtXWhMq3Ncrgx8ixZAhJ6YULePint5pE-gtn65GzTA6_JB_BhbIB5KedvI-bJokZcl8HdUw/s72-c/docker.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-8264657588618504333.post-4178638594745817050</id><published>2018-05-31T16:45:00.000-07:00</published><updated>2018-05-31T23:16:54.026-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="container"/><category scheme="http://www.blogger.com/atom/ns#" term="Continous Delivery"/><category scheme="http://www.blogger.com/atom/ns#" term="Continuous integration"/><category scheme="http://www.blogger.com/atom/ns#" term="devops"/><category scheme="http://www.blogger.com/atom/ns#" term="docker"/><category scheme="http://www.blogger.com/atom/ns#" term="locust"/><category scheme="http://www.blogger.com/atom/ns#" term="Performance"/><title type='text'>Isolated - Scalable Performance Testing: Locust in Dockers</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;I have shared some posts how to run Locust in Local or in Cloud, as slave or master. At this time I want to share how you can run it in a Docker. To fully get the benefits of Locust I am using it with Python 3 so I created a Docker file and images upload to the &lt;a href=&quot;https://github.com/gunesmes/docker-locust&quot; target=&quot;_blank&quot;&gt;Docker Hub&lt;/a&gt;, and the project is on the &lt;a href=&quot;https://github.com/gunesmes/docker-locust&quot; target=&quot;_blank&quot;&gt;GitHub&lt;/a&gt;.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicl9Xqn5irPDpwChbFELZteBUwdS21AGsvotgs3Yc3pYxo0NrMey9Ypp_3P2k_zjgVv2wsPGA5gKk0R0dvtzz4WLE2lZdXP4NUmafevOyRpfoLPiqVHfYx85zSGyD7mtLYdQ9qzgYnQMQ/s1600/docker.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: justify;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;512&quot; data-original-width=&quot;512&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicl9Xqn5irPDpwChbFELZteBUwdS21AGsvotgs3Yc3pYxo0NrMey9Ypp_3P2k_zjgVv2wsPGA5gKk0R0dvtzz4WLE2lZdXP4NUmafevOyRpfoLPiqVHfYx85zSGyD7mtLYdQ9qzgYnQMQ/s200/docker.png&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;The Dockerfile has the minimum available requirements but we also have a new file called `requirements.txt` which you can add required python libraries to install inside the container by &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;pip install lib&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;. The Dockerfile is:&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;When you got the docker-locust image, you can now run your script. At the end of the &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;Dockerfile&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt; you can see that &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;ENTRYPOINT [ &quot;/usr/local/bin/locust&quot; ]&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt; this enable us to use the &lt;/span&gt;&lt;b style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;, sans-serif;&quot;&gt;image as service&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;&amp;nbsp;which means that you can directly&amp;nbsp;call it same as using Locust installed locally. See the run command below:&lt;/span&gt;&lt;/div&gt;
&lt;span class=&quot;user-select-contain gist-blob-name css-truncate-target&quot; style=&quot;box-sizing: border-box; display: inline-block; font-weight: 600; max-width: 690px; overflow: hidden; text-overflow: ellipsis; vertical-align: top; white-space: nowrap;&quot;&gt;&lt;script src=&quot;https://gist.github.com/gunesmes/5ca7b25162ccddcf8d1bc0aa6b454a4c.js?file=Dockerfile&quot;&gt;&lt;/script&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;Running Locust in a Docker&lt;/span&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;Running the Locust with my image is pretty simple if you used without docker, just try other options which most suited for your&amp;nbsp;case.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;pre style=&quot;text-align: justify;&quot;&gt;docker run --rm --name locust -v $PWD:/locust gunesmes/docker-locust -f /locust/run.py --host=http://www.github.com --num-request=100 --clients=10 --hatch-rate=1 --only-summary --no-web&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;the meaning of the parameters in the command as follows:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;ul&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;b&gt;run&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;: running docker&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;b&gt;--rm&lt;/b&gt;:&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;Automatically remove the container when it exits&amp;nbsp;so we can rerun if fails&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;b&gt;--name&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;:&amp;nbsp;Assign a name to the container&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;b&gt;-v&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;: Bind mount a volume, we are mounting the local files, run.py, inside the&amp;nbsp;container.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;$PWD:/locust&lt;/span&gt; &lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;means to mount the path present working directory to the path called /local inside the container&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;b&gt;gunesmes/docker-locust&lt;/b&gt;: &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;name of the images which works as Locust service so it is a synonym of the locust .&amp;nbsp;For the first time you run it downloads the images from hub.docker.com, but later it will just download the update container layer if there is.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;b&gt;. . .&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;: and the rest of commands are for the locust specific. You can see them at the end of the post.&lt;/span&gt;&lt;/li&gt;
&lt;/span&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt; &lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;See what is happening when you run the command for the first time:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;user-select-contain gist-blob-name css-truncate-target&quot; style=&quot;box-sizing: border-box; display: inline-block; font-weight: 600; max-width: 690px; overflow: hidden; text-overflow: ellipsis; vertical-align: top; white-space: nowrap;&quot;&gt;&lt;script src=&quot;https://gist.github.com/gunesmes/5ca7b25162ccddcf8d1bc0aa6b454a4c.js?file=docker-run.sh&quot;&gt;&lt;/script&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;List of Locust command, note that Locust will remove the &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;--num-request&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt; in favour&amp;nbsp;of stopping it by a timer parameter.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;user-select-contain gist-blob-name css-truncate-target&quot; style=&quot;box-sizing: border-box; display: inline-block; font-weight: 600; max-width: 690px; overflow: hidden; text-overflow: ellipsis; vertical-align: top; white-space: nowrap;&quot;&gt;&lt;script src=&quot;https://gist.github.com/gunesmes/5ca7b25162ccddcf8d1bc0aa6b454a4c.js?file=locust-full-options.sh&quot;&gt;&lt;/script&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;The little but powerfull run.py is just collecting the link inside the hostname home page, and starting to attack by Locust when it is ready. See the run.py:&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;span class=&quot;user-select-contain gist-blob-name css-truncate-target&quot; style=&quot;box-sizing: border-box; display: inline-block; font-weight: 600; max-width: 690px; overflow: hidden; text-overflow: ellipsis; vertical-align: top; white-space: nowrap;&quot;&gt;&lt;script src=&quot;https://gist.github.com/gunesmes/5ca7b25162ccddcf8d1bc0aa6b454a4c.js?file=run.py&quot;&gt;&lt;/script&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;Mesut Güneş&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/4178638594745817050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8264657588618504333/posts/default/4178638594745817050'/><link rel='alternate' type='text/html' href='http://www.testrisk.com/2018/05/isolated-scalable-performance-testing.html' title='Isolated - Scalable Performance Testing: Locust in Dockers'/><author><name>Mesut Güneş</name><uri>http://www.blogger.com/profile/06466018199442112635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhksmGlHvp6B2fPh5-Ci5g2Ek3nRvfSdq2utvdyhnryXZklRvpFlzP3eIBz3y293tW1q2N1RoPfPSvGGcAydIDlFj2h39vGzq85o7GRl3wG1Q2ez99aSFJE9AdZT8DAQ80/s220/10371365_778508612195086_5198865414746812917_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicl9Xqn5irPDpwChbFELZteBUwdS21AGsvotgs3Yc3pYxo0NrMey9Ypp_3P2k_zjgVv2wsPGA5gKk0R0dvtzz4WLE2lZdXP4NUmafevOyRpfoLPiqVHfYx85zSGyD7mtLYdQ9qzgYnQMQ/s72-c/docker.png" height="72" width="72"/></entry></feed>