<?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>Forem: Ken Simeon</title>
    <description>The latest articles on Forem by Ken Simeon (@scriptmunkee).</description>
    <link>https://forem.com/scriptmunkee</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%2F190194%2Fab1cbc30-cfcd-449d-bafe-3857f01d8f89.jpg</url>
      <title>Forem: Ken Simeon</title>
      <link>https://forem.com/scriptmunkee</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/scriptmunkee"/>
    <language>en</language>
    <item>
      <title>20+ years of advice to testers &amp; QAs</title>
      <dc:creator>Ken Simeon</dc:creator>
      <pubDate>Mon, 07 Aug 2023 00:20:04 +0000</pubDate>
      <link>https://forem.com/scriptmunkee/20-years-of-advice-to-testers-qas-4ej5</link>
      <guid>https://forem.com/scriptmunkee/20-years-of-advice-to-testers-qas-4ej5</guid>
      <description>&lt;p&gt;&lt;em&gt;From my original contribution to &lt;a href="https://leanpub.com/startinginsoftwaretesting" rel="noopener noreferrer"&gt;Starting Your Software Testing Career&lt;/a&gt; by&lt;/em&gt; &lt;a class="mentioned-user" href="https://dev.to/nicolalindgren"&gt;@nicolalindgren&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Don't fall into the trap of being in a perpetual cycle of wanting to do or wanting to be something, Instead be in a perpetual cycle of learning something new and applying it [to your career or life].&lt;/p&gt;

&lt;p&gt;Throughout my 20+ year career as a QA Professional &amp;amp; hiring manager, I've heard countless times that a candidate wants to learn automation or be an automation engineer.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I immediately ask, what are they doing to get there? And how long have they been on this journey? &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The majority of responses have been something like;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I've been learning about [fill in a popular automation technology] cause that is what’s used at work.&lt;/li&gt;
&lt;li&gt;I’ve been learning it on &amp;amp; off for the past few years cause I don't get enough time at work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As a result, hiring managers like myself, could hastily jump to one of the following conclusions:&lt;br&gt;
1) This person really isn’t dedicated to what to their goal.&lt;br&gt;
2) This person doesn't have the aptitude to do automation.&lt;br&gt;
3) This person is not a fast learner.&lt;/p&gt;

&lt;p&gt;Being in a perpetual cycle of wanting &amp;amp; not doing will leave any professional in a decelerated career path.&lt;/p&gt;




&lt;p&gt;The approach I’ve used to aid those that want to learn automated testing and be successful, is that they need to learn the foundations of the language used in their automation framework of choice and beyond the basics of the technology they want to automate. &lt;/p&gt;

&lt;p&gt;For instance, you’re a QA professional wanting to write automated tests for a web application using a JavaScript framework and Selenium. &lt;/p&gt;

&lt;p&gt;I suggest the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Learn HTML &amp;amp; CSS to the point you can create a working stylized web site.&lt;/li&gt;
&lt;li&gt;Learn the advanced foundations of the JavasScript language and apply them to your website.&lt;/li&gt;
&lt;li&gt;Learn about the framework &amp;amp; the underlying technology that enabled the automation (i.e. Selenium Webdriver, WebdriverIO, PlayWrite, etc.).&lt;/li&gt;
&lt;li&gt;Learn about the fundamentals of unit testing.&lt;/li&gt;
&lt;li&gt;Put all the pieces together behind a solid goal of automating a single functional area of a feature before expanding beyond that scope.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;When QA professionals hear this suggestion, they can be discouraged by the magnitude of knowledge and the time it could take to consume &amp;amp; apply the knowledge.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;But that is the point.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Advancing one's knowledge and career takes time &amp;amp; effort. None of it is just handed to a person. You need to make the time to up-skill.&lt;/p&gt;

&lt;p&gt;There are those that will try to find a shortcut. That is ok as long as they are continuing to learn &amp;amp; applying the knowledge they’ve gained.&lt;/p&gt;

&lt;p&gt;Now one might ask; How does the breakdown of these various areas of learning apply to both a QA professional’s current career and their goal of becoming an automation engineer?&lt;/p&gt;

&lt;p&gt;Learning HTML &amp;amp; CSS gives the individual a foundation of how a website is put together. It will aid in the conversations with developers, UX designers and product managers around the customer experience. It will also help with the explanation of issues with a web experience to a developer and provide the foundational information that accelerates a potential fix.&lt;/p&gt;

