<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: HeadSpin</title>
    <description>The latest articles on DEV Community by HeadSpin (@headspin_io).</description>
    <link>https://dev.to/headspin_io</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F196498%2Fbeae52c6-c21a-46ec-b7d5-ffe3f5d47ccd.png</url>
      <title>DEV Community: HeadSpin</title>
      <link>https://dev.to/headspin_io</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/headspin_io"/>
    <language>en</language>
    <item>
      <title>Introducing HeadSpin Local</title>
      <dc:creator>HeadSpin</dc:creator>
      <pubDate>Mon, 30 Nov 2020 20:05:00 +0000</pubDate>
      <link>https://dev.to/headspin_io/introducing-headspin-local-3636</link>
      <guid>https://dev.to/headspin_io/introducing-headspin-local-3636</guid>
      <description>&lt;p&gt;&lt;span&gt;In the past few years, and even in just the past few months, we’ve witnessed rapid digital transformation across all industries, as changing consumer expectations present new opportunities for experience innovation. With this comes the need of product teams for a seamless, local approach to application testing and development, as they find themselves&lt;/span&gt; &lt;span&gt;facing faster time-to-market pressure and their users increasingly distributed across the globe.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span&gt;Conventional tools tend to fall short of delivering the velocity and scale, as well as the global reach, required for success in today’s experience economy. That is why we’re proud to introduce &lt;a href="https://www.headspin.io/platform/local/"&gt;HeadSpin Local&lt;/a&gt;, a new platform&lt;/span&gt;&lt;span&gt; that allows you to test your mobile experiences around the world from an easy-to-use platform powered by HeadSpin’s 24/7 technology. &lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span&gt;With &lt;/span&gt;&lt;a href="https://www.headspin.io/platform/local/"&gt;&lt;span&gt;HeadSpin Local&lt;/span&gt;&lt;/a&gt;&lt;span&gt;, you can perform manual testing on real iOS and Android devices running on real carrier networks in 9 locations worldwide  — all from the comfort of your home or local office. HeadSpin Local provides a remote control workbench with full support for gestures and orientation that allows you to upload and debug your apps, games, and other mobile experiences on our pool of real mobile devices without modifications to your app. Plus, you can collaborate with ease by saving and sharing screenshots and device logs with your teams. &lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span&gt;HeadSpin Local was designed to make testing easy and accessible to anyone and offers the following features:&lt;/span&gt;&lt;/p&gt;

&lt;h4&gt;&lt;strong&gt;Manual Mobile Testing&lt;/strong&gt;&lt;/h4&gt;

&lt;p&gt;&lt;span&gt;Identify bugs and issues faster with live, interactive testing.&lt;/span&gt;&lt;/p&gt;

&lt;h4&gt;&lt;strong&gt;Real Global Devices&lt;/strong&gt;&lt;/h4&gt;

&lt;p&gt;Get 24/7 access to real iOS and Android devices where your users are: Palo Alto, New York, Miami, London, &lt;span&gt;Johannesburg, Jakarta, New Delhi, Mumbai, and Tokyo.&lt;/span&gt;&lt;/p&gt;
                    

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6ed9oUdm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/11/HeadSpin-Local-Hosts-use-1024x715.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6ed9oUdm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/11/HeadSpin-Local-Hosts-use-1024x715.jpg" alt="Remote Control Local Host Dashboard"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;&lt;strong&gt;Remote Workbench&lt;/strong&gt;&lt;/h4&gt;

&lt;p&gt;&lt;span&gt;Run and control your tests from our easy-to-use remote control workbench.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oZdY28Cn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/11/HeadSpin-Local-Remote-Tools-use-1024x717.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oZdY28Cn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/11/HeadSpin-Local-Remote-Tools-use-1024x717.jpg" alt="Local Remote Tools"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;Screenshots&lt;/h4&gt;
                

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HD31-88a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/11/HeadSpin-Local-Screenshots-use-1024x717.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HD31-88a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/11/HeadSpin-Local-Screenshots-use-1024x717.jpg" alt="HeadSpin Local Screenshot 3"&gt;&lt;/a&gt;                                                                  &lt;/p&gt;

&lt;h4&gt;Device logs&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_IwDeVOA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/11/HeadSpin-Local-Logs-use-1024x715.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_IwDeVOA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/11/HeadSpin-Local-Logs-use-1024x715.jpg" alt="HeadSpin Local logs"&gt;&lt;/a&gt;                                                                                     &lt;/p&gt;

&lt;h3&gt;Try it for yourself&lt;/h3&gt; 

&lt;p&gt;&lt;span&gt;HeadSpin Local is now available. Whether you’re launching a new app, want to test a new feature, or need to do a spot check, HeadSpin Local has you covered. Seamlessly test around the globe on real devices and real networks by &lt;/span&gt;&lt;a href="https://ui.headspin.io/local/register?utm_source=devto&amp;amp;utm_medium=blog&amp;amp;utm_campaign=local"&gt;&lt;span&gt;running your first HeadSpin Local test today&lt;/span&gt;&lt;/a&gt;&lt;span&gt;! Both annual and monthly subscriptions are available, and for a limited time only, &lt;a href="https://www.headspin.io/platform/local/?utm_source=devto&amp;amp;utm_medium=blog&amp;amp;utm_campaign=local"&gt;you can get 25% off an annual subscription&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
                

&lt;h4&gt;What’s next&lt;/h4&gt;
        

&lt;p&gt;&lt;span&gt;HeadSpin remains committed to providing QA/release engineers, developers, product managers, SREs, and support professionals with the tools to collaborate seamlessly to accelerate development cycles, optimize digital performance, and automatically surface insights &lt;/span&gt;&lt;span&gt;—&lt;/span&gt;&lt;span&gt; all of which are especially crucial in today’s digital landscape. &lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span&gt;Soon, teams will have access to the above features plus more, as our team works to bring HeadSpin’s core automated testing and performance analysis capabilities to users across the globe. &lt;/span&gt;&lt;span&gt;&lt;a href="https://info.headspin.io/local-updates" rel="noopener"&gt;Get updates here&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;



&lt;p&gt;The post &lt;a href="https://www.headspin.io/blog/announcements/headspin-local/"&gt;Introducing HeadSpin Local&lt;/a&gt; appeared first on &lt;a href="https://www.headspin.io"&gt;HeadSpin&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>announcements</category>
      <category>mobile</category>
      <category>testing</category>
      <category>qa</category>
    </item>
    <item>
      <title>I've Joined HeadSpin as Director, Learning and Education Programs</title>
      <dc:creator>HeadSpin</dc:creator>
      <pubDate>Mon, 04 May 2020 17:26:54 +0000</pubDate>
      <link>https://dev.to/headspin_io/i-ve-joined-headspin-as-director-learning-and-education-programs-3f39</link>
      <guid>https://dev.to/headspin_io/i-ve-joined-headspin-as-director-learning-and-education-programs-3f39</guid>
      <description>&lt;p&gt;It was over two years ago now when I started Cloud Grey, my Appium and mobile testing-focused consulting firm. It's been an amazing few years, and I've learned a ton by working with all my various clients. One of my major efforts has involved increasing the amount and quality of Appium training and education. My weekly blog &amp;amp; newsletter &lt;a href="https://www.appiumpro.com"&gt;Appium Pro&lt;/a&gt; has grown radically over this time period because, I think, it has been meeting a need.&lt;/p&gt;

&lt;h3&gt;
  
  
  The need for high-quality training
&lt;/h3&gt;

&lt;p&gt;Increasingly, I've found that what my clients really need is solid training for their staff. For that reason, earlier this year I launched a series of public workshops designed to take attendees from basic knowledge of Appium to an advanced level. At the same time, the world of mobile testing has continued to expand. The types of testing we're responsible for is growing; performance, network, and visual testing are increasingly non-optional components of any test framework.&lt;/p&gt;

&lt;p&gt;In my role as a consultant, I've been simultaneously inspired and frustrated. There is so much inspiration to be found in client work and training—so many ideas to make Appium better, for one. It can also be frustrating because so much of my time and energy is put into managing the consulting machinery. Every hour I spend doing expenses or reviewing legal documents is an hour that I can't spend on Appium, or even producing more training-related content. So many people have asked me to create online courses, but I simply don't have the time! I realized that if I wanted to adequately reach the testing world with the type of high-quality training materials I had in mind, I'd need to rely on the energy of a whole team, not just my own.&lt;/p&gt;

&lt;p&gt;Making the best quality training ever--with the help of a team!&lt;br&gt;
Observing all these things, and trying to pay attention to them, I decided to join up with HeadSpin as Director, Learning and Education Programs, to find a better way forward for me, for mobile testing, and for training in this space. HeadSpin is a company I've worked with for over two years. I've been an advisor to the company on their Appium support and other initiatives. What I realized over this time is that HeadSpin believes wholeheartedly in Appium's vision, and wants to push it forward with an energy I haven't found anywhere else. HeadSpin is also exploring new products and technologies in the mobile testing space at a really exciting pace.&lt;/p&gt;

&lt;p&gt;In addition, &lt;a href="https://headspin.com?utm_source=devto"&gt;HeadSpin&lt;/a&gt; believes strongly in high-quality Appium training. So, there was a natural opportunity for us to talk about working together, with the mission of producing the best mobile testing courses available (both online and in-person). Specifically, we care about training that helps learners make practical, high-quality contributions to their companies' app testing. These conversations with HeadSpin began a long time ago, but now, given the huge need all around the world for good online training due to the requirement for many of us to stay home and help fight COVID-19, it's time to turn these ideas into reality! Stay tuned for more news from me on this front soon—I've got some exciting ideas about how to make this training both high-quality and widely accessible.&lt;/p&gt;

&lt;h3&gt;
  
  
  A taste of what's to come
&lt;/h3&gt;

&lt;p&gt;In the meantime, I'm happy to announce that today we're launching a sort of pre-release version of what we're calling the &lt;strong&gt;&lt;a href="https://ui.headspin.io/university/register?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=hs_university"&gt;HeadSpin University&lt;/a&gt;&lt;/strong&gt;, where we've packaged up some of the webinars and articles I've developed in conjunction with HeadSpin over the years. Check it out &lt;strong&gt;&lt;a href="https://ui.headspin.io/university/register?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=hs_university"&gt;here&lt;/a&gt;&lt;/strong&gt;, and make sure to sign up for more news as it's made available. In the next few weeks, for example, I'm going to take some of what I've developed for the &lt;a href="https://appiumpro.com/workshops"&gt;Appium Pro Workshops&lt;/a&gt; and record it as a set of training videos, making it available for free to the community. We all need a little help with everything that's going on in the world, and this is one way I want to give back.&lt;/p&gt;

&lt;h3&gt;
  
  
  Appium Pro is here to stay
&lt;/h3&gt;

&lt;p&gt;With this change of employment and mission for me, I welcome the opportunity to have a simpler focus, which will also allow me to be more active with the Appium maintainers, pushing forward projects like Appium 2.0 or the creation of new drivers. As a consultant, I didn't have too much time to help manage the Appium project with the other maintainers, and I've lamented my inability to contribute as much as I used to.&lt;/p&gt;

&lt;p&gt;I understand that this decision to join HeadSpin might raise some questions about the future of Appium Pro, or indeed of its stance in the industry. For my part, I'll continue to publish Appium Pro, and to write about topics in exactly the same balanced and neutral way I did as an independent consultant. HeadSpin will continue to be the lead sponsor, of course, and I'll continue to choose topics I care about and write what I want. It's been a wonderful resource for the community and I hope it continues to grow as a valuable repository of all things Appium. Indeed, even the trainings I develop under the HeadSpin banner will exist for the purpose of giving everyone the best quality training possible, regardless of the cloud service they ultimately want to use, if any.&lt;/p&gt;

&lt;p&gt;I'm very excited about what lies ahead, and how this partnership with HeadSpin will enable me to bring more focus and more value overall to the Appium community. Please don't hesitate to let me know what you're hoping this new development will bring, too!&lt;/p&gt;

&lt;p&gt;Jonathan Lipps&lt;/p&gt;

</description>
      <category>testing</category>
      <category>appium</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to Integrate Audio APIs into your Appium Automation Scripts</title>
      <dc:creator>HeadSpin</dc:creator>
      <pubDate>Wed, 29 Apr 2020 21:58:56 +0000</pubDate>
      <link>https://dev.to/headspin_io/how-to-integrate-audio-apis-into-your-appium-automation-scripts-ijm</link>
      <guid>https://dev.to/headspin_io/how-to-integrate-audio-apis-into-your-appium-automation-scripts-ijm</guid>
      <description>&lt;p&gt;Have you ever had trouble testing the audio functionality of your mobile application? Capturing, injecting, and comparing audio has historically been a tricky area in mobile automation testing. Even trying to validate something as simple as checking if the correct audio plays during a prescribed action can be a daunting task. HeadSpin’s Audio APIs simplify these operations and provide developers with a convenient RESTful interface. This post walks through a high-level overview of each API as well as showcases how to integrate it into your Appium automation script. &lt;/p&gt;

&lt;h1&gt;
  
  
  What are these APIs? How do I use them?
&lt;/h1&gt;

&lt;p&gt;In total, &lt;a href="https://www.headspin.io"&gt;Headspin&lt;/a&gt; has seven different APIs regarding audio on mobile devices. This post will primarily focus on three very popular endpoints, which include uploading audio to our servers, capturing sound on a given mobile device in the HeadSpin cloud, and comparing two audio files to see if they are a match. &lt;/p&gt;

&lt;h2&gt;
  
  
  Uploading
&lt;/h2&gt;

&lt;p&gt;The primary use of this endpoint is to allow the developer to upload a reference file that is used later to compare against a test audio file captured from the mobile device during your automation test. One thing to note is that the audio format for this endpoint is .wav. The response from this endpoint is a JSON object notifying if the upload was successful, and if it were, it would provide you with a unique audio id. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example Code&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;def upload_reference_file(api_token):&lt;br&gt;
    api_endpoint = '&lt;a href="https://api-dev.headspin.io/v0/audio/upload"&gt;https://api-dev.headspin.io/v0/audio/upload&lt;/a&gt;'&lt;br&gt;
    data = open('reference_audio.wav', 'rb')&lt;br&gt;
    r = requests.post(api_endpoint,&lt;br&gt;
                      headers={'Authorization': 'Bearer {}'.format(api_token)},&lt;br&gt;
                      data=data)&lt;br&gt;
    response = json.loads(r.text)&lt;br&gt;
    return response['audio_id']&lt;/p&gt;