&lt;p&gt;Learning JavaScript for a web app helps a QA professional understand how interactions can happen on a web page. They will also learn how to troubleshoot and debug issues. This directly applies back to their current role by allowing them to give more detailed information to a developer when an issue is experienced.&lt;/p&gt;

&lt;p&gt;Learning beyond the foundations of a programming language is key. Without this, one won’t know or understand how to structure their a clean code base. They won't fully understand why automation frameworks work or behave in a certain way. &lt;/p&gt;

&lt;p&gt;Beyond that, it will give a person an overall foundation behind programming in general. This aids in your conversations in your profession. Now your conversations with developers &amp;amp; technical leaders will shift. &lt;/p&gt;

&lt;p&gt;You’ll begin understanding how all the inner parts of the companies code bases works together and be able to ask technical questions that could drive deeper conversations &amp;amp; understanding for a better site reliability or user experience.&lt;/p&gt;

&lt;p&gt;The key to learning about Unit Testing, is that not all automated tests from a QA organization should be End-to-End test scenarios. End-to-End tests do have their place within an automated test suite, but that’s not the end all be all.&lt;/p&gt;

&lt;p&gt;Finally when you put all of the learnings together, the QA professional can leverage this knowledge in their daily job.&lt;/p&gt;

&lt;p&gt;By doing this, it will lead to accelerated professional progression within your current company or the next company you take your learnings to.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>qa</category>
      <category>automation</category>
      <category>careerdevelopment</category>
    </item>
    <item>
      <title>Web UI Automation Must Haves</title>
      <dc:creator>Ken Simeon</dc:creator>
      <pubDate>Wed, 01 Apr 2020 06:24:08 +0000</pubDate>
      <link>https://forem.com/scriptmunkee/web-ui-automation-must-haves-3ola</link>
      <guid>https://forem.com/scriptmunkee/web-ui-automation-must-haves-3ola</guid>
      <description>&lt;p&gt;There has alway been a need to have a better feedback loop a the desktop application or a web application under test. Many times we've had to ask [occasionally beg] a developer to build in some needed feedback functionality. But now that isn't so much the case when it comes to testing web applications. With the accessibility of Webdriver there are easier opportunities to get direct feedback from the web browser itself.&lt;/p&gt;

&lt;p&gt;This direct ability to interact gives those writing automated tests the ability to answer some of the some of the most troublesome and nagging questions we all have needed the answer to.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Has the page fully loaded?&lt;/li&gt;
&lt;li&gt;Have any JavaScript errors been thrown?&lt;/li&gt;
&lt;/ol&gt;




&lt;h6&gt;
  
  
  &lt;strong&gt;FYI:&lt;/strong&gt; &lt;em&gt;The examples below are from my WebdriverIO library, but the concept can be adapted to any variant of automated testing using Selenium or another automation framework.&lt;/em&gt;
&lt;/h6&gt;




&lt;h4&gt;
  
  
  1. Has The Page Fully Loaded?
&lt;/h4&gt;

&lt;p&gt;There are many ways to resolve trouble maker #1. Many time's I've seen and done it myself, write my automation to wait for a particular element in the page to load or exist. This can be useful, but it does not scale.&lt;/p&gt;

&lt;p&gt;The first part of the solution is to have the browser tell us its current document loading status. The is accomplished by hooking into the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Document/readyState" rel="noopener noreferrer"&gt;Document.readyState&lt;/a&gt; property of the browser. The &lt;code&gt;Document.readyState&lt;/code&gt; property returns one of three responses.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;loading&lt;/li&gt;
&lt;li&gt;interactive&lt;/li&gt;
&lt;li&gt;complete&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This functionality of the browser document can be queried while the page is loading like the example below that returning &lt;em&gt;TRUE&lt;/em&gt; if the &lt;code&gt;document.readyState&lt;/code&gt; equals &lt;em&gt;'complete'&lt;/em&gt;. To access to the document property of the browser you have to use WebdriverIO/Selenium's ability to directly execute a JavaScript call.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;utilsLib&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

    &lt;span class="nf"&gt;checkIfPageLoaded&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// console.log( `Done loading? ${browser.executeScript('return document.readyState', []) }` );&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;executeScript&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;return document.readyState&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;complete&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that we have the ability to query the &lt;code&gt;document.readyState&lt;/code&gt;, let's write a custom wait function called &lt;code&gt;waitForPageToLoad&lt;/code&gt; to check if the browser has completed loading. But making sure to timeout if the waiting time is excessive.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;...&lt;/span&gt;

    &lt;span class="nf"&gt;waitForPageToLoad&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;waitUntil&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// console.log('Waiting for the page to load');&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;checkIfPageLoaded&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;15000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Page never completed loading&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. Have any JavaScript errors been thrown?
&lt;/h4&gt;

&lt;p&gt;After checking that a page has loaded, we now need to face the silent killer [no I'm not talking about heart disease]. The silent killers to any web application are JavaScript errors. There are times when a JavaScript error is thrown but it doesn't always cause a web application to fail a running test. A JavaScript error could cause a failure on functionality that isn't being tested at the moment or has automated tests for it. In any case, its good practice to always check for JavaScript errors after a web page is loaded.&lt;/p&gt;

&lt;p&gt;To access the logging of JavaScript errors in the browser, you have to leverage WebdriverIO/Selenium's access to the &lt;a href="https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol" rel="noopener noreferrer"&gt;JsonWireProtocol&lt;/a&gt; for &lt;a href="https://github.com/SeleniumHQ/selenium/wiki/Logging" rel="noopener noreferrer"&gt;Logging&lt;/a&gt;. There are five &lt;em&gt;Log Types&lt;/em&gt; that can be accessed, but we are focused on &lt;strong&gt;browser&lt;/strong&gt; so we can capture &amp;amp; parse the logs for potential JavaScript errors.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Log Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;client&lt;/td&gt;
&lt;td&gt;Logs from the client.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;driver&lt;/td&gt;
&lt;td&gt;Logs from the webdriver.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;browser&lt;/td&gt;
&lt;td&gt;Logs from the browser.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;server&lt;/td&gt;
&lt;td&gt;Logs from the server.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Along with Log Types, there are also &lt;em&gt;Log Levels&lt;/em&gt; to consider [which any good API would provide]. To get down to the nitty gritty we are going to parse for &lt;em&gt;SEVERE&lt;/em&gt; errors and just console log any other errors so they can be generally captured.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Log Level&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ALL&lt;/td&gt;
&lt;td&gt;All log messages. Used for fetching of logs and configuration of logging.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DEBUG&lt;/td&gt;
&lt;td&gt;Messages for debugging.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;INFO&lt;/td&gt;
&lt;td&gt;Messages with user information.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WARNING&lt;/td&gt;
&lt;td&gt;Messages corresponding to non-critical problems.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SEVERE&lt;/td&gt;
&lt;td&gt;Messages corresponding to critical errors.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OFF&lt;/td&gt;
&lt;td&gt;No log messages. Used for configuration of logging.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;As you review the &lt;code&gt;checkForJavaScriptErrors&lt;/code&gt; function below, you'll see we're leveraging &lt;code&gt;waitForPageToLoad&lt;/code&gt; to make sure the page is loaded before checking for JavaScript Errors. This allows for chaining of multiple levels of validation even before an assertion point is even executed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="nf"&gt;checkForJavaScriptErrors&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;waitForPageToLoad&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;logs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getLogs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;browser&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;logs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;level&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;severe&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;javascript&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt; ERROR: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                    &lt;span class="nx"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt; ERROR: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt; ERROR: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="p"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Leveraging the functions
&lt;/h4&gt;

&lt;p&gt;As an example of how I've used by three super helper functions, I created a custom &lt;code&gt;openUrl&lt;/code&gt; function as part of my class that will wait for the page to load and check for JavaScript errors.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;...&lt;/span&gt;

    &lt;span class="nf"&gt;openUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;checkForJavaScriptErrors&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you have any questions about WebdriverIO or Selenium based testing, please don't hesitate to leave a comment or message me directly.&lt;/p&gt;

&lt;p&gt;Happy Testing!!!&lt;/p&gt;




&lt;h5&gt;
  
  
  Full Example Source
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;utilsLib&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

    &lt;span class="nf"&gt;checkIfPageLoaded&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// console.log( `Done loading? ${browser.executeScript('return document.readyState', []) }` );&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;executeScript&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;return document.readyState&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;complete&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;waitForPageToLoad&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;waitUntil&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// console.log('Waiting for the page to load');&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;checkIfPageLoaded&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;15000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Page never completed loading&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;checkForJavaScriptErrors&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;waitForPageToLoad&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;logs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getLogs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;browser&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;logs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;level&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;severe&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;javascript&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt; ERROR: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                    &lt;span class="nx"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt; ERROR: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt; ERROR: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;openUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;checkForJavaScriptErrors&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>testing</category>
      <category>webdriverio</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Three keys to being successful as a QA/QE/SDET</title>
      <dc:creator>Ken Simeon</dc:creator>
      <pubDate>Tue, 10 Mar 2020 05:09:52 +0000</pubDate>
      <link>https://forem.com/scriptmunkee/three-keys-to-being-successful-as-a-qa-qe-sdet-2hm3</link>
      <guid>https://forem.com/scriptmunkee/three-keys-to-being-successful-as-a-qa-qe-sdet-2hm3</guid>
      <description>&lt;p&gt;1) Always think about how the small pieces interact with the larger whole&lt;br&gt;