&lt;h2&gt;
  
  
  Capturing
&lt;/h2&gt;

&lt;p&gt;You invoke this endpoint when you want to start capturing the audio output from a given device, and the API also allows you to end the session in a couple of different ways. When you make the initial capture call to the server, you can specify how long you would like it to run, or you can store the response, which includes a worker id and use it to poll for status updates and stop the capture as well. &lt;/p&gt;

&lt;p&gt;After it has finished capturing the audio from the device, it is uploaded to a storage system that allows anyone in your organization access it. In the response from the capture endpoint, the audio id is passed back, which is essential to store for reference later. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example Code&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;def capture_audio(device_address, duration, api_token):&lt;br&gt;
    api_endpoint = '&lt;a href="https://api-dev.headspin.io/v0/audio/capture/start"&gt;https://api-dev.headspin.io/v0/audio/capture/start&lt;/a&gt;'&lt;br&gt;
    data = {}&lt;br&gt;
    data['device_address'] = device_address&lt;br&gt;
    data['max_duration'] = duration&lt;br&gt;
    data = json.dumps(data)&lt;br&gt;
    r = requests.post(api_endpoint,&lt;br&gt;
                      headers={'Authorization': 'Bearer {}'.format(api_token)},&lt;br&gt;
                      data=data)&lt;br&gt;
    response = json.loads(r.text)&lt;br&gt;
    return response['audio_id']&lt;/p&gt;

&lt;h2&gt;
  
  
  Analysis
&lt;/h2&gt;

&lt;p&gt;The analysis or match API allows you to pass in two audio files, a reference, and a test, and then determine if the reference audio is present in the test audio. We define the reference file to be the original audio source while the test audio is a more extended captured audio that contains the reference. &lt;/p&gt;

&lt;p&gt;The use case here is to detect exact audio matches as well as locate the reference audio inside of the test audio. Additionally, it can also compare the audio quality of the test relative to the reference. &lt;/p&gt;

&lt;p&gt;The response from this API includes multiple result parameters from the analysis. The key takeaways for me in this response is if it was a success first and foremost. Success does not indicate if the audios match but instead indicates that the algorithm was able to run correctly. Along with success, there are two objects in the form of parameters and results inside our response. Parameters described the thresholds for values used during the analysis, e.g. the sample rate. The most important behind a successful analysis is, of course, the results. The results object gives us the following stats:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Match: Full, Partial, No, or Error&lt;/li&gt;
&lt;li&gt;Quality of Match&lt;/li&gt;
&lt;li&gt;Start and End time of reference in terms of test&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example Code&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;def compare_audio(test_id, reference_id, api_token):&lt;br&gt;
    api_endpoint = '&lt;a href="https://api-dev.headspin.io/v0/audio/analysis/match"&gt;https://api-dev.headspin.io/v0/audio/analysis/match&lt;/a&gt;'&lt;br&gt;
    data = {}&lt;br&gt;
    data['test_audio_id'] = test_id&lt;br&gt;
    data['ref_audio_id'] = reference_id&lt;br&gt;
    data = json.dumps(data)&lt;br&gt;
    r = requests.post(api_endpoint,&lt;br&gt;
                      headers={'Authorization': 'Bearer {}'.format(api_token)},&lt;br&gt;
                      data=data)&lt;br&gt;
    response = json.loads(r.text)&lt;br&gt;
    if response['success'] == True:&lt;br&gt;
        Return response['result']&lt;/p&gt;

&lt;h1&gt;
  
  
  How can we tie all of these together?
&lt;/h1&gt;

&lt;p&gt;To showcase how we can integrate all of these endpoints into a single automation run, we are going to look at a customer use case. The goal of this customer was to verify that the correct automated response was given when a user of their service made a call with no balance on their sim card. &lt;/p&gt;

&lt;p&gt;Given the proper reference audio, this is made relatively straightforward with the use of Headspins audio APIs. We executed this test in the following steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Upload a reference file to Headspin's storage system using the upload endpoint and store the audio id for later use. &lt;/li&gt;
&lt;li&gt;Launch the Android/iOS device in Headspins mobile device cloud, which has audio enabled.&lt;/li&gt;
&lt;li&gt;Navigate to the device's phone application using the Appium framework.&lt;/li&gt;
&lt;li&gt;Enter a given number and place the call using a sim card provided by the customer.&lt;/li&gt;
&lt;li&gt;Once the call connects, hit Headspins capture endpoint with a max duration of 20 seconds to record the automated response and store the audio id in the response for later use. &lt;/li&gt;
&lt;li&gt;Send both the reference and test audio ids to Headspins analysis API to verify they are a match.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We can add this video as a visual walkthrough of the use case as well&lt;br&gt;
&lt;a href="https://www.loom.com/share/4ea534985a1a4f2187d6792566e52408"&gt;https://www.loom.com/share/4ea534985a1a4f2187d6792566e52408&lt;/a&gt;&lt;/p&gt;

</description>
      <category>appium</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Writing an Appium test in Kotlin</title>
      <dc:creator>HeadSpin</dc:creator>
      <pubDate>Mon, 27 Apr 2020 05:05:08 +0000</pubDate>
      <link>https://dev.to/headspin_io/writing-an-appium-test-in-kotlin-4cc0</link>
      <guid>https://dev.to/headspin_io/writing-an-appium-test-in-kotlin-4cc0</guid>
      <description>&lt;p&gt;&lt;a href="https://kotlinlang.org/" rel="nofollow noopener"&gt;Kotlin&lt;/a&gt; is a modern programming language that focuses on conciseness, clarity, and code safety. Google officially adopted Kotlin by adding support into Android Studio in 2017 and since then has announced it as the preferred language for Android developers at Google I/O 2019. Perhaps your Android app team has incrementally added Kotlin code to your project or have elected to start new Android projects in Kotlin moving forward. Having the app code and UI automation code in the same language helps engineering and QA teams level set on the critical user journeys being tested. I’d like to share the basics of getting started with writing an &lt;a href="https://headspin.io/appium" rel="nofollow noopener"&gt;Appium&lt;/a&gt; test in Kotlin. I’ll be using the &lt;a href="https://play.google.com/store/apps/details?id=com.google.android.apps.magazines" rel="nofollow noopener"&gt;Google News Android app&lt;/a&gt; as the target for this example and test on a real Google Pixel 3 XL from the &lt;a href="https://www.headspin.io/platform" rel="nofollow noopener"&gt;HeadSpin&lt;/a&gt; platform.&lt;/p&gt;

&lt;p&gt;Kotlin is fully compatible with Java so we can fortunately leverage the Appium Java client and JUnit libraries in addition to writing our code in the IntelliJ IDE. IntelliJ has a free community version called IntelliJ IDEA CE, which can be downloaded from their &lt;a href="https://www.jetbrains.com/idea/download/" rel="nofollow noopener"&gt;website&lt;/a&gt; or via your package manager.&lt;/p&gt;


&lt;br&gt;
                &lt;br&gt;
            &lt;h3&gt;Getting started&lt;/h3&gt; &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                    &lt;p&gt;In IntelliJ IDE, navigate to &lt;em&gt;File &amp;gt; New Project&lt;/em&gt;. Select &lt;em&gt;Gradle&lt;/em&gt; and under &lt;em&gt;Additional Libraries and Frameworks&lt;/em&gt; select &lt;em&gt;Kotlin/JVM&lt;/em&gt;. &lt;/p&gt;
&lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                    &lt;br&gt;
                                        &lt;img width="1024" height="573" src="https://res.cloudinary.com/practicaldev/image/fetch/s--7lbGBqTv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/04/KotlinJVM-1024x573.png" alt=""&gt; &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                    &lt;p&gt;In the Project file view on the left, open the &lt;em&gt;build.gradle&lt;/em&gt; file and add the following dependencies:&lt;/p&gt;
&lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                    &lt;pre&gt;testCompile group: 'junit', name: 'junit', version: '4.13'&lt;br&gt;
compile group: 'io.appium', name: 'java-client', version: '7.3.0'&lt;/pre&gt;
&lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                    &lt;p&gt;We will add the Appium tests in the &lt;em&gt;src/test/kotlin&lt;/em&gt; project directory.&lt;/p&gt;
&lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                    &lt;br&gt;
                                        &lt;img width="656" height="874" src="https://res.cloudinary.com/practicaldev/image/fetch/s--70ZLHyw8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/04/Kotlin-file-structure.png" alt=""&gt; &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                    

&lt;p&gt;Right click the &lt;em&gt;kotlin&lt;/em&gt; subdirectory and select &lt;em&gt;New &amp;gt; Kotlin File/Class&lt;/em&gt;. Create three new classes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;ProjectCapabilities&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;TestBase&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;GoogleNewsAndroidTest&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                    &lt;br&gt;
                                        &lt;img width="690" height="384" src="https://res.cloudinary.com/practicaldev/image/fetch/s--8zXkaw5z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/04/New-Kotline-File-.png" alt=""&gt; &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                    &lt;p&gt;We will structure the project in these three classes to make the organization clear. The &lt;em&gt;ProjectCapabilities&lt;/em&gt; class will return the Desired Capabilities, &lt;em&gt;TestBase&lt;/em&gt; will be a base class for our test for scaffolding the test setup and teardown, and lastly the &lt;em&gt;GoogleNewsAndroidTest&lt;/em&gt; class will inherit from our &lt;em&gt;TestBase&lt;/em&gt;, use the Desired Capabilities, and contain our test logic.&lt;/p&gt;
&lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
            &lt;h3&gt;1. ProjectCapabilities Class&lt;/h3&gt; &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                    &lt;p&gt;Let’s get started with the ProjectCapabilities class. This class will have a method to return the Desired Capabilities.&lt;/p&gt;
&lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                    &lt;pre&gt;import org.openqa.selenium.remote.DesiredCapabilities

&lt;p&gt;class ProjectCapabilities {&lt;br&gt;
    companion object {&lt;br&gt;
        fun AndroidBaseCapabilities(): DesiredCapabilities {&lt;br&gt;
            val caps = DesiredCapabilities()&lt;br&gt;
            caps.setCapability("autoAcceptAlerts", true)&lt;br&gt;
            caps.setCapability("platformName", "Android")&lt;br&gt;
            caps.setCapability("automationName", "UiAutomator2")&lt;br&gt;
            caps.setCapability("deviceName", "8ABY0H6YG")&lt;br&gt;
            caps.setCapability("udid", "8ABY0H6YG")&lt;br&gt;
            caps.setCapability("appPackage", "com.google.android.apps.magazines")&lt;br&gt;
            caps.setCapability("appActivity", "com.google.apps.dots.android.app.activity.CurrentsStartActivity")&lt;br&gt;
            return caps&lt;br&gt;
        }&lt;br&gt;
    }&lt;br&gt;
}&lt;/p&gt;&lt;/pre&gt;
&lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                    

&lt;p&gt;Functions and Methods in Kotlin are declared with the “fun” keyword. You can also indicate the function return type with a colon followed by the type. We can make this a static class method by declaring it in a “companion object.” You can create read-only variables with “val” and variables that can be reassigned with “var”.&lt;/p&gt;

&lt;p&gt;In this case I am targeting a real Pixel 3 XL device in the HeadSpin platform. From the HeadSpin Web UI you can get the minimum Desired Capabilities for the device by clicking on the vertical dots menu and selecting Automation Configuration.&lt;/p&gt;


&lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                    &lt;br&gt;
                                        &lt;img width="1024" height="407" src="https://res.cloudinary.com/practicaldev/image/fetch/s--_Spi5fe---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/04/HeadSpin-Device-Interface-1024x407.png" alt=""&gt; &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                    &lt;p&gt;For the appPackage and appActivity I am specifying the associated values for the Google News Android app.&lt;/p&gt;
&lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
            &lt;h3&gt;2. TestBase Class&lt;/h3&gt; &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                    

&lt;p&gt;Next, let’s work on our TestBase class. By default classes in Kotlin are implicitly final and can’t be inherited. To make a class inheritable, we’ll mark it with the “open” keyword. In this class we will create property variables for the: driver, capabilities, HeadSpin API Token, and WebDriver URL. We’ll provide visibility modifiers to our properties, in this case:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;u&gt;Protected&lt;/u&gt;: Only visible in the class or subclasses&lt;/li&gt;
&lt;li&gt;
&lt;u&gt;Private&lt;/u&gt;: Only visible in the class&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We’ll also mark our Desired Capabilities variable as “open” so it can be overridden from our GoogleNewsAndroidTest class which inherits from the TestBase class.&lt;/p&gt;

&lt;p&gt;In addition you can indicate whether a variable can be null. The ability to declare this upfront is a great feature of the Kotlin language because it protects against unexpected NullPointerExceptions from our code. In this case we can indicate that the driver and caps can be null with “?” after the type and and set them to null. Kotlin also supports string interpolation by using the “$” character to interpolate a variable or “${}” to interpolate an expression. We’ll use this convenient language feature to pass our HeadSpin API Token to our WebDriver URL string.&lt;/p&gt;

&lt;p&gt;Our TestBase will also have two JUnit annotations: @Before for our setup function and @After for our teardown to perform a driver quit. Our setup function will be straightforward and it will instantiate the driver object. In our teardown function we’ll check to see if the driver object is not null and if so quit our session. Otherwise we will throw an Exception. Kotlin provides a convenience operator for checking for a null condition with “?:”. This is called the Elvis Operator because if you turn your head sideways the question mark character looks like a swoosh of hair and the colon looks like eyes.&lt;/p&gt;


&lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                    &lt;br&gt;
                                        &lt;img width="458" height="514" src="https://res.cloudinary.com/practicaldev/image/fetch/s--B2aLdUm9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/04/rockstar.png" alt=""&gt; &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                    &lt;p&gt;Do you see the resemblance now? Haha either way, the source code for the class can be found below and let’s carry on.&lt;/p&gt;
&lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                    &lt;pre&gt;import io.appium.java_client.MobileElement&lt;br&gt;
import io.appium.java_client.android.AndroidDriver&lt;br&gt;
import org.junit.After&lt;br&gt;
import org.junit.Before&lt;br&gt;
import org.openqa.selenium.remote.DesiredCapabilities&lt;br&gt;
import java.lang.Exception&lt;br&gt;
import java.net.URL

&lt;p&gt;open class TestBase {&lt;br&gt;
    protected var driver: AndroidDriver&amp;lt;MobileElement&amp;gt;? = null&lt;br&gt;
    protected open var caps: DesiredCapabilities? = null&lt;br&gt;
    private val headSpinAPIToken: String = "your-api-token-here"&lt;br&gt;
    private val webDriverURL: URL = URL("&lt;a href="https://appium-dev.headspin.io/v0/%24headSpinAPIToken/wd/hub%22"&gt;https://appium-dev.headspin.io/v0/$headSpinAPIToken/wd/hub"&lt;/a&gt;)&lt;/p&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Before
fun setUp() {
    this.driver = AndroidDriver(webDriverURL, caps)
}

@After
fun tearDown() {
    this.driver?.quit() ?: throw Exception("Driver instance was unable to quit.")
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;}&lt;/p&gt;&lt;/pre&gt;
&lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
            &lt;h3&gt;3. GoogleNewsAndroidTest Class&lt;br&gt;
&lt;/h3&gt; &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                    &lt;p&gt;Our last class, GoogleNewsAndroidTest will have our test logic. Here we have one test function annotated with the JUnit Test annotation. Our test will be simple and straightforward, we will tap on the Headlines tab button and then scroll down from the list of news articles. Since we will be performing driver actions we’ll need to first ensure the driver is not null. Kotlin provides a way to perform an operation only if the value is not null using the “?” (the safe call operator) together with “let.”&lt;/p&gt;
&lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                    &lt;pre&gt;import io.appium.java_client.MobileBy&lt;br&gt;
import org.junit.Test&lt;br&gt;
import org.openqa.selenium.interactions.Interaction&lt;br&gt;
import org.openqa.selenium.interactions.PointerInput&lt;br&gt;
import org.openqa.selenium.interactions.Sequence&lt;br&gt;
import org.openqa.selenium.remote.DesiredCapabilities&lt;br&gt;
import org.openqa.selenium.support.ui.ExpectedConditions&lt;br&gt;
import org.openqa.selenium.support.ui.WebDriverWait&lt;br&gt;
import java.time.Duration

&lt;p&gt;class GoogleNewsAndroidTest: TestBase() {&lt;br&gt;
    override var caps: DesiredCapabilities? = ProjectCapabilities.AndroidBaseCapabilities()&lt;br&gt;
    private val headlinesTabButton: String = "com.google.android.apps.magazines:id/tab_headlines"&lt;/p&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Test
fun headlinesScrollTest() {

    // Set an explicit wait of 10 seconds
    val wait = WebDriverWait(driver?.let { it }, 10)

    // Tap on the Headlines tab button
    wait.until(ExpectedConditions.presenceOfElementLocated(MobileBy.id(headlinesTabButton))).click()

    // Scroll Down
    val finger: PointerInput = PointerInput(PointerInput.Kind.TOUCH, "finger")
    val moveToStart: Interaction = finger.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 726, 2452)
    val pressDown: Interaction = finger.createPointerDown(PointerInput.MouseButton.LEFT.asArg());
    val moveToEnd: Interaction = finger.createPointerMove(Duration.ofMillis(1000), PointerInput.Origin.viewport(), 726, 660)
    val pressUp: Interaction = finger.createPointerUp(PointerInput.MouseButton.LEFT.asArg())

    val swipe = Sequence(finger, 0)
    swipe.addAction(moveToStart)
    swipe.addAction(pressDown)
    swipe.addAction(moveToEnd)
    swipe.addAction(pressUp)

    driver?.let { it.perform(arrayListOf(swipe)) }

}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;}&lt;/p&gt;&lt;/pre&gt;
&lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
            &lt;h3&gt;Conclusion&lt;br&gt;
&lt;/h3&gt; &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                    &lt;p&gt;Our work here is done! We can now execute our test and watch it in action.&lt;/p&gt;
&lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                    &lt;br&gt;
                                        &lt;img width="1024" height="260" src="https://res.cloudinary.com/practicaldev/image/fetch/s--0-xxtm4u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/04/GoogleNewsAndroidTest-1024x260.png" alt=""&gt; &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                    &lt;p&gt;Congratulations you now have a taste of what it’s like to write an Appium test in Kotlin! If this article has helped further your knowledge feel free to Like or Share it. You can download the full project source code &lt;a href="https://www.dropbox.com/s/xhhi100powwcbj2/Nathan%20-%20KotlinAppiumReference.zip?dl=0" rel="nofollow noopener"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                        &lt;br&gt;
            &lt;br&gt;
        &lt;br&gt;
                        &lt;br&gt;
            &lt;br&gt;
        

&lt;p&gt;The post &lt;a href="https://www.headspin.io/blog/appium/writing-an-appium-test-in-kotlin/"&gt;Writing an Appium test in Kotlin&lt;/a&gt; appeared first on &lt;a href="https://www.headspin.io"&gt;HeadSpin&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>appium</category>
      <category>tutorial</category>
      <category>kotlin</category>
      <category>automation</category>
    </item>
    <item>
      <title>How to Automate the Zoom Video Meetings App</title>
      <dc:creator>HeadSpin</dc:creator>
      <pubDate>Thu, 23 Apr 2020 17:11:42 +0000</pubDate>
      <link>https://dev.to/headspin_io/how-to-automate-the-zoom-video-meetings-app-app</link>
      <guid>https://dev.to/headspin_io/how-to-automate-the-zoom-video-meetings-app-app</guid>
      <description>&lt;p&gt;Last week I tried something new: &lt;a href="https://ui.headspin.io/university/feed/automation-happy-hour-1"&gt;Automation Happy Hour&lt;/a&gt;. In this live stream event, I downloaded the Zoom app for Android and tried to build a simple testsuite for it in about an hour. I think this type of real-world “case study” is really interesting. My expectation is that discussing automation of real apps “in the wild” would also be useful for Appium Pro readers, so periodically, I will take the results of these explorations and turn them into Appium Pro articles!&lt;/p&gt;

&lt;p&gt;(NB: In the live stream, I chose to work in Python, but for this article I converted all the code examples to Java.)&lt;/p&gt;

&lt;h3 id="starting-a-session-with-zoom"&gt;Starting a session with Zoom&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://zoom.us/"&gt;Zoom&lt;/a&gt; is incredibly popular. It seems like everyone is using it for their video meetings these days. How can we launch it in an automation context with Appium?&lt;/p&gt;

&lt;p&gt;First, we need to decide whether to have Appium install the Zoom app for us, or to have the app on the phone and simply launch it when our session starts. I already had the Zoom app on my device, so I chose the latter route, but you could also find a downloadable Zoom APK, put it somewhere on your system, and reference it as the &lt;code&gt;app&lt;/code&gt; capability.&lt;/p&gt;

&lt;p&gt;Since I had the app already, I needed to know its package id and launching activity to get Appium to start it for me. Using the helpful ADB command &lt;code&gt;adb dumpsys window windows&lt;/code&gt;, I determined Zoom’s info, and entered that into my set of capabilities:&lt;/p&gt;


&lt;br&gt;
                &lt;br&gt;
            &lt;pre&gt;caps.setCapability(&lt;span&gt;"platformName"&lt;/span&gt;, &lt;span&gt;"Android"&lt;/span&gt;)&lt;span&gt;;&lt;/span&gt;&lt;br&gt;
caps.setCapability(&lt;span&gt;"deviceName"&lt;/span&gt;, &lt;span&gt;"Android"&lt;/span&gt;)&lt;span&gt;;&lt;/span&gt;&lt;br&gt;
caps.setCapability(&lt;span&gt;"appPackage"&lt;/span&gt;, &lt;span&gt;"us.zoom.videomeetings"&lt;/span&gt;)&lt;span&gt;;&lt;/span&gt;&lt;br&gt;
caps.setCapability(&lt;span&gt;"appActivity"&lt;/span&gt;, &lt;span&gt;"com.zipow.videobox.LauncherActivity"&lt;/span&gt;)&lt;span&gt;;&lt;/span&gt;&lt;br&gt;
caps.setCapability(&lt;span&gt;"automationName"&lt;/span&gt;, &lt;span&gt;"UiAutomator2"&lt;/span&gt;)&lt;span&gt;;&lt;/span&gt;&lt;br&gt;
&lt;/pre&gt; &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                    

&lt;p&gt;(The important bits above are the &lt;code&gt;appPackage&lt;/code&gt; and &lt;code&gt;appActivity&lt;/code&gt; capabilities). Using these caps, we can launch zoom in an automation context!&lt;/p&gt;

&lt;h3 id="joining-a-meeting"&gt;Joining a meeting&lt;/h3&gt;

&lt;p&gt;The goal is to do something useful with automation, so let’s see how it’s possible to join a Zoom meeting from a device controlled by Appium. Before we begin, we’ll obviously need a Zoom meeting to join! I started one on my computer, so that I could determine its meeting ID and password. These are the two pieces of information you’ll need that are unique to your case, and to work with my code examples, you’ll need to set them as environment variables, so that they can be read from our test class:&lt;/p&gt;


&lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
            &lt;pre&gt;&lt;span&gt;private&lt;/span&gt; &lt;span&gt;static&lt;/span&gt; final &lt;span&gt;String&lt;/span&gt; MEETING_ID &lt;span&gt;=&lt;/span&gt; &lt;span&gt;System&lt;/span&gt;.getenv(&lt;span&gt;"ZOOM_MEETING_ID"&lt;/span&gt;);&lt;br&gt;
&lt;span&gt;private&lt;/span&gt; &lt;span&gt;static&lt;/span&gt; final &lt;span&gt;String&lt;/span&gt; MEETING_PW &lt;span&gt;=&lt;/span&gt; &lt;span&gt;System&lt;/span&gt;.getenv(&lt;span&gt;"ZOOM_MEETING_PW"&lt;/span&gt;);&lt;br&gt;
&lt;/pre&gt; &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                    

&lt;p&gt;(I.e., you need to set the &lt;code&gt;ZOOM_MEETING_ID&lt;/code&gt; and &lt;code&gt;ZOOM_MEETING_PW&lt;/code&gt; environment vars to run the examples successfully, based on a meeting that you own or know about–and, please, no zoom-bombing!)&lt;/p&gt;

&lt;p&gt;It turns out that Zoom is a highly automatable app! Its developers included resource IDs for all the useful elements. There were no content descriptions (accessibility IDs) that I could find, however, which makes me think the app may not be super accessible (or, it relies on the default accessibility strategies based on text labels).&lt;/p&gt;

&lt;p&gt;To figure out how to find all the elements I needed to interact with, I used &lt;a href="https://github.com/appium/appium-desktop"&gt;Appium Desktop&lt;/a&gt; to inspect the app (after filling out all the appropriate caps, and starting a session with the inspector). It turns out that the Zoom elements follow a pretty standard naming scheme. Here’s the part of our test class where we define the locators, for example:&lt;/p&gt;


&lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
            &lt;pre&gt;&lt;span&gt;private&lt;/span&gt; By JOIN_MEETING_BUTTON &lt;span&gt;=&lt;/span&gt; By.id(&lt;span&gt;"btnJoinConf"&lt;/span&gt;);&lt;br&gt;
&lt;span&gt;private&lt;/span&gt; By MEETING_ID_FIELD &lt;span&gt;=&lt;/span&gt; By.id(&lt;span&gt;"edtConfNumber"&lt;/span&gt;);&lt;br&gt;
&lt;span&gt;private&lt;/span&gt; By ACTUALLY_JOIN_MEETING_BUTTON &lt;span&gt;=&lt;/span&gt; By.id(&lt;span&gt;"btnJoin"&lt;/span&gt;);&lt;br&gt;
&lt;span&gt;private&lt;/span&gt; By PASSWORD_FIELD &lt;span&gt;=&lt;/span&gt; By.id(&lt;span&gt;"edtPassword"&lt;/span&gt;);&lt;br&gt;
&lt;span&gt;private&lt;/span&gt; By PASSWORD_OK_BUTTON &lt;span&gt;=&lt;/span&gt; By.id(&lt;span&gt;"button1"&lt;/span&gt;);&lt;br&gt;
&lt;span&gt;private&lt;/span&gt; By LEAVE_BTN &lt;span&gt;=&lt;/span&gt; By.id(&lt;span&gt;"btnLeave"&lt;/span&gt;);&lt;br&gt;
&lt;/pre&gt; &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                    

&lt;p&gt;You can see that, apart from &lt;code&gt;PASSWORD_OK_BUTTON&lt;/code&gt; (which is referring to a system alert element), every UI element has a camelCase ID with an abbreviation of the element type at front. Pretty respectable, Zoom!&lt;/p&gt;

&lt;p&gt;Using these locators, we can very straightforwardly walk through the join meeting flow, as the video below shows:&lt;/p&gt;


&lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                    &lt;br&gt;
                                        &lt;img width="399" height="719" src="https://res.cloudinary.com/practicaldev/image/fetch/s--kFOsFYd6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/04/zoom.gif" alt=""&gt; &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                    &lt;p&gt;The test code that implements this is as follows (using the locators defined above):&lt;/p&gt;
&lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
            &lt;pre&gt;@&lt;span&gt;Test&lt;/span&gt;&lt;br&gt;
public void testJoinMeeting&lt;span&gt;()&lt;/span&gt; {&lt;br&gt;
&lt;span&gt;//&lt;/span&gt; navigate through the &lt;span&gt;UI&lt;/span&gt; to join a meeting with correct meeting &lt;span&gt;id&lt;/span&gt; &lt;span&gt;and&lt;/span&gt; password&lt;br&gt;
waitFor(&lt;span&gt;JOIN_MEETING_BUTTON&lt;/span&gt;)&lt;span&gt;.&lt;/span&gt;click&lt;span&gt;()&lt;/span&gt;;&lt;br&gt;
waitFor(&lt;span&gt;MEETING_ID_FIELD&lt;/span&gt;)&lt;span&gt;.&lt;/span&gt;sendKeys(&lt;span&gt;MEETING_ID&lt;/span&gt;);&lt;br&gt;
driver&lt;span&gt;.&lt;/span&gt;findElement(&lt;span&gt;ACTUALLY_JOIN_MEETING_BUTTON&lt;/span&gt;)&lt;span&gt;.&lt;/span&gt;click&lt;span&gt;()&lt;/span&gt;;&lt;br&gt;
waitFor(&lt;span&gt;PASSWORD_FIELD&lt;/span&gt;)&lt;span&gt;.&lt;/span&gt;sendKeys(&lt;span&gt;MEETING_PW&lt;/span&gt;);&lt;br&gt;
driver&lt;span&gt;.&lt;/span&gt;findElement(&lt;span&gt;PASSWORD_OK_BUTTON&lt;/span&gt;)&lt;span&gt;.&lt;/span&gt;click&lt;span&gt;()&lt;/span&gt;;

&lt;p&gt;&lt;span&gt;//&lt;/span&gt; prove that we made it into the meeting by finding the 'leave' button&lt;br&gt;
waitFor(&lt;span&gt;LEAVE_BTN&lt;/span&gt;);&lt;br&gt;
}&lt;br&gt;
&lt;/p&gt;&lt;/pre&gt; &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                    &lt;p&gt;Here we are using a special &lt;code&gt;waitFor&lt;/code&gt; helper which just reduces verbosity in the code:&lt;/p&gt;
&lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
            &lt;pre&gt;private WebElement waitFor(By locator) {&lt;br&gt;
&lt;span&gt;return&lt;/span&gt; &lt;span&gt;wait&lt;/span&gt;.&lt;span&gt;until&lt;/span&gt;(ExpectedConditions.presenceOfElementLocated(locator));&lt;br&gt;
}&lt;br&gt;
&lt;/pre&gt; &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                    

&lt;p&gt;(You might have observed that sometimes we use &lt;code&gt;waitFor&lt;/code&gt; and sometimes we just use &lt;code&gt;driver.findElement&lt;/code&gt;. Why is that? It wouldn’t hurt to use &lt;code&gt;waitFor&lt;/code&gt; everywhere, but in some cases we know that an element will already be present, because we’ve already waited for another element on the same view. If that first element is &lt;em&gt;not&lt;/em&gt; actually present immediately, then there’s no reason to wait however many seconds for it to become present. The test is doomed and we might as well fail quickly!)&lt;/p&gt;

&lt;p&gt;So that’s it! You can as always check out the &lt;a href="https://github.com/cloudgrey-io/appiumpro/blob/master/java/src/test/java/Edition113_Automating_Zoom.java"&gt;full code example&lt;/a&gt; as well. And if you’re interested in checking out some of the Automation Happy Hour live streams (or the video recordings of them), don’t forget to &lt;a href="https://twitter.com/jlipps"&gt;follow me on Twitter&lt;/a&gt;, where I announce these things as well as run polls on what apps I should automate in future episodes.&lt;/p&gt;

&lt;p&gt;Oh, and don’t forget to &lt;a href="https://appiumpro.com/contact"&gt;let me know&lt;/a&gt; if you come up with any interesting (and non-nefarious) use cases for automating Zoom specifically!&lt;/p&gt;


&lt;br&gt;
                &lt;br&gt;
                &lt;br&gt;
                        &lt;br&gt;
            &lt;br&gt;
        &lt;br&gt;
                        &lt;br&gt;
            &lt;br&gt;
        

&lt;p&gt;The post &lt;a href="https://www.headspin.io/blog/appium/how-to-automate-the-zoom-video-meetings-app/"&gt;How to Automate the Zoom Video Meetings App&lt;/a&gt; appeared first on &lt;a href="https://www.headspin.io"&gt;HeadSpin&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>appium</category>
      <category>digitaltestautomat</category>
      <category>mobileapps</category>
      <category>voiceconferencing</category>
    </item>
    <item>
      <title>Active Testing SMS with HeadSpin</title>
      <dc:creator>HeadSpin</dc:creator>
      <pubDate>Thu, 12 Mar 2020 15:48:00 +0000</pubDate>
      <link>https://dev.to/headspin_io/active-testing-sms-with-headspin-20ml</link>
      <guid>https://dev.to/headspin_io/active-testing-sms-with-headspin-20ml</guid>
      <description>&lt;p&gt;SMS testing is a challenge regardless of location, device, or network- due to inaccurate reporting and regional regulations it’s almost impossible to consistently and accurately generate reports. DLR, or Delivery Reporting, is a feature of SMS message termination that reports back if the SMS message has been delivered. Typically, this message is sourced directly from the handset. &lt;/p&gt;

&lt;p&gt;Telecoms providers can report whether an SMS has been delivered, but with no regulations in reporting, much of the data is inaccurate. To make matters more complex, many of the reports that are generated can only report if the transaction was a success or failure. &lt;/p&gt;

&lt;p&gt;In this post, we demonstrate how we can leverage the HeadSpin platform for SMS testing in three high-volume countries: India, China, and Brazil, and discuss how each can be improved. &lt;/p&gt;

&lt;h3&gt;
  
  
  What is “active testing”?
&lt;/h3&gt;

&lt;p&gt;Active testing means your service sends an SMS to a phone or device that you control and then checks to see if the SMS was received and what aspects of the message changed in the process. However, the scope of active testing is larger than running unit or end-to-end testing. Test SMS messages can be sent ad hoc when setting up a new service, or for detecting delivery issues on a particular carrier or within a specific country. The classic approach to “active testing” is to call your colleague in India and tell him you’re sending a message. Understandably, this approach doesn’t scale.&lt;/p&gt;

&lt;h3&gt;
  
  
  What does active testing look for?
&lt;/h3&gt;

&lt;p&gt;Active testing is the best tool for determining if a message sent via a provider will arrive at the destination looking like it is expected to.&lt;a href="https://docs.google.com/document/d/1bSi7fj3QBbYj5fSkeI0JP_f0QztTGWlc1hRUO8-bOHo/edit#heading=h.5y5574yawf8"&gt;Active testing can identify&lt;/a&gt;many of the following issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Character encoding issues&lt;/li&gt;
&lt;li&gt;Consolidator substitution&lt;/li&gt;
&lt;li&gt;Concatenation behavior&lt;/li&gt;
&lt;li&gt;Content modification&lt;/li&gt;
&lt;li&gt;Sender ID modification&lt;/li&gt;
&lt;li&gt;Blocking or content filtering

&lt;ul&gt;
&lt;li&gt;URLs&lt;/li&gt;
&lt;li&gt;Telephone numbers&lt;/li&gt;
&lt;li&gt;Email address&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Actual delivery (remember, DLRs can lie)&lt;/li&gt;
&lt;li&gt;Invalid/valid phone number support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;With HeadSpin, you can identify all kinds of telecom pitfalls from the user’s perspective including&lt;/strong&gt; : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is your Alpha-Sender ID preserved?  Shortcode?&lt;/li&gt;
&lt;li&gt;Are your US long codes working in Europe?   EMEA? APAC?&lt;/li&gt;
&lt;li&gt;Are any of your numbers re-written?&lt;/li&gt;
&lt;li&gt;Does your app signup really work in the middle of Africa?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jq08oD1r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://lh5.googleusercontent.com/ynlh0gRQxtCOoo6C4QSY_kF13IrvePsSUveTf1MiVadm4NavTDf_MvREJQf56AyUVzgrgq1zxb_7oZRUaIQMMy8BUwITfPrxeHPwVC-wxFJXbL2RsIQUWzpPxSNErUMB-eaObx2w" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jq08oD1r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://lh5.googleusercontent.com/ynlh0gRQxtCOoo6C4QSY_kF13IrvePsSUveTf1MiVadm4NavTDf_MvREJQf56AyUVzgrgq1zxb_7oZRUaIQMMy8BUwITfPrxeHPwVC-wxFJXbL2RsIQUWzpPxSNErUMB-eaObx2w" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;HeadSpin’s POP, or Point of Presence, phones allow any support or engineering team to have a physical presence across the globe. &lt;/p&gt;

&lt;p&gt;Examples of failures identified with HeadSpin and “active testing” include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Identifying delivery failures in China.&lt;/li&gt;
&lt;li&gt;Customer’s improper regex phone number configuration in African countries..&lt;/li&gt;
&lt;li&gt;Identifying carrier rewrites in numerous countries.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Active SMS Testing in India, China, and Brazil
&lt;/h2&gt;

&lt;p&gt;Let’s see how a Leading CPaaS provider’s general ( &lt;strong&gt;CPaaS SMS&lt;/strong&gt; ) and turnkey ( &lt;strong&gt;CPaaS Turnkey&lt;/strong&gt; ) solutions work out of the box to deliver in three high-volume countries – India, China, and Brazil. India has a heavily regulated telecom system with many rules around when and what you can send. China, on the other hand, is constrained by the great firewall which could, at any time, suspend or delay messages. China is also quite draconian if you send messages with illicit content.  Doing so may very well result in the suspension or loss of your SMS sending privileges. Brazil has historically had issues with carriers and Unicode making it another fun country to experiment with.  &lt;/p&gt;

&lt;p&gt;We’ll use the &lt;strong&gt;CPaaS Turnkey&lt;/strong&gt; API’s default configuration to send OTPs. For India, this means it should deliver to recipients via a registered &lt;a href="https://support.twilio.com/hc/en-us/articles/223133767-International-support-for-Alphanumeric-Sender-ID"&gt;Alpha Sender ID&lt;/a&gt;. For Programmable SMS, we’ll simply register a US long code with CPaaS provider to send directly to the HeadSpin POP handsets.&lt;/p&gt;

&lt;p&gt;Once we’ve found a phone to test with, the very first step is to simply text your own phone as a reality check. Honestly, it’s pretty amazing to initiate an SMS from the other side of the world and watch it show up to your own local phone within seconds. This first step just demonstrates that everything is working.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DdxRcSWH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/03/Screen-Shot-2020-03-10-at-4.57.52-PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DdxRcSWH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/03/Screen-Shot-2020-03-10-at-4.57.52-PM.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Discovery Data Points
&lt;/h3&gt;

&lt;p&gt;The intent of this testing is to see the real-world SMS experience a user has on their phone in each location. We will record each data point as below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mobile Number:&lt;/strong&gt;   Phone numbers associated with HeadSpin device&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Device:&lt;/strong&gt;   What kind of device?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Location:&lt;/strong&gt; Where is the device located?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Carrier:&lt;/strong&gt;  Carrier the device is using&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Country to US:&lt;/strong&gt;   Are we able to send an SMS from India to the device in the US&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CPaaS SMS to Country:&lt;/strong&gt;  Are we able to send an SMS to the device from the US via Programmable?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CPaas Turnkey to Country:&lt;/strong&gt; Are we able to send an SMS to the device?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expected Body:&lt;/strong&gt;   Did the carriers process the body correctly?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Message Body&lt;/strong&gt; :  “Hello from San Francisco?!”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Long Message Body: “&lt;/strong&gt; The lazy brown fox jumped over the fence.  The lazy brown fox jumped over the fence. ……”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unicode Body:&lt;/strong&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KNaHpu63--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://s.w.org/images/core/emoji/12.0.0-1/72x72/2600.png" alt="☀"&gt; &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RXn1jdgR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://s.w.org/images/core/emoji/12.0.0-1/72x72/2601.png" alt="☁"&gt; &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AsIbNS3Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://s.w.org/images/core/emoji/12.0.0-1/72x72/2602.png" alt="☂"&gt; &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xnAKTBKU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://s.w.org/images/core/emoji/12.0.0-1/72x72/2603.png" alt="☃"&gt; &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UkmewJfc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://s.w.org/images/core/emoji/12.0.0-1/72x72/2604.png" alt="☄"&gt; ★ ☆ ☇ ☈ ☉ ☊ ☋ ☌ ☍ &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Cec9E7fC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://s.w.org/images/core/emoji/12.0.0-1/72x72/260e.png" alt="☎"&gt; ☏ ☐ &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GK-ooE6A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://s.w.org/images/core/emoji/12.0.0-1/72x72/2611.png" alt="☑"&gt; ☒ ☓ ☚ ☛ ☜ &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xWGXLv1a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://s.w.org/images/core/emoji/12.0.0-1/72x72/261d.png" alt="☝"&gt; ☞ ☟ &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6xVbB-2S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://s.w.org/images/core/emoji/12.0.0-1/72x72/2620.png" alt="☠"&gt; ☡ &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--t7ajEwxa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://s.w.org/images/core/emoji/12.0.0-1/72x72/2622.png" alt="☢"&gt; &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qM7hTdNc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://s.w.org/images/core/emoji/12.0.0-1/72x72/2623.png" alt="☣"&gt; ☤&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DNA = Did Not Arrive&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  India Testing
&lt;/h2&gt;

&lt;p&gt;A Note 5 Pro device on HeadSpin’s public cloud is depicted below. This is one of 3 devices we’re using to test telephony delivery in India.  Each device uses a different carrier network and supports both automated and manual QA testing via any testing framework.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--p4Zh5YD4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://lh3.googleusercontent.com/MqW6Ow9Jtn_S0YqO5l5A4wpiy_hc8s9ZUN6c5MeY4HaoDAsiTBAEv_dZgLIheoRs6BdOSO1n0rLnJWBJ28RGJjCPzuH7U56P8N9hHTyvUauibdCCEscQAqUlxtV-kqKiKzkPDs-a" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--p4Zh5YD4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://lh3.googleusercontent.com/MqW6Ow9Jtn_S0YqO5l5A4wpiy_hc8s9ZUN6c5MeY4HaoDAsiTBAEv_dZgLIheoRs6BdOSO1n0rLnJWBJ28RGJjCPzuH7U56P8N9hHTyvUauibdCCEscQAqUlxtV-kqKiKzkPDs-a" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Data from Testing in India
&lt;/h2&gt;

&lt;p&gt;| Mobile Number | +91XXXXX | +91XXXXX | +91XXXXX |&lt;br&gt;
| Device | iPhone 6 | iPhone 11 | XIAOMI Redmi Note 5 Pro |&lt;br&gt;
| Location | Bangalore | Bangalore | Bangalore |&lt;br&gt;
| Carrier | Air Tel | Jio | Vodafone |&lt;br&gt;
| India to US | No lag | No lag | No lag |&lt;br&gt;
| &lt;strong&gt;CPaaS SMS&lt;/strong&gt; to India | &lt;strong&gt;DNA&lt;/strong&gt; | &lt;strong&gt;DNA&lt;/strong&gt; | &lt;strong&gt;DNA&lt;/strong&gt; |&lt;br&gt;
| &lt;strong&gt;CPaas Turnkey&lt;/strong&gt; &amp;gt; India | No lag | No lag | No lag |&lt;br&gt;
| Expected Body? | Yes | Yes | Yes |&lt;br&gt;
| Unicode Issues? | No | No | No |&lt;br&gt;
| Delivered By? | 5757556 | 5757556 / BZ-AUTHMS | 503501 / 5676735 |&lt;br&gt;
| Lag | No | No | Little |&lt;/p&gt;

&lt;h3&gt;
  
  
  India Conclusion
&lt;/h3&gt;

&lt;p&gt;Admittedly, this is a pretty small sample size but it gives you a general idea of what kind of experience a user can have with different carriers in each location.&lt;/p&gt;

&lt;p&gt;The most obvious issue here is the non-delivery of SMSs to India via the &lt;strong&gt;CPaaS SMS&lt;/strong&gt; API.  This is expected behavior as delivery to India typically requires jumping through &lt;a href="https://support.twilio.com/hc/en-us/articles/223134167-Limitations-sending-SMS-messages-to-Indian-mobile-devices"&gt;several technological and bureaucratic hoops&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;The real winner in this small sample size is the &lt;strong&gt;CPaaS Turnkey&lt;/strong&gt;. Obviously, they have nailed their implementation as everything was delivered in a timely manner. The interesting observation is that out of the six attempts, it seems only one was delivered via the Alpha Sender ID registered in India. This could be a side-effect of the intelligent retry logic or simply Indian carrier mischief.&lt;/p&gt;

&lt;h2&gt;
  
  
  China Testing
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KxC_d-l3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://lh5.googleusercontent.com/paiQ9JmyAlCz1WwaffkEeaY8C3YqXjvd38viS4ODA5uUMeVgHmpDn7MKkIfwXEBDdpnSglKuwdHYmJmj3trOUdympD3o_s801U9mfWbxSpi4lGbpccZhe19vtWs-bYjXdnQXKHaZ" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KxC_d-l3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://lh5.googleusercontent.com/paiQ9JmyAlCz1WwaffkEeaY8C3YqXjvd38viS4ODA5uUMeVgHmpDn7MKkIfwXEBDdpnSglKuwdHYmJmj3trOUdympD3o_s801U9mfWbxSpi4lGbpccZhe19vtWs-bYjXdnQXKHaZ" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For testing in China, we focused on two major metro areas, Shanghai and Beijing.  You’ll also note that each phone used a completely different carrier. DNA denotes, did not arrive.&lt;/p&gt;

&lt;h3&gt;
  
  
  Data from Testing in China
&lt;/h3&gt;

&lt;p&gt;| Mobile Number | +86XXXXX | +86XXXXX | +86XXXXX |&lt;br&gt;
| Device | iPhone 7 | XIAOMI Mi A2 | iPhone 7 |&lt;br&gt;
| Location | Beijing | Shanghai | Shanghai |&lt;br&gt;
| Carrier | China Mobile | China Unicom | China Telecom |&lt;br&gt;
| China to US | Zero Lag | Zero Lag | Zero Lag |&lt;br&gt;
| &lt;strong&gt;CPaaS SMS&lt;/strong&gt; to China | &lt;strong&gt;DNA&lt;/strong&gt; | Minimal Lag | Minimal Lag |&lt;br&gt;
| Expected Body? | &lt;strong&gt;DNA&lt;/strong&gt; | Yes | Yes |&lt;br&gt;
| Unicode Issues? | &lt;strong&gt;DNA&lt;/strong&gt; | Very Fast | Very Fast |&lt;br&gt;
| Delivered By? | &lt;strong&gt;DNA&lt;/strong&gt; | 13067643145 | 13136240203 |&lt;br&gt;
| Lag | &lt;strong&gt;DNA&lt;/strong&gt; | None | Few seconds |&lt;br&gt;
| Multibody? | &lt;strong&gt;DNA&lt;/strong&gt; | Supported | Supported |&lt;br&gt;
| &lt;strong&gt;CPaaS Turnkey&lt;/strong&gt; &amp;gt; China | &lt;strong&gt;DNA&lt;/strong&gt; | &lt;strong&gt;DNA&lt;/strong&gt; | &lt;strong&gt;DNA&lt;/strong&gt; |&lt;/p&gt;

&lt;h3&gt;
  
  
  China Conclusion
&lt;/h3&gt;

&lt;p&gt;Testing with HeadSpin in China resulted in the complete opposite experience from India. In this case, 33% of Programmable SMS failed to arrive, and NO Verify messages sent to China arrive.  Like most Voice or SMS API calls to phones terminating in China, misconfiguration or mischief by the Chinese firewall is surely to blame.&lt;/p&gt;

&lt;p&gt;Interestingly enough, the message sent from China to the US arrived quicker than any other test.&lt;/p&gt;

&lt;h2&gt;
  
  
  Brazil Testing
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VsTfiBa9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://lh3.googleusercontent.com/e0USQ1X1XqQa5aXWSkYCS94Q4IRTp3JL5vwbg8Sjeni2JXQEfIAN3HP8gicLdIgDzI87IVhWTGfWTyCM-hUa5F-iiQrTbFk62qC0yzGhqKVZh_gzookmuZf_beHB2nVoPXQw1HSw" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VsTfiBa9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://lh3.googleusercontent.com/e0USQ1X1XqQa5aXWSkYCS94Q4IRTp3JL5vwbg8Sjeni2JXQEfIAN3HP8gicLdIgDzI87IVhWTGfWTyCM-hUa5F-iiQrTbFk62qC0yzGhqKVZh_gzookmuZf_beHB2nVoPXQw1HSw" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Testing in Brazil was limited to a single carrier network. Overall, Brazil demonstrated the best performance across devices. The carrier behavior did not vary between phones and provided the fastest experience across all three test countries.&lt;/p&gt;

&lt;h3&gt;
  
  
  Data from Testing in Brazil
&lt;/h3&gt;

&lt;p&gt;| Mobile Number | +55XXXXX | +55XXXXX | +55XXXXX |&lt;br&gt;
| Device | iPhone XS | iPhone 6s | iPhone 7 |&lt;br&gt;
| Location | São Paulo | São Paulo | São Paulo |&lt;br&gt;
| Carrier | Vivo | Vivo | Vivo |&lt;br&gt;
| India to US | No lag | No lag | No lag |&lt;br&gt;
| &lt;strong&gt;CPaaS SMS&lt;/strong&gt; to Brazil | No lag | No lag | No lag |&lt;br&gt;
| Expected Body? | Yes | Yes | Yes |&lt;br&gt;
| Unicode Issues? | No | No | No |&lt;br&gt;
| Delivered By? | 27199 | 27199 | 27199 |&lt;br&gt;
| Lag | No | No | No |&lt;br&gt;
| &lt;strong&gt;CPaaS Turnkey&lt;/strong&gt; &amp;gt; Brazil | No lag | No lag | No lag |&lt;br&gt;
| Expected Body? | Yes | Yes | Yes |&lt;br&gt;
| Unicode Issues? | No | No | No |&lt;br&gt;
| Delivered By? | 27199 | 27199 | 27199 |&lt;br&gt;
| Lag | No | No | No |&lt;/p&gt;

&lt;h3&gt;
  
  
  Brazil Conclusion
&lt;/h3&gt;

&lt;p&gt;Testing in Brazil seems to have provided the best results out of the three countries. At the time of testing, there were limited Brazilian carriers to test with but on a positive note, the experience was exactly the same across each device.&lt;/p&gt;

&lt;h1&gt;
  
  
  Why Active Testing Matters to You!
&lt;/h1&gt;

&lt;p&gt;Working with telecom is a fickle beast. When talking with customers, I frequently compare sending an SMS to sending a UDP packet.  With both of these technologies, you initiate a send and the data is off! But, you never know if it has gotten to its destination. Any number of issues could affect the delivery.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Queueing (is there a football game in Munich, a cricket game in Lahore?)&lt;/li&gt;
&lt;li&gt;Infrastructure Issues&lt;/li&gt;
&lt;li&gt;Political Suppression&lt;/li&gt;
&lt;li&gt;Grey Routes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Another way to think of SMS telephony is to consider hiring a container ship to deliver goods to a port of call. You can hire a cheaper company that takes the long route around South America or the more expensive company which goes through the Panama Canal. It is this route that has a far higher likelihood of arriving on time at the port of call.  Your cheaper company may end up at the bottom of the sea while rounding Cape Horn.   &lt;/p&gt;

&lt;p&gt;As a mobile developer, you’ll have a clear understanding of how your mobile experience will play when leveraging HeadSpin’s robust suite of testing and performance monitoring solutions.  You can take immediate control of a phone anywhere in the world with our &lt;a href="https://www.headspin.io/platform/global-device-cloud/"&gt;Global Device Cloud&lt;/a&gt; and test to your heart’s content. Looking for a more robust long term solution? Leverage your own private cloud for &lt;a href="https://www.headspin.io/solutions/digital-test-automation/"&gt;automated testing&lt;/a&gt; or setup hourly, daily, weekly &lt;a href="https://www.headspin.io/solutions/digital-test-automation/"&gt;testing&lt;/a&gt; and &lt;a href="https://www.headspin.io/benchmark-report/"&gt;benchmark reporting&lt;/a&gt; to identify trends and issues around your KPIs.&lt;/p&gt;

&lt;p&gt;HeadSpin can help you automate functional, performance, and load testing across applications, devices, and networks to optimize digital experiences enabled by mobile, web, IoT, and 5G.  Want to give HeadSpin a try? We have a Point of Presence in over 100 countries, 190 locations consisting of 30,000 devices. Reach out via our &lt;a href="https://www.headspin.io/contact/"&gt;Contact Us&lt;/a&gt; form and we will coordinate a discussion and demo.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.headspin.io/blog/mobile/active-testing-sms-with-headspin/"&gt;Active Testing SMS with HeadSpin&lt;/a&gt; appeared first on &lt;a href="https://www.headspin.io"&gt;HeadSpin&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>sms</category>
    </item>
    <item>
      <title>“Personal Trainer” for your mobile apps</title>
      <dc:creator>HeadSpin</dc:creator>
      <pubDate>Tue, 28 Jan 2020 22:44:22 +0000</pubDate>
      <link>https://dev.to/headspin_io/personal-trainer-for-your-mobile-apps-a3f</link>
      <guid>https://dev.to/headspin_io/personal-trainer-for-your-mobile-apps-a3f</guid>
      <description>&lt;p&gt;I remember the early days of using an app to track my runs. I diligently tried out 4-5 apps and then finally settled on one that was the most convenient to measure my run, and clearly displayed the metrics I cared about. Battery consumption is a crucial part of this experience, given that no one wants to lug around a portable battery pack while they are on their run.&lt;/p&gt;

&lt;p&gt;However, it’s a no-brainer that there will be some sort of a tax on the smartphone, especially if your user is combining multiple apps and hardware experiences. Most folks who use these live-tracking apps use them in conjunction with their favorite media streaming apps — usually listening to music or a podcast over their headphones (wire or wireless). What’s important for any app developer is to identify and measure how their apps actually take battery and other aspects into account when building a seamless user experience. For example, how can app developers test these on-the-move experiences before they launch new features? How can they &lt;a href="https://www.headspin.io/ux-monitoring/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=mobile"&gt;continue to track performance post-launch&lt;/a&gt;? &lt;b&gt;And how can they do &lt;/b&gt;&lt;b&gt;&lt;i&gt;these things without an SDK, please?!?&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;span&gt;At &lt;/span&gt;&lt;a href="https://headspin.io/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=mobile"&gt;&lt;span&gt;HeadSpin&lt;/span&gt;&lt;/a&gt;&lt;span&gt;, we are constantly thinking of tools and performance insights that developers need to test their apps and games, on real devices anywhere in the world. Innovating upon our on-premise solution, we built the &lt;/span&gt;&lt;span&gt;first-of-its-kind portable solution that provides results that accurately depict real-world conditions, be it testing on real devices while driving, commuting between places, or walking/running around pedestrian areas or events.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ckEQR8v9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/01/2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ckEQR8v9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/01/2.png" alt="AnyWear Mobility Unit"&gt;&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;Our sleek &lt;a href="https://www.linkedin.com/feed/update/urn:li:activity:6621164483878416384"&gt;&lt;b&gt;AnyWear Mobility Unit&lt;/b&gt;&lt;/a&gt;&lt;span&gt; is right up there with the best ideas that come in small packages! These ready-to-carry backpacks were a hit at CES 2020 and we are excited to offer them to our customers.
&lt;p&gt;Last week, we took these backpacks on a stroll, around our Palo Alto Office, to test the top Running Apps in the Health &amp;amp; Fitness category. We made two trips under 10 mins each, and covered the exact same route for all the apps. With the HeadSpin AnyWear Mobility Unit, we were able to measure and compare app performance in terms of Net CPU%, Energy Drain% and Memory Usage%.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;How is this possible, you ask? &lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The HeadSpin technology leverages network traffic, &lt;a href="https://www.headspin.io/performance/"&gt;client-side metrics&lt;/a&gt;, and videos of the test execution to pinpoint areas of poor user experience and performance bottlenecks. We also correlated performance with precise GPS coordinates. The following devices were used over real network conditions: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Samsung Galaxy S9, on Sprint LTE for Android OS 8&lt;/li&gt;
&lt;li&gt;Samsung Galaxy S9, on AT&amp;amp;T for Android OS 9&lt;/li&gt;
&lt;li&gt;Samsung Galaxy S8 Plus, on Verizon for Android OS 7&lt;/li&gt;
&lt;li&gt;Samsung Galaxy S9, on Verizon for Android OS 9&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;What did we find? &lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We analyzed the current published versions of the top 8 Running apps in the Health &amp;amp; Fitness category on 4 Android phones in the US.&lt;/p&gt;

&lt;p&gt;Upon reviewing performance sessions post-walk, we noticed that &lt;strong&gt;all apps more or less captured the total distance accurately — except for Under Armor’s &lt;/strong&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.mapmyrun.android2&amp;amp;hl=en_US" rel="nofollow noopener"&gt;&lt;strong&gt;Run With Map My Run&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3jY_9DaO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/01/3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3jY_9DaO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/01/3.png" alt="Distance covered in Running app test run"&gt;&lt;/a&gt;                               &lt;/p&gt;

&lt;p&gt;At one point the &lt;a href="https://play.google.com/store/apps/details?id=com.mapmyrun.android2&amp;amp;hl=en_US" rel="nofollow noopener"&gt;Run With Map My Run&lt;/a&gt;app showed a significant issue in terms of tracking the path midway for the exact route that was mapped accurately by other apps.Guess the &lt;a href="https://play.google.com/store/apps/details?id=com.mapmyrun.android2&amp;amp;hl=en_US" rel="nofollow noopener"&gt;&lt;em&gt;Run With Map My Run&lt;/em&gt;&lt;/a&gt;&lt;strong&gt;&lt;em&gt; app from these screenshots gathered from the apps.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
                

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--V7TiT1zj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/01/4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--V7TiT1zj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/01/4.png" alt="Drive test map"&gt;&lt;/a&gt;                          &lt;/p&gt;

&lt;p&gt;When we analyzed the other crucial performance indicators, we noticed some interesting results:&lt;/p&gt;

&lt;p&gt;&lt;span&gt;In terms of &lt;/span&gt;&lt;strong&gt;Net CPU%&lt;/strong&gt;&lt;span&gt; the &lt;/span&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.nike.plusgps&amp;amp;hl=en_US" rel="nofollow noopener"&gt;Nike Run Club&lt;/a&gt;&lt;span&gt; app consumed the highest CPU usage at 39% while &lt;/span&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.mapmyrun.android2&amp;amp;hl=en_US" rel="nofollow noopener"&gt;Run with Map My Run&lt;/a&gt;&lt;span&gt; was lowest at 28%.&lt;/span&gt;&lt;/p&gt;      
        

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kFqNhBUE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/01/5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kFqNhBUE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/01/5.png" alt="Net CPU consumed by Nike running app"&gt;&lt;/a&gt;       &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fBcRTizh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/01/6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fBcRTizh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/01/6.png" alt="Energy Drain %"&gt;&lt;/a&gt;                                 &lt;/p&gt;

&lt;p&gt;In terms of &lt;/p&gt;&lt;/span&gt;&lt;strong&gt;Memory Usage%&lt;/strong&gt;&lt;span&gt;, all apps are above 50% except for &lt;/span&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.mapmyrun.android2&amp;amp;hl=en_US" rel="nofollow noopener"&gt;Run with Map My Run&lt;/a&gt;&lt;span&gt;, with &lt;/span&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.endomondo.android&amp;amp;hl=en_US" rel="nofollow noopener"&gt;Endomondo&lt;/a&gt;&lt;span&gt;, Strava and the &lt;/span&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.nike.plusgps&amp;amp;hl=en_US" rel="nofollow noopener"&gt;Nike Run Club&lt;/a&gt;&lt;span&gt; apps above 60%.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;In terms of &lt;strong&gt;Energy Drain%&lt;/strong&gt;, &lt;a href="https://play.google.com/store/apps/details?id=com.google.android.apps.fitness&amp;amp;hl=en_US" rel="nofollow noopener"&gt;Google Fit&lt;/a&gt; consumed the most energy at 3.93% for a &amp;lt;10 min walk around the block. &lt;/p&gt;
                    

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---y90uyH9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/01/7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---y90uyH9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/01/7.png" alt="Energy Drain %"&gt;&lt;/a&gt;             &lt;/p&gt;

&lt;p&gt;During testing, these apps were the only ones running on the devices, but &lt;strong&gt;your typical user is probably running a few apps at the same time when they are on the go&lt;/strong&gt;, and these numbers are only going to be exacerbated in those instances.&lt;br&gt;
User attrition is a real threat to digital business. In today’s crowded app ecosystem, users can easily move to other, competing apps, and if they are dissatisfied with an app’s mobile performance, they won’t continue to use it over the long run.&lt;/p&gt;
&lt;br&gt;
This is precisely why developers need a more sophisticated platform to&lt;a href="https://www.headspin.io/testing/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=mobile"&gt; test and monitor the quality of connected experiences&lt;/a&gt;. The&lt;strong&gt; HeadSpin AnyWear Mobility Unit&lt;/strong&gt; lets developers test connected devices the way that users experience them — on the go, in real time.

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UdRTFIGP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/01/8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UdRTFIGP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/01/8.png" alt="AnyWear Mobility Unit"&gt;&lt;/a&gt;                                      &lt;/p&gt;

&lt;p&gt;And since performance is always relative, we also offer &lt;strong&gt;&lt;a href="http://https;//info.headspin.io/benchmark?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=mobile"&gt;HeadSpin Benchmark Reports&lt;/a&gt;&lt;/strong&gt; if you are curious to see how other apps perform in comparison with your crucial KPIs.&lt;br&gt;
Are you interested in taking your app or game out for a run and testing how they perform? Reach out to our team &lt;a href="https://www.headspin.io/contact?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=mobile" rel="noopener"&gt;here&lt;/a&gt;, and we’ll get in touch! &lt;/p&gt;
&lt;br&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;Next up&lt;/u&gt;&lt;/strong&gt;&lt;u&gt;!&lt;/u&gt; &lt;strong&gt;How does your favorite Music Apps perform on a busy US Highway 101? &lt;/strong&gt;Stay tuned for our insights!&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.headspin.io/blog/product/personal-trainer-for-your-mobile-apps/"&gt;“Personal Trainer” for your mobile apps&lt;/a&gt; appeared first on &lt;a href="https://www.headspin.io"&gt;HeadSpin&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>apps</category>
      <category>product</category>
      <category>anywearmobilityuni</category>
      <category>mobileapps</category>
    </item>
    <item>
      <title>Our Experience at CES 2020</title>
      <dc:creator>HeadSpin</dc:creator>
      <pubDate>Tue, 21 Jan 2020 11:00:36 +0000</pubDate>
      <link>https://dev.to/headspin_io/our-experience-at-ces-2020-38g7</link>
      <guid>https://dev.to/headspin_io/our-experience-at-ces-2020-38g7</guid>
      <description>&lt;p&gt;Earlier this month, we attended CES 2020 for our very first time. We had a booth set up with our partner Wipro in the Enterprise Solutions section at the Las Vegas Convention Center, where we provided demos of our Connected Intelligence Platform™ to driven developers looking to deliver high quality global user experiences in an increasingly complex digital world. We had our proprietary Proxy System and portable mobile device cloud set up as well and were able to showcase their versatility to great success. &lt;/p&gt;

&lt;p id="attachment_3033"&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ePoG__dC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/01/1-2-1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ePoG__dC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/01/1-2-1.jpg" alt="" width="1000" height="750"&gt;&lt;/a&gt;Eravi demonstrating our proprietary Proxy System&lt;/p&gt;

&lt;p&gt;CES 2020 was a great way to start off the new decade. It was an honor to be able to meet with other innovators and pioneers with ideas set to shape consumers and business lives and transform the technological landscape.&lt;/p&gt;

&lt;p id="attachment_3033"&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AOn_DbNg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/01/Image-from-iOS-scaled.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AOn_DbNg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/01/Image-from-iOS-scaled.jpg" alt="" width="1920" height="2560"&gt;&lt;/a&gt;Eravi and I all ready for Day 2 of CES2020&lt;/p&gt;

&lt;p&gt;When we explored the show floor to witness the latest tech in action, we were able to connect with a diverse array of other innovators in the business as well. One overarching trend was clear: technology that connects the digital experience to the real world has become a greater focus now more than ever. All that we experience now is connected.&lt;/p&gt;

&lt;p&gt;Here’s what our key takeaways were from CES 2020 and what we noticed were the most noteworthy trends we believe may define the industry this year:&lt;/p&gt;

&lt;h3&gt;Smart Home Technology is getting even smarter&lt;/h3&gt;

&lt;p id="attachment_3040"&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6ZgLxx97--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/01/Smarthome-water-1.jpeg" class="article-body-image-wrapper"&gt;&lt;img title="CES" src="https://res.cloudinary.com/practicaldev/image/fetch/s--6ZgLxx97--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/01/Smarthome-water-1.jpeg" alt="" width="2400" height="1600"&gt;&lt;/a&gt;Photo by &lt;a href="https://www.ces.tech/Media/Multimedia/Photo-Gallery.aspx#"&gt;CES&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Smart Home is getting even smarter. We noticed a great focus on smart device and user experience integration this year. The major theme was the Smart City. Many of the biggest players had an offering for both the Smart Home and its integration into the Smart City. Smart home technology that connects appliances such as dishwashers, refrigerators, and assistants has been gaining quite a lot of attention in the past and were especially prominent this year. Among the many offerings: a voice-activated smart faucet.&lt;/p&gt;

&lt;h3&gt;Foldable display technology is taking flight&lt;/h3&gt;

&lt;p id="attachment_3055"&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--L03PPBZg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/01/foldable.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--L03PPBZg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/01/foldable.jpg" alt="" width="2047" height="1365"&gt;&lt;/a&gt;Photo by &lt;a href="https://foto.wuestenigel.com/"&gt;Marco Verch&lt;/a&gt; under&lt;a href="https://creativecommons.org/licenses/by/2.0/"&gt; CC 2.0 &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From smartphones to even speakers, foldable display technology seemed to be omnipresent at this year’s conference. Though its still in its early stages, this may be the year we see the technology start to resonate with and appeal to more consumers.&lt;/p&gt;

&lt;h3&gt;Let’s move on to the solutions&lt;/h3&gt;

&lt;p id="attachment_3029"&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fJQxleMU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/01/Marketplace_ARVR.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fJQxleMU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/01/Marketplace_ARVR.jpeg" alt="" width="1024" height="683"&gt;&lt;/a&gt;Photo by &lt;a href="https://www.ces.tech/Media/Multimedia/Photo-Gallery.aspx#"&gt;CES&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AR and VR devices were a recurring theme at CES 2020. There was less of a focus on the holographic technology itself and  &lt;strong&gt;more AR/VR solutions&lt;/strong&gt; being presented to attendees this year.&lt;/p&gt;

&lt;h3&gt;Connected Experiences are for cars too&lt;/h3&gt;

&lt;p id="attachment_3058"&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PX4v3sVS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/01/smartcars.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PX4v3sVS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/01/smartcars.jpeg" alt="" width="2400" height="1600"&gt;&lt;/a&gt;Photo by &lt;a href="https://www.ces.tech/Media/Multimedia/Photo-Gallery.aspx#"&gt;CES&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As we had expected, another major theme was the autonomous car. There was a focus on smart technology in use for cars as well; Smart speakers and other IoT devices finally made their way into the vehicle this year. Companies went beyond the standard self-driving technology popular today and in previous years to debut features that make passenger experiences &lt;strong&gt;more connected and more personalized.&lt;/strong&gt;&lt;/p&gt;



&lt;p id="attachment_3039"&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oMdwvjHL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/01/Marketplace_enterprise-1-scaled.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oMdwvjHL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/wp-content/uploads/2020/01/Marketplace_enterprise-1-scaled.jpeg" alt="" width="2560" height="1707"&gt;&lt;/a&gt;Photo by &lt;a href="https://www.ces.tech/Media/Multimedia/Photo-Gallery.aspx#"&gt;CES&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Needless to say, CES 2020 was an absolute success.&lt;/p&gt;

&lt;p&gt;Our team made a strong impact with our HeadSpin Connected Intelligence Platform™ and our proprietary Proxy System, demonstrating how both have provided our partners and developers with crucial web, mobile, IoT, and 5G solutions to optimize connected experiences that improve their consumer’s digital experience. Our platform was a big draw for attendees, from developers to Smart Home and City innovators, looking to bring the best digital experience to their users in 2020 and for years to come.&lt;/p&gt;

&lt;p&gt;We are incredibly grateful to have been a part of CES 2020 and excited for our team’s upcoming ventures. We got a lot planned in 2020, including exhibiting at many other events. Stay connected with us on our &lt;a href="https://www.linkedin.com/company/headspin/"&gt;Linkedin&lt;/a&gt; or &lt;a href="https://twitter.com/headspin_io"&gt;Twitter&lt;/a&gt; for updates on where we’re heading to next. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.headspin.io/blog/product/personal-trainer-for-your-mobile-apps/"&gt;&lt;span&gt;We also recently conducted a test run with the AnyWear Mobility Units that we showcased at CES to measure and compare the performances of 8 of the top running apps. &lt;/span&gt;&lt;/a&gt;&lt;/p&gt;











&lt;p&gt;&lt;span&gt;Missed us at CES 2020 and want to learn more about our Connected Intelligence Platform? &lt;a href="http://www.headspin.io/platform"&gt;Learn more about it here&lt;/a&gt; or &lt;a href="https://www.headspin.io/customers/"&gt;check out how we’ve helped to drive digital business success for some of today’s top companies. &lt;/a&gt;&lt;/span&gt;&lt;/p&gt;















&lt;p&gt;The post &lt;a href="https://www.headspin.io/blog/event/ces2020/"&gt;Our Experience at CES 2020&lt;/a&gt; appeared first on &lt;a href="https://www.headspin.io"&gt;HeadSpin&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>event</category>
      <category>ces</category>
      <category>conference</category>
    </item>
    <item>
      <title>Dialing in faster app performance</title>
      <dc:creator>HeadSpin</dc:creator>
      <pubDate>Mon, 25 Nov 2019 23:59:47 +0000</pubDate>
      <link>https://dev.to/headspin_io/dialing-in-faster-app-performance-1fh1</link>
      <guid>https://dev.to/headspin_io/dialing-in-faster-app-performance-1fh1</guid>
      <description>&lt;p&gt;Users hate hourglasses, spinning wheels and other reminders that their precious time is wasting while apps and networks slowly grind away. Research is clear: waits of more than 2-5 seconds lead quickly to abandons and curses. Good developers understand the need to optimize mobile performance and user experience, both before and after production.&lt;/p&gt;

&lt;p&gt;Fast apps and page loads are especially crucial in hyper-competitive industries like telecom. Janky, cranky mobile experiences aren’t exactly the best look for a leading-edge communications service provider (CSP) battling for new consumer and business subscribers.&lt;/p&gt;

&lt;p&gt;So this fall, when a major multinational telco asked HeadSpin to run mobile performance testing in its key (and highly competitive) New Zealand and Australia markets, we jumped at the chance to help. We knew we could improve understanding of their network, application performance and user experience. We also wondered if reported billing troubles on their monolithic core system was also causing problems for people interacting with the company via its mobile app.&lt;/p&gt;

&lt;p&gt;What we found is instructive in helping companies of all types spot and fix issues contributing to sluggish mobile experience. We’re sharing here as a part of our occasional posts showing how data-driven, pinpointed adjustments can yield big improvements in both customer experience as well as in technology and business performance.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;ABOUT THE SESSION&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;HeadSpin conducted our tests on Monday, Oct. 21. As always, the goal was to help identify the root cause of high-priority performance issues, from the client-side all the way to server-side.  &lt;/p&gt;

&lt;p&gt;Our team generated a performance session, which was then analyzed by our AI-based issue-detection engine. We used an iOS 12.4.1 device located in Auckland, New Zealand on the company’s mobile network (Tests can be run on 32,000+ different devices across 160+ locations in 110+ countries). The scenario: A mobile customer is looking to check his balances, increase his data plan, and sign up for roaming for an upcoming trip to Japan.  &lt;/p&gt;

&lt;p&gt;We’ll do a quick walk through the results below. offers high-level session-wide metrics, domain metrics, burst metrics and host metrics.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here's a snapshot of the testing setup:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8o6jcLcm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/hs-fs/hubfs/_website%2520files/Images/Blog/Vodafone/screenshot%2520of%2520hs%2520test%2520setup.png%3Fwidth%3D400%26name%3Dscreenshot%2520of%2520hs%2520test%2520setup.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8o6jcLcm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/hs-fs/hubfs/_website%2520files/Images/Blog/Vodafone/screenshot%2520of%2520hs%2520test%2520setup.png%3Fwidth%3D400%26name%3Dscreenshot%2520of%2520hs%2520test%2520setup.png" alt="screenshot of hs test setup"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A final note: We didn’t do (and never do) any rooting or jailbreaking to run the test. Both give you elevated system privileges on a device, and that’s something an ordinary user would never get or do. So no jailbreak for you.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;THE EXPERIENCE&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A hint that the app test might not break speed records comes early in the session. There’s an obvious lag in the form at :26 seconds, when our test customer enters a password. That’s followed by another noticeable experienced delay, when it takes a few seconds to log in. In the meantime, we’re left watching an animated white “working on it ” icon wiggle on a brightly`` colored background. It’s cute, but quickly irksome. As feared, the biggest delay of the session comes at 1:48, when our user tries to update his roaming services.&lt;/p&gt;

&lt;p&gt;In the end, overall wait times for our app end-user exceeded 6.5 seconds. (For perspective, that’s enough time for a light beam to travel &lt;a href="https://www.grc.nasa.gov/WWW/k-12/Numbers/Math/Mathematical_Thinking/how_fast_is_the_speed.htm"&gt;1,210,833 miles&lt;/a&gt;, the equivalent of 48.75 trips around the equator). What on Earth was going on?&lt;/p&gt;

&lt;p&gt;Here’s what all the tests looked like in context. Obviously, there are too many data and performance insights to fully explore here. So let’s focus on three key areas:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lLg9L7rM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/hubfs/_website%2520files/Images/Blog/Vodafone/headspin-session-context.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lLg9L7rM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/hubfs/_website%2520files/Images/Blog/Vodafone/headspin-session-context.png" alt="headspin-session-context"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ISSUE 1&lt;/strong&gt;  &lt;strong&gt;SLOW SERVERS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Server performance is a key foundation of mobile app performance. The most elegantly crafted app can be slowed by sluggish back-end performance. Research shows a straight line between wait times and user abandonment. &lt;a href="https://www.thinkwithgoogle.com/marketing-resources/data-measurement/mobile-page-speed-new-industry-benchmarks/"&gt;Google/SOASTA found&lt;/a&gt; probability of bounce jumps to 123% with a 1-10 second delay in mobile page loads. &lt;a href="https://www.akamai.com/us/en/multimedia/documents/white-paper/akamai-sorp-2017-holiday-retrospective.pdf"&gt;Akamai calculates&lt;/a&gt;that a 2x increase in mobile load time cuts conversions by 50%. Too slow and users go.&lt;/p&gt;

&lt;p&gt;That’s why it was concerning that our test run uncovered serious slow server issues. Delays in this foundational function were, unfortunately, a big contributor to overall delays experienced by our test app user. For instance, the app waited 4.23 seconds for the http POST request and 2.11 seconds for a GET request. Not good on either count.&lt;/p&gt;

&lt;p&gt;As a rule, any wait time longer than 300ms to complete a handshake with the host is worth investigating. In one case, the app waited for as long as 394 ms. We confirmed the physical location of the laggard destination as Sydney, Australia. But it got worse: In another instance, we timed the wait at 982 ms. That server was in located in Utah. The southwest United States is a long way from New Zealand (more than 7,000 miles/11,300 km.), so that’s a likely culprit.&lt;/p&gt;

&lt;p&gt;Remember that slow load we mentioned a minute ago? Here’s what it looks like to the user and the HeadSpin test system:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--48vju4vJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/hubfs/_website%2520files/Images/Blog/Vodafone/hs-burst-ui-screenshot.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--48vju4vJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/hubfs/_website%2520files/Images/Blog/Vodafone/hs-burst-ui-screenshot.png" alt="hs-burst-ui-screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;See the peak, two-thirds to the right? That’s your sloooow wait for the billing system described above.&lt;/p&gt;

&lt;p&gt;This alternate view shows the slow server problem’s relative seriousness compared to other, cooler-colored issues.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--G9avtcBa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/hubfs/_website%2520files/Images/Blog/Vodafone/ui-dev-headspin-io-sessions-f9bff14a-e7d2-11e9-9762-06eaa331526e-2019-11-25-12_49_36.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--G9avtcBa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/hubfs/_website%2520files/Images/Blog/Vodafone/ui-dev-headspin-io-sessions-f9bff14a-e7d2-11e9-9762-06eaa331526e-2019-11-25-12_49_36.png" alt="ui-dev-headspin-io-sessions-f9bff14a-e7d2-11e9-9762-06eaa331526e-2019-11-25-12_49_36"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To get a more granular idea of what’s impacting performance, take a look at this drill-down of analytics and ad services on the site. Impacts range from a relatively small 80ms. for Google to 543 ms. for a1/adform.net.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--S5VX7BFp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/hubfs/_website%2520files/Images/Blog/Vodafone/slow-tls-screenshot.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--S5VX7BFp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/hubfs/_website%2520files/Images/Blog/Vodafone/slow-tls-screenshot.png" alt="slow-tls-screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Fix&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Speeding up slow servers starts with a clear understanding of the resources that hosts are serving to your app. Are you expecting these hosts to be slow? You’ll want to determine if they’re performing a lot of server-side work before sending replies. If the hosts are part of a content delivery network, make sure they’re not serving resources from the wrong edge. And confirm that the physical location of the request's destination IP is where you think it is.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;ISSUE 2&lt;/strong&gt;  &lt;strong&gt;LOW PAGE CONTENT&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Perhaps the only thing worse than a web page with no content is a page with low content. Issues here are closely related to the sever slowness described above. It’s why for more than a decade, &lt;a href="https://www.facebook.com/notes/facebook-engineering/bigpipe-pipelining-web-pages-for-high-performance/389414033919"&gt;Facebook has institutionalized best practices&lt;/a&gt; designed to do just that.&lt;/p&gt;

&lt;p&gt;During our testing we found the end-user consistently experiencing little content on screen for more than one second at a time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ea_9rMF5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/hubfs/_website%2520files/Images/Blog/Vodafone/screencapture-ui-dev-headspin-io-sessions-low-content.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ea_9rMF5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/hubfs/_website%2520files/Images/Blog/Vodafone/screencapture-ui-dev-headspin-io-sessions-low-content.png" alt="screencapture-ui-dev-headspin-io-sessions-low-content"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The associated delays contributed to a total of more than 5.5 seconds of wait time. With long network requests and network saturation as possible contributing factors, wait times reached 6.56 seconds in one instance as shown below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_XLLHHjV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/hubfs/_website%2520files/Images/Blog/Vodafone/low-content-csv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_XLLHHjV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/hubfs/_website%2520files/Images/Blog/Vodafone/low-content-csv.png" alt="low-content-csv"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Looking at the orange impact region in the Waterfall view lets HeadSpin correlate root cause factors, such as long network requests, network saturation, or usage in the system timeseries. Any abnormal metric in this region can be causing the issue.&lt;/p&gt;

&lt;p&gt;In this case, it would be helpful to examine the keep-alive timeout. Proper setting ensures connections are re-used (as opposed to re-created) to avoid producing a sub-optimal user experience. So we did…&lt;/p&gt;

&lt;p&gt;And indeed, testing found the app creating new TCP connections to the impacted host [&lt;a href="http://www.vodafone.co.nz:443"&gt;www.the telco .co.nz:443&lt;/a&gt;&lt;u&gt;],&lt;/u&gt; Since keep-alive connections is enabled, it’s wise to check that the timeout is not set too low, which could cause client connections to terminate prematurely, resulting in unnecessary TCP/TLS handshakes. Resetting the server ensures the TCP connection is not dropped.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;ISSUE 3:&lt;/strong&gt;  &lt;strong&gt;SLOW ANIMATION LOAD&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Animation on a mobile app can be tricky. Done well, it’s a delightful distraction during loads, judiciously recommended by UX gurus like &lt;a href="https://www.nngroup.com/articles/scroll-animations/"&gt;Nielsen/Norman Group&lt;/a&gt; and &lt;a href="https://www.lukew.com/about"&gt;Luke Wroblewski.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In our test, one of the (potentially) coolest parts of the test session (a customer increasing monthly data allocation) ended up, well, not so cool. Onscreen, the user was served with two spinning slot machine windows. “Grab the Prepay Deal of the Day!” The windows were supposed to stop, presumably revealing a great offer. Unfortunately, animation load and confirm time was slow (1.36 seconds on screen– long enough for a visitor to wonder if their luck had run out.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ToDNV3iT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/hubfs/_website%2520files/Images/Blog/Vodafone/screencapture-ui-dev-headspin-io-sessions-f9bff14a-e7d2-11e9-9762-06eaa331526e-2019-11-25-13_53_57.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ToDNV3iT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/hubfs/_website%2520files/Images/Blog/Vodafone/screencapture-ui-dev-headspin-io-sessions-f9bff14a-e7d2-11e9-9762-06eaa331526e-2019-11-25-13_53_57.png" alt="screencapture-ui-dev-headspin-io-sessions-f9bff14a-e7d2-11e9-9762-06eaa331526e-2019-11-25-13_53_57"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Problems with graphics loading often mean the app is waiting for a network resource. Looking around the Waterfall’s orange region reveals potential problems such as unusual, too much, or missing network traffic. One fix is to have app and server can improve the way the resource is loaded. Another way to speed up animation would be to rework the user design. Elements that load faster can be moved to the top, and slower elements relocated below the fold.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BOTTOM LINE&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Slow loads are fast roads to losing customers. The advent of 5G will only further shrink the time that users will wait for both new and existing applications to load and run.&lt;/p&gt;

&lt;p&gt;For the first time in 2019, consumers will spend more time on mobile phones than watching TV.&lt;/p&gt;

&lt;p&gt;The average adult will spend 3 hours and 43 minutes a day on mobile devices, according to &lt;a href="https://www.emarketer.com/content/average-us-time-spent-with-mobile-in-2019-has-increased"&gt;new research by eMarketer&lt;/a&gt;. Of that, 2:57 is spent on apps, the company says. Don’t miss out.&lt;/p&gt;

&lt;p&gt;Performance testing offers a great, effective way to find and fix problem areas in production apps. The logic is simple: To fix performance, you need to measure performance. To measure performance, you need to see performance.&lt;/p&gt;

&lt;p&gt;With our Digital Experience Platform, this telco gained valuable insights into their performance issues and steps to improve the end user’s experience in a highly competitive market and region. (An interesting postscript: A few days after our first test, came under criticism in the U.K for reported errors in roaming billing and unwanted customer disconnections.)&lt;/p&gt;

&lt;p&gt;HeadSpin offers an enterprise-grade approach for global mobile experience. Our all-in-one platform for remote testing (with real SIM cards across 160+ locations), network testing, a complementary “mobile performance management”, and AI-driven approach simplifies pre-and-post launch improvements in real-world user environments.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Want to launch to launch flawless products faster? Identify and fix bottlenecks? &lt;a href="https://www.headspin.io/demo"&gt;Schedule a demo&lt;/a&gt; to learn more about how HeadSpin can help improve your customer's digital experience.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5eAsql4n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://track.hubspot.com/__ptq.gif%3Fa%3D3219205%26k%3D14%26r%3Dhttps%253A%252F%252Fwww.headspin.io%252Fblog%252Fdialing-in-faster-app-performance%26bu%3Dhttps%25253A%25252F%25252Fwww.headspin.io%25252Fblog%26bvt%3Drss" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5eAsql4n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://track.hubspot.com/__ptq.gif%3Fa%3D3219205%26k%3D14%26r%3Dhttps%253A%252F%252Fwww.headspin.io%252Fblog%252Fdialing-in-faster-app-performance%26bu%3Dhttps%25253A%25252F%25252Fwww.headspin.io%25252Fblog%26bvt%3Drss" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>telco</category>
      <category>mobile</category>
      <category>performance</category>
    </item>
    <item>
      <title>Tips for Shopping Apps this Holiday Season!</title>
      <dc:creator>HeadSpin</dc:creator>
      <pubDate>Wed, 06 Nov 2019 06:28:14 +0000</pubDate>
      <link>https://dev.to/headspin_io/tips-for-shopping-apps-this-holiday-season-55pc</link>
      <guid>https://dev.to/headspin_io/tips-for-shopping-apps-this-holiday-season-55pc</guid>
      <description>&lt;p&gt;Gone are the days when the majority of your customers stood outside the store eagerly waiting for the doors to open, only to rush in and grab all they need (and don’t need) during the holiday shopping season. &lt;a href="https://content-na1.emarketer.com/holiday-shopping-2019"&gt;Emarketer forecasts&lt;/a&gt; that Nov-Dec 2019 will witness ecommerce contributing to 42.8% of overall spending growth in the US, with mobile as the star of the show expected to bring in $64.29 billion. Moreover, with &lt;a href="https://www.retailwire.com/discussion/will-six-fewer-holiday-shopping-days-matter-to-retail-performance/"&gt;6 fewer days of the holiday shopping season&lt;/a&gt; this year compared to 2018, your average user is just a click away from storming through those virtual gates on their favorite smartphone, and every mobile experience counts.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wXpp56D6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/hubfs/Tips%2520for%2520Shopping%2520apps%2520this%2520Holiday%2520season.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wXpp56D6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/hubfs/Tips%2520for%2520Shopping%2520apps%2520this%2520Holiday%2520season.png" alt="emarketer shopping data"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We at HeadSpin love seamless mobile experiences and great deals, and have put together a wishlist for our favorite shopping apps:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.) One size doesn’t fit all&lt;/strong&gt; -  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;Test your app/website on all top devices in the market across Android, iOS and browsers in the real world. Your user may not always be accessing your products in the comfort of their home with uninterrupted WiFi, so account for all real world conditions.
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ab1pi0LA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/hs-fs/hubfs/Tips%2520for%2520Shopping%2520apps%2520this%2520Holiday%2520season-1.jpeg%3Fwidth%3D960%26name%3DTips%2520for%2520Shopping%2520apps%2520this%2520Holiday%2520season-1.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ab1pi0LA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/hs-fs/hubfs/Tips%2520for%2520Shopping%2520apps%2520this%2520Holiday%2520season-1.jpeg%3Fwidth%3D960%26name%3DTips%2520for%2520Shopping%2520apps%2520this%2520Holiday%2520season-1.jpeg" alt=""&gt;&lt;/a&gt;  &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Don’t download images larger than the device resolution. This puts the burden on the client-side to download a bigger asset and resize it as well.  


  - Consider having a server-side ability to configure height and width of images via the URL parameters.
  - Perform lossless image compression on PNG and JPEG images. Consider using the WEBP image format, which provides great compression and image quality
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;2.) Your users like shopping directly from you, so make sure all traffic is encrypted to avoid MITM (Man In The Middle) attacks&lt;/strong&gt; - everything should be TLS.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IctP_ODq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/hs-fs/hubfs/Tips%2520for%2520Shopping%2520apps%2520this%2520Holiday%2520season-1.png%3Fwidth%3D450%26name%3DTips%2520for%2520Shopping%2520apps%2520this%2520Holiday%2520season-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IctP_ODq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/hs-fs/hubfs/Tips%2520for%2520Shopping%2520apps%2520this%2520Holiday%2520season-1.png%3Fwidth%3D450%26name%3DTips%2520for%2520Shopping%2520apps%2520this%2520Holiday%2520season-1.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Source: Wikipedia&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--f9kI3mcx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://www.headspin.io/hs-fs/hubfs/Tips%2520for%2520Shopping%2520apps%2520this%2520Holiday%2520season.gif%3Fwidth%3D100%26name%3DTips%2520for%2520Shopping%2520apps%2520this%2520Holiday%2520season.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--f9kI3mcx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://www.headspin.io/hs-fs/hubfs/Tips%2520for%2520Shopping%2520apps%2520this%2520Holiday%2520season.gif%3Fwidth%3D100%26name%3DTips%2520for%2520Shopping%2520apps%2520this%2520Holiday%2520season.gif" alt=""&gt;&lt;/a&gt;&lt;strong&gt;3.) No one likes waiting around when there’s a good sale.&lt;/strong&gt; Any instances of low page content over 2 seconds should be eliminated in order to increase user engagement.  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.flipkart.android&amp;amp;hl=en_US"&gt;Flipkart&lt;/a&gt; &lt;em&gt;was able to detect and fix performance bottlenecks in their code base and prevented two serious performance regressions from going live to millions of users. Using NimbleDroid, a HeadSpin company, Flipkart was able to pinpoint the issue and the app startup time was&lt;/em&gt; &lt;a href="https://www.headspin.io/customers/case-study/flipkart"&gt;reduced by 45%&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;4.) Your user is unlikely to buy the same outfit 10 times.&lt;/strong&gt; Same goes for downloading duplicate content. Avoid instances of duplicate messages which indicate that the client received and downloaded the same resources multiple times.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5.) Bring cache only&lt;/strong&gt;. Products images that are not seasonal or promotional should be cached on your CDN.&lt;/p&gt;

&lt;p&gt;According to author &amp;amp; humorist Erma Bombeck, the odds of going to the store for a loaf of bread and coming out with only a loaf of bread are three billion to one. Your user is gearing up for your holiday sales, so check out &lt;a href="https://ui.headspin.io/register?referral=start-testing-promo"&gt;HeadSpin&lt;/a&gt; to put your best mobile experience forward!&lt;/p&gt;

</description>
      <category>retail</category>
      <category>shopping</category>
    </item>
    <item>
      <title>Appium Tools for Rapid Development of Functional and Performance Test</title>
      <dc:creator>HeadSpin</dc:creator>
      <pubDate>Wed, 09 Oct 2019 20:35:20 +0000</pubDate>
      <link>https://dev.to/headspin_io/appium-tools-for-rapid-development-of-functional-and-performance-test-2lhl</link>
      <guid>https://dev.to/headspin_io/appium-tools-for-rapid-development-of-functional-and-performance-test-2lhl</guid>
      <description>&lt;p&gt;&lt;strong&gt;Wednesday, Nov 5, 2019 |  9:00AM - 10:00AM (Pacific Standard Time) | 1 Hour&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://info.headspin.io/webinar/appium-tools-for-rapid-development-functional-and-performance-test?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=appium&amp;amp;utm_term=jlipps"&gt;Register for the webinar&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this webinar we'll take a look at several tools we can use to &lt;br&gt;
accelerate the development and debugging of Appium scripts for functional testing and performance testing. &lt;/p&gt;

&lt;p&gt;Specifically, we’ll cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Overview of functional and performance testing&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Appium Desktop, which is an all-in-one Appium server plus inspector tool. How to inspect and debug mobile web and hybrid apps.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;web2driver, a browser-based Appium client which can be used as the foundation for a whole new category of tools.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The new HeadSpin Recorder, built on web2driver, which allows for rapid development of geo-distributed cross-device testing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Appium’s Event Parser, which can be used to visualize the timeline of an Appium session to help discover bottlenecks.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;About the Speaker&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Johnathan Lipps - Architect and Project Lead, Appium&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Jonathan is the architect and project lead for Appium, the popular open source automation framework. He is the founding Principal of Cloud Grey, a consulting firm devoted to helping clients leverage the power of Appium successfully, and is also an advisor to HeadSpin. He has worked as a programmer in tech startups for over 15 years, but is also passionate about academic discussion. Jonathan has master’s degrees in philosophy and linguistics, from Stanford and Oxford respectively. Living in Vancouver, he’s an avid musician, and also writes on the philosophy of technology.&lt;/p&gt;

</description>
      <category>appium</category>
      <category>test</category>
      <category>performance</category>
    </item>
    <item>
      <title>What is a Mean Opinion Score or MOS?</title>
      <dc:creator>HeadSpin</dc:creator>
      <pubDate>Thu, 12 Sep 2019 19:35:27 +0000</pubDate>
      <link>https://dev.to/headspin_io/what-is-a-mean-opinion-score-or-mos-2i5i</link>
      <guid>https://dev.to/headspin_io/what-is-a-mean-opinion-score-or-mos-2i5i</guid>
      <description>&lt;p&gt;Mean opinion score (MOS) is a measurement of the quality of experience, commonly used in profiling the quality of audio and video content. HeadSpin’s AI engine continuously measures video mean opinion score of mobile application video during a performance session test. The following is a screenshot of Video Quality MOS on HeadSpin’s waterfall UI timeline highlighted with a red outline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MOS Performance Metric in HeadSpin’s waterfall UI&lt;br&gt;&lt;br&gt;
 &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--d8bU8_MM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/hs-fs/hubfs/_website%2520files/Images/mos_performance_metric_in_HeadSpins%2520Waterfall%2520UI.png%3Fwidth%3D1600%26name%3Dmos_performance_metric_in_HeadSpins%2520Waterfall%2520UI.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--d8bU8_MM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/hs-fs/hubfs/_website%2520files/Images/mos_performance_metric_in_HeadSpins%2520Waterfall%2520UI.png%3Fwidth%3D1600%26name%3Dmos_performance_metric_in_HeadSpins%2520Waterfall%2520UI.png" alt="mos_performance_metric_in_HeadSpins Waterfall UI"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Performance Session Link:&lt;br&gt;&lt;br&gt;
&lt;a href="https://ui-dev.headspin.io/sessions/de8d3768-c57d-11e9-bcde-f01898ea5299/waterfall"&gt;https://ui-dev.headspin.io/sessions/de8d3768-c57d-11e9-bcde-f01898ea5299/waterfall&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Video contents are incorporated in different types of mobile applications: live streaming sports and events, live streaming news, explanation video, cutscene in a game, introduction/walkthrough video, live communication video, video as a file etc. Poor video experience can negatively impact user’s overall experience. It is crucial for mobile developers and QA teams to understand how well their video performs on real devices in real network conditions.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;HeadSpin’s AI Engine MOS&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;HeadSpin’s mean opinion score ranges from 0 to 4, with 0 being very poor and 4 being excellent as shown in the following list.&lt;/p&gt;

&lt;p&gt;Score range:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;0 very poor&lt;/li&gt;
&lt;li&gt;1 poor&lt;/li&gt;
&lt;li&gt;2 fair&lt;/li&gt;
&lt;li&gt;3 good&lt;/li&gt;
&lt;li&gt;4 excellent&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;iPhone X Video Examples&lt;br&gt;&lt;br&gt;
MOS: 3.54 [Youtube video]&lt;/strong&gt;    &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--B0qxPr0X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/hs-fs/hubfs/_website%2520files/Images/iphone-x-video-youtube-video-text-mos.png%3Fwidth%3D512%26name%3Diphone-x-video-youtube-video-text-mos.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--B0qxPr0X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/hs-fs/hubfs/_website%2520files/Images/iphone-x-video-youtube-video-text-mos.png%3Fwidth%3D512%26name%3Diphone-x-video-youtube-video-text-mos.png" alt="iphone-x-video-youtube-video-text-mos"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Comments: Although the content of the Chinese character and QR character are not crystal clear, no visible blockiness can be observed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MOS: 2 [NBA Video with blur and blockiness]&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
 &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xHbFbIJJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/hs-fs/hubfs/_website%2520files/Images/MOS-%25202%2520%255BNBA%2520Video%2520with%2520blur%2520and%2520blockiness%255D%2520.png%3Fwidth%3D682%26name%3DMOS-%25202%2520%255BNBA%2520Video%2520with%2520blur%2520and%2520blockiness%255D%2520.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xHbFbIJJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/hs-fs/hubfs/_website%2520files/Images/MOS-%25202%2520%255BNBA%2520Video%2520with%2520blur%2520and%2520blockiness%255D%2520.png%3Fwidth%3D682%26name%3DMOS-%25202%2520%255BNBA%2520Video%2520with%2520blur%2520and%2520blockiness%255D%2520.png" alt="MOS- 2 [NBA Video with blur and blockiness] "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Comments: Notice that the player on the video screen capture is blocky. The scoreboard on the video is blurry.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MOS Score: 0.57 [Youtube Video with severe blockiness]&lt;/strong&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Czt0WkZi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/hs-fs/hubfs/_website%2520files/Images/MOS%2520Score-%25200.57%2520%255BYoutube%2520Video%2520with%2520severe%2520blockiness%255D%2520.png%3Fwidth%3D512%26name%3DMOS%2520Score-%25200.57%2520%255BYoutube%2520Video%2520with%2520severe%2520blockiness%255D%2520.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Czt0WkZi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.headspin.io/hs-fs/hubfs/_website%2520files/Images/MOS%2520Score-%25200.57%2520%255BYoutube%2520Video%2520with%2520severe%2520blockiness%255D%2520.png%3Fwidth%3D512%26name%3DMOS%2520Score-%25200.57%2520%255BYoutube%2520Video%2520with%2520severe%2520blockiness%255D%2520.png" alt="MOS Score- 0.57 [Youtube Video with severe blockiness] "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Comments: Notice that the video is very blocky where the face of the person is indistinguishable.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Improve your video and delight your customers&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;With real networks on real devices, many factors can affect the delivery of video content through mobile applications. The following list includes some of these different factors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The device and OS of the mobile application&lt;/li&gt;
&lt;li&gt;Bandwidth, latency, jitter packet losses of the network&lt;/li&gt;
&lt;li&gt;Misconfiguration of the content delivery network (CDN)&lt;/li&gt;
&lt;li&gt;Mobile application client issue playing the video&lt;/li&gt;
&lt;li&gt;Corrupted video download
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using HeadSpin’s platform video mean opinion score (MOS) and network performance capture, developers and QA teams can resolve issues and improve mobile video viewing experience, which ultimately leads to delighted customers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ylrPqAci--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://track.hubspot.com/__ptq.gif%3Fa%3D3219205%26k%3D14%26r%3Dhttps%253A%252F%252Fwww.headspin.io%252Fblog%252Fwhat-is-mean-opinion-score%26bu%3Dhttps%25253A%25252F%25252Fwww.headspin.io%25252Fblog%26bvt%3Drss" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ylrPqAci--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://track.hubspot.com/__ptq.gif%3Fa%3D3219205%26k%3D14%26r%3Dhttps%253A%252F%252Fwww.headspin.io%252Fblog%252Fwhat-is-mean-opinion-score%26bu%3Dhttps%25253A%25252F%25252Fwww.headspin.io%25252Fblog%26bvt%3Drss" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;HeadSpin enables you to test your mobile app on real devices and real networks around the world for real-world user experience conditions right from your web browser. No code changes needed. &lt;a href="https://ui.headspin.io/register?referral=start-testing-promo"&gt;Start your Free Trial&lt;/a&gt;&lt;/p&gt;

</description>
      <category>mos</category>
      <category>videoquality</category>
    </item>
  </channel>
</rss>