2) Be curious about how &amp;amp; why a developer is implementing a change&lt;br&gt;
3) Understand what's important to the business' success&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bonus&lt;/strong&gt; via &lt;a href="https://dev.to/@arleneandrews"&gt;Arlene Andrews&lt;/a&gt;&lt;br&gt;
4) Be able to accept that things &lt;em&gt;will&lt;/em&gt; change (be it tools, code, and/or requirements).&lt;/p&gt;

</description>
      <category>testing</category>
      <category>career</category>
    </item>
    <item>
      <title>Do You Use Your Software Automation Beyond Testing?</title>
      <dc:creator>Ken Simeon</dc:creator>
      <pubDate>Thu, 16 Jan 2020 10:49:56 +0000</pubDate>
      <link>https://forem.com/scriptmunkee/do-you-use-your-software-automation-beyond-testing-5cdg</link>
      <guid>https://forem.com/scriptmunkee/do-you-use-your-software-automation-beyond-testing-5cdg</guid>
      <description>&lt;p&gt;Tonight as I sit here watching my terminal retort data structures while creating digital entities, I wonder what other people use their automated test frameworks for beyond testing?&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>testing</category>
    </item>
    <item>
      <title>Cooking Up NAS Pis</title>
      <dc:creator>Ken Simeon</dc:creator>
      <pubDate>Wed, 08 Jan 2020 17:07:11 +0000</pubDate>
      <link>https://forem.com/scriptmunkee/cooking-up-nas-pis-1j23</link>
      <guid>https://forem.com/scriptmunkee/cooking-up-nas-pis-1j23</guid>
      <description>&lt;p&gt;For the past few weeks I've been doing a lot of research into Raspberry Pi SATA hard drive support. This particular internet combing event was all started with the &lt;a href="https://wiki.radxa.com/News/2019/12/introduce-rockpi-sata-hat" rel="noopener noreferrer"&gt;Rock Pi Dual/Quad SATA HAT announcement&lt;/a&gt; back in Dec. Lets just say its been a fruitful adventure. 😜&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclaimer: I have not been paid or received any compensation for the collection of words &amp;amp; thoughts about the products mentioned below&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding the best recipe
&lt;/h2&gt;

&lt;p&gt;I've always liked the idea of using a Raspberry Pi (RPi) as a storage management system. But I've never liked the idea of a bunch of USB enclosures hanging off a tiny RPi. It's always been a messy solution to me, especially when wanting to drive multiple 3.5" hard drives. Which would require a power source for each HD enclosure. I did look into attaching a multi disk JBOD to a RPi, but that still adds an additional power source &amp;amp; another device to maintain. I've considered buying an off the shelf NAS like a QNAP or Synology instead of build out a RPi solution, but I've always felt they were over priced and not power efficient enough. Not to mention these companies have had a hard time staying compliant with the licenses of all the open source software they leverage.&lt;/p&gt;

&lt;p&gt;The biggest draw for me with the &lt;em&gt;RockPi QUAD SATA HAT&lt;/em&gt; solution is that it would allow me to have a single power source to drive my entire RPi NAS concoction for either 3.5" or 2.5" hard drives. Not to mention that this RPi SATA hat solution supports true hard drive power management from the OS, unlike a basic USB enclosure. The ability to spin down a hard disk array is critical to the longevity of a spinning disk hard drive &amp;amp; the reduction of power consumption of the entire system that isn't accessed 24/7.&lt;/p&gt;

&lt;p&gt;Another big benefit for me would be that I'd then be able to decommission my aged DIY Franken-NAS that I feel like I've duct tap repair too often. Not to mention that keeping running 24/7 it out of the question because of fan noise &amp;amp; power consumption.&lt;/p&gt;

&lt;h2&gt;
  
  
  Buying for the recipe
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7luj74wu5djvcw5ubs83.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7luj74wu5djvcw5ubs83.jpg" alt="Rock Pi Quad SATA" width="800" height="543"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finding an adequate solution took some time. It all came down to balancing the "ultimate dream" against cost, my ability to reuse existing hardware, space constraints and estimating the true potential usage. The long pole of my research came down to the RPi version compatibility across the various add-on boards/hats and determining the right way to power the system. From all of my solution searching, I become even more confident in my decision to purchase the &lt;em&gt;Rock Pi Quad SATA HAT&lt;/em&gt; solution. &lt;/p&gt;

&lt;p&gt;Now with a shopping list in mind [or digital paper] and narrow down the just the essentials. I sought out the true best pricing and availability of the items I was planing to buy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.5" NAS Setup&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rock Pi Quad HAT for Pi v4&lt;/li&gt;
&lt;li&gt;Purchase Raspberry Pi v4 1GB&lt;/li&gt;
&lt;li&gt;Purchase USB Type C power supply&lt;/li&gt;
&lt;li&gt;use existing 2.5" drives (Various sizes x4)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3.5" NAS Setup&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rock Pi QUAD HAT for RPI v2/3&lt;/li&gt;
&lt;li&gt;Options:

&lt;ul&gt;
&lt;li&gt;Use existing RPi v2b&lt;/li&gt;
&lt;li&gt;Purchase a Libre Compute board (Le Potato)&lt;/li&gt;
&lt;li&gt;Purchase a RPI v3+&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Purchase supported PSU&lt;/li&gt;

&lt;li&gt;use existing 3.5" drives (1TB x4)&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Take My Money
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5lhz11cs8i41ktuml5q1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5lhz11cs8i41ktuml5q1.jpg" alt="Take My Money" width="800" height="323"&gt;&lt;/a&gt;&lt;br&gt;
NOT...SO...FAST!!!&lt;/p&gt;

&lt;p&gt;I was so ready to put my money where my mouths was, but didn't purchase the Rock Pi board for the following reasons.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The two sellers of the product were out of stock. 😭&lt;/li&gt;
&lt;li&gt;I'm waiting on version 1.2 of the board to become available so I don't have to use an ATX power supply to power the board &amp;amp; RPi while connecting 3.5" hard drives (it would remove my low power goals).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So for a short time [I hope] the build out of my RPi NAS will be on hold. Once the version 1.2 is available I'll be buying one or two Rock Pi Quad SATA boards and do a write up of the build out process.&lt;/p&gt;




&lt;p&gt;Attribution: &lt;a href="https://blog.adafruit.com/2015/07/03/how-to-build-a-7-node-raspberry-pi-hadoop-cluster-piday-raspberrypi-raspberry_pi/" rel="noopener noreferrer"&gt;Banner Image&lt;/a&gt;&lt;/p&gt;

</description>
      <category>diy</category>
      <category>linux</category>
      <category>raspberrypi</category>
      <category>hardward</category>
    </item>
    <item>
      <title>Are Testers, QAs &amp; QEs relevant in today's software development lifecycles? Asking for a friend.</title>
      <dc:creator>Ken Simeon</dc:creator>
      <pubDate>Tue, 03 Dec 2019 07:59:45 +0000</pubDate>
      <link>https://forem.com/scriptmunkee/are-testers-qas-qes-relevant-in-today-s-software-development-lifecycles-asking-for-a-friend-50nf</link>
      <guid>https://forem.com/scriptmunkee/are-testers-qas-qes-relevant-in-today-s-software-development-lifecycles-asking-for-a-friend-50nf</guid>
      <description></description>
      <category>discuss</category>
      <category>testing</category>
      <category>agile</category>
    </item>
    <item>
      <title>Software Design or Just Winging It?</title>
      <dc:creator>Ken Simeon</dc:creator>
      <pubDate>Wed, 25 Sep 2019 06:43:05 +0000</pubDate>
      <link>https://forem.com/scriptmunkee/software-design-or-just-winging-it-8lk</link>
      <guid>https://forem.com/scriptmunkee/software-design-or-just-winging-it-8lk</guid>
      <description>&lt;p&gt;Today I went down the path of designing the initial database schema of a work project I'll be kicking off in the next day or two. And then it had me thinking . . .&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do current Full-Stack and/or Backend developers actually use architecture design tools any more?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Back in my early days of the software development industry, it was common for a senior developer or architect to create a UML design doc of their projected Class &amp;amp; Method interactions for the platform. And in turn they created the necessary UML document for the database structure to support their overall software design. Nowadays, at least in the past 5+ years for me, I haven't seen such a wholistic document created. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So what are "modern" developers &amp;amp; architects doing? Winging it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/moHRAoGsLBg88/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/moHRAoGsLBg88/giphy.gif" alt="What you doing sucker"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>productivity</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Buy or Build a Test Case Management Platform?</title>
      <dc:creator>Ken Simeon</dc:creator>
      <pubDate>Tue, 17 Sep 2019 16:25:30 +0000</pubDate>
      <link>https://forem.com/scriptmunkee/buy-or-build-a-test-case-management-platform-fh3</link>
      <guid>https://forem.com/scriptmunkee/buy-or-build-a-test-case-management-platform-fh3</guid>
      <description>&lt;p&gt;In today's swift moving software development space there are lots of tools &amp;amp; services for helping a Software QA team manage their test case library. The key needs for one of these systems is to have a way to easily curate the creation, maintenance and organization of the test cases and track their execution progress over time.&lt;/p&gt;

&lt;p&gt;Here are my questions: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Did you buy or build a TCM?&lt;/li&gt;
&lt;li&gt;What did your company/team do?&lt;/li&gt;
&lt;li&gt;What was the driving force behind your decision?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Looking forward to your insights.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>testing</category>
    </item>
    <item>
      <title>What's in my Toolbox</title>
      <dc:creator>Ken Simeon</dc:creator>
      <pubDate>Thu, 05 Sep 2019 01:13:52 +0000</pubDate>
      <link>https://forem.com/scriptmunkee/what-s-in-my-toolbox-n33</link>
      <guid>https://forem.com/scriptmunkee/what-s-in-my-toolbox-n33</guid>
      <description>&lt;p&gt;As a Hybrid software developer and quality analysis (QA) [aka Quality Engineer (QE)] I use a vast variety of applications &amp;amp; tools to keep myself productive in my daily activities on my Mac.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7eh44xd482aq4in6ppb5.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7eh44xd482aq4in6ppb5.gif" alt="Are we cool?" width="480" height="199"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  For Terminal Junkies
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://www.iterm2.com" rel="noopener noreferrer"&gt;iTerm2&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Great replacement to the standard MacOS terminal with support for theming and more features then you can shake a stick at.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://developer.apple.com/download/more/?=command%20line%20tools" rel="noopener noreferrer"&gt;Xcode Command Line Tools&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Its essential for any developer.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Quick Tip&lt;/em&gt;- don't click the link. Just open a Terminal and type in &lt;code&gt;git&lt;/code&gt; or &lt;code&gt;xcode-select --install&lt;/code&gt; or install Xcode from the AppStore.
&lt;a href="https://brew.sh" rel="noopener noreferrer"&gt;Homewbrew&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;A must have package manager so you can get all of the missing *nix based utilities not installed by the base operating system.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://github.com/tmux/tmux/wiki" rel="noopener noreferrer"&gt;Tmux&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I prefer to use Tmux for managing multiple terminals over the built in functionality iTerm2.&lt;/li&gt;
&lt;li&gt;Tmux also allows me to make my configuration more portable across *nix systems.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.vim.og" rel="noopener noreferrer"&gt;Vim&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Its included with every *nix based system. So it's better to know it then be scared of it.&lt;/li&gt;
&lt;li&gt;Install Vim using Homebrew. The version included with MacOS can be outdated.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fscriptmunkeeofficial%2Fdot_files%2Fraw%2Fmaster%2Fresources%2Ftmux_powered.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fscriptmunkeeofficial%2Fdot_files%2Fraw%2Fmaster%2Fresources%2Ftmux_powered.png" alt="Tmux and VIM" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  When you have to GUI
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://macvim-dev.github.io/macvim/" rel="noopener noreferrer"&gt;MacVim&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I don't leave home without it!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://tableplus.com" rel="noopener noreferrer"&gt;TablePlus&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It blows Sequel Pro out the water
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftableplus.com%2Fresources%2Fimages%2Fappearance%402x.png" alt="TablePlus" width="800" height="400"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://macdown.uranusjr.com/" rel="noopener noreferrer"&gt;MacDown&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Its a very simple Markdown editor that includes an inline viewer.
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnvzvqispr4hs1ypjw79a.png" alt="MacDown" width="800" height="455"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.getpostman.com/" rel="noopener noreferrer"&gt;Postman&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When you want to test APIs or write API documentation, it doesn't get much easier
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.getpostman.com%2Fimg%2Fpages%2Fproducts%2Fscreenshot.png" alt="Postman" width="" height=""&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://cyberduck.io" rel="noopener noreferrer"&gt;Cyberduck&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;So much more than an FTP client
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5mzhm29yw88e33m6j0cu.png" alt="Cyberduck" width="712" height="597"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://code.visualstudio.com/" rel="noopener noreferrer"&gt;VisualStudio Code&lt;/a&gt; [when i'm being lazy]&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Might be the most popular cross platform Editor [next to Vim 😂]
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwilkellyabtests.blob.core.windows.net%2Fabtests%2Fhome-screenshot-mac-lg-2x.png" alt="VSCode" width="800" height="400"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.sourcetreeapp.com/" rel="noopener noreferrer"&gt;SourceTree&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When Git branches gets a bit too messy I turn to SourceTree
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqymxfwfuwgvoi7o9ao9w.png" alt="SourceTree" width="700" height="440"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.xmind.net/" rel="noopener noreferrer"&gt;Xmind&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;There are times when I have to visually map out a workflow and Xmind is the right tool for that job.
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyse4vi1r4mavyh92vzmm.png" alt="Xmind" width="800" height="493"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Utilities
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://www.charlesproxy.com" rel="noopener noreferrer"&gt;Charles Proxy&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CP is it for when you want to see every network communication or manipulate the communication between your device/browser and a server.
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb0cuqsj3e32tzkdcm17j.png" alt="Charles Proxy" width="550" height="426"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.virtualbox.org/" rel="noopener noreferrer"&gt;VirtualBox&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Virtualization is everything these days. Plus VirtualBox pairs well with &lt;a href="https://www.vagrantup.com/" rel="noopener noreferrer"&gt;Vagrant&lt;/a&gt; and &lt;a href="https://www.docker.com/" rel="noopener noreferrer"&gt;Docker&lt;/a&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.virtualbox.org%2Fraw-attachment%2Fwiki%2FScreenshots%2FFedora_21_on_OSX.png" alt="VirualBox" width="800" height="400"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="http://lightheadsw.com/caffeine/" rel="noopener noreferrer"&gt;Caffeine&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When I'm presenting or partnering with someone, the last thing I want to worry about is my Mac going to sleep &amp;amp; locking.
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw4h502fr21o2iqizfb35.png" alt="Caffeine" width="800" height="235"&gt;
&lt;a href="https://www.tynsoe.org/v2/stm/" rel="noopener noreferrer"&gt;SSH Tunnel Manager&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://chargeberry.com/" rel="noopener noreferrer"&gt;Chargeberry&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Its just my little nerdy Battery monitor
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fchargeberry.com%2Fimg%2Fimg_information2x.png" alt="Chargeberry" width="800" height="400"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's it. What about you? Do you have specific tools or apps you can't live without?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fprc8uk11z5pld0jg4jxj.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fprc8uk11z5pld0jg4jxj.gif" alt="That's some gourmet shit!" width="500" height="282"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Automated Testing 101 - Swimming with Sharks</title>
      <dc:creator>Ken Simeon</dc:creator>
      <pubDate>Wed, 04 Sep 2019 08:09:23 +0000</pubDate>
      <link>https://forem.com/scriptmunkee/test-automation-swimming-with-sharks-3e1n</link>
      <guid>https://forem.com/scriptmunkee/test-automation-swimming-with-sharks-3e1n</guid>
      <description>&lt;h3&gt;
  
  
  Preamble
&lt;/h3&gt;

&lt;p&gt;I'm starting a new series called &lt;strong&gt;Automated Testing 101&lt;/strong&gt; where I will be covering the topic of getting a test automation effort off the ground &amp;amp; making it successful. This has been something I've wanted to write about for a long time and it all kind of kicked off based on my comment to &lt;a href="https://medium.com/@steven.lemon182" rel="noopener noreferrer"&gt;Steven Lemon's&lt;/a&gt; post over on Medium about his development teams &lt;a href="https://medium.com/@steven.lemon182/our-teams-troubles-with-hand-written-automated-ui-tests-cb189cbbff90" rel="noopener noreferrer"&gt;Test Automation troubles&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  There's sharks in the water
&lt;/h3&gt;

&lt;p&gt;Lets say you build cages for shark encounters...You and your engineering team understand the "perceived" dangers. All creation steps of the cages are done by hand. The testing of a cage's durability is conducted by hand also. You've heard some complaints from customers about the lack of durability of your cages but no ones been hurt by a shark as far as you know. But in the same breath from your business leaders you are told your engineering team/org needs to start building more shark encounter cages faster with higher quality. Then someone says aloud that we should &lt;em&gt;automate&lt;/em&gt; our engineering processes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw821hl4hlnzzml3paqvs.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw821hl4hlnzzml3paqvs.gif" alt="Smiling Shark" width="450" height="252"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You might be saying, How the hell does this relate to software development? Like my fake shark cage engineering company, we build software products for people and have an idea of how the product should be used. We never fully know how our products are actually used. There are complaints about the quality of the product (bugs or missing features) and our business leaders always want something new or fixed faster.&lt;/p&gt;

&lt;p&gt;[Fast forward] To meet the needs of delivering faster your software engineering team has implemented layers of automation around the development processes like continuous builds/deployments and infrastructure scaling. Now the business turns to the QA team and says the testing efforts are taking too long and slowing delivery. We need testing to be quicker and more accurate. So lets implement automated testing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg8h8m5mdc8jm46wndb3a.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg8h8m5mdc8jm46wndb3a.gif" alt="More Sharks" width="500" height="206"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Getting Started with Test Automation
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;TIME&lt;/strong&gt;. The #1 reason given to a QA/Engineering team for implementing automated testing. #2 is &lt;strong&gt;consistency&lt;/strong&gt; of test execution. Both of these bubble down to a belief that the bottle neck in software development lies within the QA team &amp;amp; their abilities to complete the necessary validation efforts [&lt;em&gt;this is a topic for another post. we'll go with it for now&lt;/em&gt;].&lt;/p&gt;

&lt;p&gt;So here is the deal with shifting a group from manual testing to automated testing that the business or engineering teams need to understand.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Manual testing will never be fully replaced by automated testing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;An engineering team can not become reliant on automated tests over manual testing for a long time until trust is earned by the automated tests by preventing and/or discovering issues.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Know that all current manual tests will not translate to being automated. There will be a need to rewrite or throw away some tests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automated testing should not just be UI tests. This could becomes a receipt for disaster.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automated testing is not just owned by the QA team. The entire development team has just as much responsibility by making the platform developed consistently and accessible for automated testing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;UI tests can be flaky or brittle so they must be focused on testing the UI interactions and use the necessary business logic to drive the UI behaviors.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The kick off of a test automation project should start by defining the scope of test automation project that the engineering &amp;amp; QA teams will create [unit test, integration tests, API tests, UI tests, etc]. Google &lt;a href="https://www.google.com/search?q=test%20automation%20pyramid" rel="noopener noreferrer"&gt;Test Automation Pyramid&lt;/a&gt; if you haven't yet.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The initial focus of UI automated testing should be around getting rid of the low hanging fruit [BVT, common UI interactions, etc] while you flush out your automation framework/platform of choice. And then target more advanced scenarios/tests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Finally you'll have to figure out a way to show the execution consistency of the automated tests [aka Reporting] so you can show the business/team the value of all the efforts behind the project.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Closing this chapter
&lt;/h3&gt;

&lt;p&gt;Ultimately in software development, the customers and business leaders are the sharks. For each, you have to design and develop your products &amp;amp; testing approaches to keep your engineering team safe from being eaten alive while pleasing the hungriest of each species.&lt;/p&gt;

&lt;p&gt;So, now that I've armed you with information and theory, are you ready to jump into your shark encounter cage of test automation? Hahah no you're not! Right now I've made you shark bait. You'll have to wait for Part 2 so I can start turning you into a fisherman &amp;amp; not food for the sharks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqv4v2z55egbyrgdh782a.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqv4v2z55egbyrgdh782a.gif" alt="Shark Bait" width="500" height="247"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bonus: 10.&lt;/strong&gt; I don't do 10 Tips or Top 10s&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Credits&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Banner Image: &lt;a href="https://www.isango.com/theguidebook/swim-with-sharks/" rel="noopener noreferrer"&gt;isango.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Shark GIFs: &lt;a href="https://www.imdb.com/title/tt0266543/" rel="noopener noreferrer"&gt;Finding Nemo&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>testing</category>
      <category>automation</category>
      <category>qa</category>
    </item>
  </channel>
</rss>
