<?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: Ben Dowen</title>
    <description>The latest articles on DEV Community by Ben Dowen (@dowenb).</description>
    <link>https://dev.to/dowenb</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%2F135303%2F1788f453-894a-4b8a-9aec-a49556ecd332.jpg</url>
      <title>DEV Community: Ben Dowen</title>
      <link>https://dev.to/dowenb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dowenb"/>
    <language>en</language>
    <item>
      <title>How to make a start with Test Automation</title>
      <dc:creator>Ben Dowen</dc:creator>
      <pubDate>Sun, 18 Sep 2022 20:49:29 +0000</pubDate>
      <link>https://dev.to/dowenb/how-to-make-a-start-with-test-automation-1go7</link>
      <guid>https://dev.to/dowenb/how-to-make-a-start-with-test-automation-1go7</guid>
      <description>&lt;p&gt;Sometimes, people ask me how to make a start in Test Automation, or as you might correctly hear it called automated checks. While there is no one answer, because of course it depends, I can pose some questions for you to ask yourself and point you to some great resources, so lets goooo!&lt;/p&gt;

&lt;h2&gt;
  
  
  Do I need to learn to code to build automation?
&lt;/h2&gt;

&lt;p&gt;No, but yes, well it depends!&lt;/p&gt;

&lt;p&gt;There are many tools that exist that do not require explicit programming language knowledge to build automation. Most of these tools do benefit from knowledge of how &lt;a href="https://developer.mozilla.org/en-US/docs/Glossary/Control_flow" rel="noopener noreferrer"&gt;&lt;strong&gt;control flow&lt;/strong&gt;&lt;/a&gt; and &lt;a href=""&gt;&lt;strong&gt;conditions&lt;/strong&gt; &lt;/a&gt;work, even if they don't need you to understand the syntax for a language.&lt;/p&gt;

&lt;p&gt;Concepts like &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Control_flow_and_error_handling#if...else_statement" rel="noopener noreferrer"&gt;&lt;strong&gt;if and else statements&lt;/strong&gt;&lt;/a&gt; and &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Loops_and_iteration" rel="noopener noreferrer"&gt;&lt;strong&gt;loops&lt;/strong&gt; &lt;/a&gt;are pretty much unavoidable, and if you want to automate web pages you're going to need some idea about &lt;a href="https://www.selenium.dev/documentation/webdriver/elements/finders/" rel="noopener noreferrer"&gt;&lt;strong&gt;locators&lt;/strong&gt;&lt;/a&gt;, and it wouldn't hurt to understand the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model/Introduction" rel="noopener noreferrer"&gt;&lt;strong&gt;Document Object Model&lt;/strong&gt;&lt;/a&gt; (DOM).&lt;/p&gt;

&lt;p&gt;Learning to code can also bring a bunch of other benefits, like better understanding the software you're testing and being able to have a different level of conversation with developers. So while learning to code is not a requirement for being a Tester or automating checks, I highly recommend giving it a go.&lt;/p&gt;

&lt;h2&gt;
  
  
  Transition from manual to automation
&lt;/h2&gt;

&lt;p&gt;If you're already working in Software Testing, but haven't yet written any automation and want to make a start, there are a few questions to ask yourself:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Are you looking to skill up to add automation as part of your current role at your current employer?&lt;/li&gt;
&lt;li&gt;Are you looking to take on a new role, at your current employer or elsewhere?&lt;/li&gt;
&lt;li&gt;Do you already know how to code, and are simply looking to gain experience in new tool or framework to start your journey?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Of course, as well as your desire, you will need the opportunities, if you don't already know what is available with your current employer it might be worth finding out by asking around.&lt;/p&gt;

&lt;p&gt;If you've never written code, then instead of learning test automation right off the bat, you might want to pick a language and learn the fundamentals first. There are many free, and paid ways to learn how to code.&lt;/p&gt;

&lt;p&gt;Some great places to start:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.freecodecamp.org/" rel="noopener noreferrer"&gt;https://www.freecodecamp.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.codecademy.com/" rel="noopener noreferrer"&gt;https://www.codecademy.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.w3schools.com/" rel="noopener noreferrer"&gt;https://www.w3schools.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finally, if you have the opportunity to pair with a developer or existing test automation engineer, take it! If you don't already have this opportunity, seek it out. Learning by doing, with the help of others is super valuable and will speed up your learning no end.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use automation to aid testing
&lt;/h2&gt;

&lt;p&gt;There is no need to limit your use of automation and tools to a suite of automated checks that you might typically consider test automation. In fact if you do, you are probably doing automation and testing a disservice.&lt;/p&gt;

&lt;p&gt;There are multiple proponents of using code and tools to support exploratory testing in different ways, one of them who I am lucky enough to work with presently is James Thomas. You can learn more about how James &lt;a href="https://www.ministryoftesting.com/talks/exploring-with-automation-with-james-thomas" rel="noopener noreferrer"&gt;&lt;strong&gt;Explores with Automation&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A champion on using code in testing is &lt;a href="https://twitter.com/maaretp" rel="noopener noreferrer"&gt;&lt;strong&gt;Maaret Pyhäjärvi&lt;/strong&gt;&lt;/a&gt;, just one fine example of her work is &lt;a href="https://youtu.be/CjS3wVXQt34" rel="noopener noreferrer"&gt;&lt;strong&gt;Exploratory Testing on Computer Interfaces (APIs)&lt;/strong&gt;&lt;/a&gt;, a Keynote from API Conference in 2019.&lt;/p&gt;

&lt;p&gt;And of course, there is &lt;a href="https://twitter.com/2bittester" rel="noopener noreferrer"&gt;&lt;strong&gt;Mark Winteringham&lt;/strong&gt;&lt;/a&gt; and &lt;a href="https://twitter.com/FriendlyTester" rel="noopener noreferrer"&gt;&lt;strong&gt;Richard Bradshaw&lt;/strong&gt;&lt;/a&gt; who coined the term &lt;a href="https://automationintesting.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Automation in Testing&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;,&lt;/strong&gt; and have produced fantastic courses, workshops and tools for learning how to get the best out of Automation, well beyond automated checks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Best language to learn for automation
&lt;/h2&gt;

&lt;p&gt;So, where to start? Java, Python, JavaScript, C#? Tell me damnit!&lt;/p&gt;

&lt;p&gt;While I can totally understand why you would want a general answer as to what language to use, there isn't one definitive answer.&lt;/p&gt;

&lt;p&gt;So, I will ask you to consider the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What do you want to learn first? If you haven't got any experience in any language, go spend some time looking at what is available and if any of them make good sense to you. If you already know a bit of something , start there!&lt;/li&gt;
&lt;li&gt;Are you looking to grow yourself within your current role in your current job? If so, speak to your team, see what would be useful for you to learn next&lt;/li&gt;
&lt;li&gt;If you're looking to grow skills to pick up a new role, look at what is popular in your target area of the world. The popularity of one language over another might be different for the places you are considering working for. Try and find people working in the geographical location you're targeting, recruiters or hiring managers, and ask them.&lt;/li&gt;
&lt;li&gt;Careers are long, if you spend time learning the fundamentals of coding, testing, and automating checks using code then you can apply much of those skills across multiple tools and languages. Yes, there is a learning curve to picking up a new thing, but it gets easier with every new one you try.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Resources for learning
&lt;/h2&gt;

&lt;p&gt;One of the absolute best resources for learning Test Automation in my experience is the &lt;a href="https://testautomationu.applitools.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Test Automation University&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt; Not only is it free, but the content is written by and for testers, so it's way more relevant then the odd testing focused chapter in a code course otherwise written for developers. The are even some introductions into coding on there, for example this course on &lt;a href="https://testautomationu.applitools.com/java-programming-course/" rel="noopener noreferrer"&gt;&lt;strong&gt;Java Programming&lt;/strong&gt;&lt;/a&gt; by &lt;a href="https://twitter.com/techgirl1908" rel="noopener noreferrer"&gt;&lt;strong&gt;Angie Jones&lt;/strong&gt;&lt;/a&gt; and this &lt;a href="https://testautomationu.applitools.com/javascript-tutorial/" rel="noopener noreferrer"&gt;&lt;strong&gt;Introduction to JavaScript&lt;/strong&gt;&lt;/a&gt; by &lt;strong&gt;Mark Thompson.&lt;/strong&gt; There is even a whole learning path for &lt;a href="https://testautomationu.applitools.com/learningpaths.html?id=codeless-path" rel="noopener noreferrer"&gt;&lt;strong&gt;Codeless automation&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you don't have a background in computer science, you may also get a kick out of the &lt;a href="https://www.codenewbie.org/basecs" rel="noopener noreferrer"&gt;&lt;strong&gt;Base.cs podcast&lt;/strong&gt;&lt;/a&gt;. In each episode the co-hosts &lt;a href="https://twitter.com/vaidehijoshi" rel="noopener noreferrer"&gt;&lt;strong&gt;Vaidehi Joshi&lt;/strong&gt;&lt;/a&gt; and &lt;a href="https://twitter.com/saronyitbarek" rel="noopener noreferrer"&gt;&lt;strong&gt;Saron Yitbarek&lt;/strong&gt;&lt;/a&gt; introduce and discuss a topic in an approachable way, with great anecdotes, many of them food related and you know I dig that!&lt;/p&gt;

&lt;h2&gt;
  
  
  Practice apps and challenges
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://automationintesting.online/#/" rel="noopener noreferrer"&gt;&lt;strong&gt;Restful Booker&lt;/strong&gt;&lt;/a&gt; is a great practice app for exploration or automation. It's a REST API and a frontend for a functional Bed &amp;amp; Breakfast, Shady Meadows.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://www.eviltester.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Evil Tester,&lt;/strong&gt;&lt;/a&gt; &lt;a href="https://twitter.com/eviltester" rel="noopener noreferrer"&gt;&lt;strong&gt;Alan Richardson&lt;/strong&gt;&lt;/a&gt; has created a series of &lt;a href="https://www.eviltester.com/page/tools/apichallenges/" rel="noopener noreferrer"&gt;&lt;strong&gt;API Challenges&lt;/strong&gt;&lt;/a&gt; that help you explore many of the aspects ot APIs that you might want to test, and therefore automate. While this isn't strictly an automation challenge, you could turn it into one by writing code to beat the challenge! I've started to give this a go myself, but it's work in progress.&lt;/p&gt;

&lt;p&gt;Want more? There is a great &lt;a href="https://club.ministryoftesting.com/t/products-and-sites-to-practice-testing-on/1242" rel="noopener noreferrer"&gt;*&lt;em&gt;post on The Club *&lt;/em&gt;&lt;/a&gt;, where loads of people have shared products and sites they have used to practice testing on. You can even go add your own!&lt;/p&gt;

&lt;h2&gt;
  
  
  Just start
&lt;/h2&gt;

&lt;p&gt;Finally, It's way better to &lt;a href="https://www.dowen.me.uk/Automation-Just-do-it!/" rel="noopener noreferrer"&gt;&lt;strong&gt;start&lt;/strong&gt;&lt;/a&gt;, then spend too much time worrying about where to start. You can also change your mind and try something else later if you don't like where you end up! I'm looking forward to hearing how your automation journey progresses, make sure to hit me up on Twitter, &lt;a href="https://twitter.com/FullSnackTester" rel="noopener noreferrer"&gt;&lt;strong&gt;@FullsnackTester&lt;/strong&gt;&lt;/a&gt;, and let me know!&lt;/p&gt;

&lt;p&gt;Originally published on my blog:&lt;br&gt;
&lt;a href="https://www.dowen.me.uk/how-to-make-a-start-with-test-automation/" rel="noopener noreferrer"&gt;https://www.dowen.me.uk/how-to-make-a-start-with-test-automation/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cover Photo by Tara Winstead: &lt;a href="https://www.pexels.com/photo/robot-pointing-on-a-wall-8386440/" rel="noopener noreferrer"&gt;https://www.pexels.com/photo/robot-pointing-on-a-wall-8386440/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>testing</category>
      <category>automation</category>
    </item>
    <item>
      <title>How to test anything in 5 steps</title>
      <dc:creator>Ben Dowen</dc:creator>
      <pubDate>Mon, 15 Aug 2022 18:27:14 +0000</pubDate>
      <link>https://dev.to/dowenb/how-to-test-anything-in-5-steps-5181</link>
      <guid>https://dev.to/dowenb/how-to-test-anything-in-5-steps-5181</guid>
      <description>&lt;p&gt;Originally posted on my bog: &lt;a href="https://www.dowen.me.uk/how-to-test-anything-in-5-steps/"&gt;https://www.dowen.me.uk/how-to-test-anything-in-5-steps/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How to test anything:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Capture&lt;/strong&gt; what you know so far and build a model&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review&lt;/strong&gt; the model with others, identify what is important&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explore&lt;/strong&gt; by running experiments to learn what you don't know&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update&lt;/strong&gt; the model based on what you know now&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repeat&lt;/strong&gt; this cycle until you stop finding useful information&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Capture
&lt;/h2&gt;

&lt;p&gt;We all build models of the things that we test, these might be mental models we keep in our head, informal models such as mind-maps or more formal models such as state transition diagrams.&lt;/p&gt;

&lt;p&gt;Build models that help describe the behaviour of the system you are testing, and capture the information in a way you can easily share and review with others. &lt;/p&gt;

&lt;h2&gt;
  
  
  Review
&lt;/h2&gt;

&lt;p&gt;Reviewing work with others is important for a number of reasons, mainly because by updating it with input from multiple people we can reduce bias from what we know ourselves and get closer to a truth that is useful.&lt;/p&gt;

&lt;p&gt;You can use questions get useful feedback on your model, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What is missing?&lt;/li&gt;
&lt;li&gt;What isn't correct?&lt;/li&gt;
&lt;li&gt;What is important?&lt;/li&gt;
&lt;li&gt;Does this feel right?&lt;/li&gt;
&lt;li&gt;Does this sound right?&lt;/li&gt;
&lt;li&gt;Does it add up?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Explore
&lt;/h2&gt;

&lt;p&gt;Now you've got an iteration of your model, you have some ideas about how the system should behave so it's time to test those ideas against the current reality of the system.&lt;/p&gt;

&lt;p&gt;The goal here is to explore to learn useful information, where to focus is going to depend on your context. Here are some things you might want to learn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If reviewers didn't agree, find out how the system behaves now?&lt;/li&gt;
&lt;li&gt;You identified behaviours that are important, do they indeed behave as you expect?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your model will have gaps, open questions, fill those knowledge gaps with exploration. You can run your exploratory testing in many ways, use your current model as a guide about what is important, and how you think the system should behave.&lt;/p&gt;

&lt;p&gt;It's very important you take good notes as you explore, so you can discuss your findings with your team and use the outcome of that conversation to update your model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Update
&lt;/h2&gt;

&lt;p&gt;Reflect on what you've learned during this iteration and make sure to update your model based on what you know now. Maybe you found surprises during your exploration, and now you know more, put it in the model.&lt;/p&gt;

&lt;p&gt;You will need to make choices as a team if a surprise you find is a bug, or intended behaviour that you haven't modelled yet, so keep them involved as you go.&lt;/p&gt;

&lt;h2&gt;
  
  
  Repeat
&lt;/h2&gt;

&lt;p&gt;This process is a cycle, that you can continue to repeat as you continue to test the system.&lt;/p&gt;

&lt;p&gt;On each iteration, you will learn more, if you stop learning useful information that your team can use to make better choices, you're done for now.&lt;/p&gt;

&lt;p&gt;When the next change comes along, you can build on existing models and create new ones as appropriate. It need not be a single model that you build, use whatever is appropriate for this iteration of the cycle.&lt;/p&gt;

&lt;h2&gt;
  
  
  How others test anything
&lt;/h2&gt;

&lt;p&gt;My esteemed colleague &lt;a href="https://twitter.com/qahiccupps"&gt;James Thomas&lt;/a&gt; as his own take on how to test anything, these are complementary to what I've said above and less cyclical.&lt;/p&gt;

&lt;p&gt;You can read find out more about James's approach:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://qahiccupps.blogspot.com/2020/05/how-to-test-anything.html"&gt;https://qahiccupps.blogspot.com/2020/05/how-to-test-anything.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/Lj6RjWA-arI"&gt;https://youtu.be/Lj6RjWA-arI&lt;/a&gt; [In 3 minutes]&lt;/p&gt;

&lt;h2&gt;
  
  
  Graphical Test Planning
&lt;/h2&gt;

&lt;p&gt;My cyclical approach to testing is based on the &lt;strong&gt;Capture&lt;/strong&gt;, &lt;strong&gt;Review&lt;/strong&gt; &lt;strong&gt;Update&lt;/strong&gt; from Graphical Test Planning (GTP), developed by Hardeep Sharma from Citrix Systems, many years ago.&lt;/p&gt;

&lt;p&gt;You can learn a little more about GTP here:&lt;br&gt;&lt;br&gt;
&lt;a href="https://sites.google.com/site/gtpfortest/"&gt;https://sites.google.com/site/gtpfortest/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Graphical Test Planning describes a way to model system behaviour in Structured Relationship Diagrams, and how to write Test Case Diagrams that model how to test single observable behaviours.&lt;/p&gt;

&lt;p&gt;Cover Photo by Ravi Kant: &lt;a href="https://www.pexels.com/photo/low-angle-grayscale-photo-of-empty-brick-stairs-1917328/"&gt;https://www.pexels.com/photo/low-angle-grayscale-photo-of-empty-brick-stairs-1917328/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>testing</category>
    </item>
    <item>
      <title>Building software is a team sport</title>
      <dc:creator>Ben Dowen</dc:creator>
      <pubDate>Wed, 01 Jun 2022 10:56:02 +0000</pubDate>
      <link>https://dev.to/dowenb/building-software-is-a-team-sport-21p</link>
      <guid>https://dev.to/dowenb/building-software-is-a-team-sport-21p</guid>
      <description>&lt;p&gt;As I recently posted on Twitter, I really believe that building great software products, services and solutions is a team sport. In some team sports, teams are made up of a fixed number of people, playing fixed roles. In others, squads of multidisciplinary players swap in and out for each game, even mid game.&lt;/p&gt;

&lt;p&gt;Then there are the supporting roles, the people who coach the team, the physio who keep them well. How many people does it take to allow two formula one drivers to race a single race, for one team? Hundreds at least!&lt;/p&gt;

&lt;p&gt;Building software based products is a similar story, one of teams of people coming together all playing important roles. And like sports, how many people, in what roles, is dependent on a number or key things. Two of these factors are scale and budget.&lt;/p&gt;

&lt;p&gt;At the most basic, ten people could out together two five-a-side football teams, hire a pitch and play a game of football. They have no coach, or physio or any of the many other supporting roles. How many people do Manchester United have? Scale, budget, context.&lt;/p&gt;

&lt;p&gt;Teams building software are no different. One developer can make software. Budget is low, but there is only one mouth to feed (and maybe their Family). At this scale, any bug fix interrupts development. If multiple customers have competing priorities, one has to wait.&lt;/p&gt;

&lt;p&gt;Anything new must be learnt before they can use it. If they go on vacation everything stops. There is no one else to support customers. Some customers will avoid using products from a single developer, because in their context they need uninterrupted support. So... We scale.&lt;/p&gt;

&lt;p&gt;As we scale companies, we might have goals we want to achieve with this new capacity. Being able to attract larger customers with deeper pockets and commit for longer. Scope for taking holidays. Building new features faster. Build and operate reliable products.&lt;/p&gt;

&lt;p&gt;This is where we start to introduce roles. We no longer have only Developers. Now we have people who look after Product, Sales, Support, Operations, Legal, HR, Quality and more. Depending on context, and scale, these maybe people or services from other organisations.&lt;/p&gt;

&lt;p&gt;Somewhere along the way, as the company grows we might run into problems. We grew our budget, added roles but we still haven't met our goals and some of us are miss the days a small team could ship their own product without help.&lt;/p&gt;

&lt;p&gt;One way we might try and fix this, is by shaping our teams into multidisciplinary powerhouses. With Devs, Ops, Product and Quality all together, maybe more too! This power team can play their part of the game. But did we solve our problem? Meet our goals? Are we tracking them?&lt;/p&gt;

&lt;p&gt;Over time, sports teams and hope they are supported have evolved. Formula One today is light years ahead of where it was in the 1980s. And so too software teams and organisational structures change.&lt;/p&gt;

&lt;p&gt;What is important is to understand your goals, identify your problems and measure your progress. Don't get distracted by how others are playing the game, focus on what works for your team! This is a journey. I've heard again and again "No such thing as a DevOps engineer"&lt;/p&gt;

&lt;p&gt;I've also heard, that there should be no Testers. Just Developers who are coached and taught how to test. This might work great for some teams That doesn't mean you should feel bad for having your DevOps and QEs in your success team. In your current context, budget and scale.&lt;/p&gt;

&lt;p&gt;Originally posted on my blog: &lt;a href="https://www.dowen.me.uk/creating-software-is-a-team-sport/"&gt;https://www.dowen.me.uk/creating-software-is-a-team-sport/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cover Photo by NEOSiAM 2021: &lt;a href="https://www.pexels.com/photo/selective-focus-photography-of-foosball-table-595229/"&gt;https://www.pexels.com/photo/selective-focus-photography-of-foosball-table-595229/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>agile</category>
      <category>scale</category>
      <category>team</category>
    </item>
    <item>
      <title>Building your toolbox and sharpening your tools</title>
      <dc:creator>Ben Dowen</dc:creator>
      <pubDate>Sat, 28 May 2022 10:24:44 +0000</pubDate>
      <link>https://dev.to/dowenb/building-your-toolbox-and-sharpening-your-tools-1le5</link>
      <guid>https://dev.to/dowenb/building-your-toolbox-and-sharpening-your-tools-1le5</guid>
      <description>&lt;p&gt;Originally posted: &lt;a href="https://www.dowen.me.uk/building-your-toolbox-and-sharpening-your-tools/"&gt;https://www.dowen.me.uk/building-your-toolbox-and-sharpening-your-tools/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Too long, didn't read:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tools can include mental models, methods or software&lt;/li&gt;
&lt;li&gt;Get inspired by following people on social media, read blogs and attend conferences&lt;/li&gt;
&lt;li&gt;Learn new tools from resources such as presentations, blogs. books, tutorials and courses&lt;/li&gt;
&lt;li&gt;Create regular opportunities to practice using tools, so you can be comfortable using them and even teaching others&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quality Engineering
&lt;/h2&gt;

&lt;p&gt;Tester? Quality Engineer? QA? There are many named roles in Software Testing, that can imply different work and scope, but often involve some of the same core skills.&lt;/p&gt;

&lt;p&gt;What is your bag? People, Process, or Product? This is the question that has led Meg to have a Job role existential crisis!&lt;/p&gt;

&lt;p&gt;In response I gleefully welcome Meg to my world, where I attempt to blend all of these things into my current role as a Quality Engineer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JrYs36Js--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1mn9kj5se0aobiw06ob1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JrYs36Js--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1mn9kj5se0aobiw06ob1.png" alt="Twitter screenshot message by Meg and response from Ben" width="593" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/FullSnackTester/status/1529206878793871361"&gt;https://twitter.com/FullSnackTester/status/1529206878793871361&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Think about this a bit more, what did I mean and how can it be helpful for others?&lt;/p&gt;

&lt;h2&gt;
  
  
  Build your toolbox
&lt;/h2&gt;

&lt;p&gt;As I have grown in software testing over my career, I like to think I've made progress becoming a better Tester. A large part of what that means to me, is that I have expanded my toolbox. I know more ways to solve problems, so not every problem looks like a nail and I reach for my hammer less and less.&lt;/p&gt;

&lt;h3&gt;
  
  
  What are tools?
&lt;/h3&gt;

&lt;p&gt;In this context, as well as software tools such as Postman, I also mean thinking tools like MindMaps, and techniques like Exploratory Testing.&lt;/p&gt;

&lt;p&gt;If you want a toolbox that covers People, Process and Product, you will need to collect a broad range of tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  Learn from resources
&lt;/h3&gt;

&lt;p&gt;The primary way to learn new things, is to start by consuming resources. You may already be familiar with learning from Books, Courses, Blogs and other resources.&lt;/p&gt;

&lt;h3&gt;
  
  
  Resources I've learned from include:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[Book] Explore It! - Elisabeth Hendrickson&lt;/li&gt;
&lt;li&gt;[Course] Test Automation University&lt;/li&gt;
&lt;li&gt;[Blog] QA Hiccupps - James Thomas&lt;/li&gt;
&lt;li&gt;[Blog] A Tester's Journey - Lisi Hocke&lt;/li&gt;
&lt;li&gt;[Newsletter] Software Testing Weekly&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Learn by experimentation
&lt;/h3&gt;

&lt;p&gt;Another excellent way of learning new tools, techniques and methods I've used is by finding opportunities to try things out.&lt;/p&gt;

&lt;p&gt;By running short experiments, we can quickly find out if something is worth further effort to learn deeper. While I have tried out many tools and run many short experiments, I don't have a useful example to share.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sharpen your tools
&lt;/h2&gt;

&lt;p&gt;Now you know a bunch of new things, you have new tools in your toolbox! This is a great start, because it expands your knowledge base and helps you choose more specific tools for the problems you encounter.&lt;/p&gt;

&lt;p&gt;What I find, is that however much knowledge I consume, however much theory I ingest, I don't feel comfortable using tools until I've spent a good amount of time being uncomfortable and practice using them.&lt;/p&gt;

&lt;p&gt;Around the start of the year I had done some good learning Exploratory Testing form resources, but I was not comfortable using it regularly.&lt;/p&gt;

&lt;p&gt;In order to sharpen my Exploratory Testing skills I setup regular sessions to practice, every week and on the software my team is working on. This worked better then I hoped, and I am now comfortable Exploring and working with others introduce them to the method.&lt;/p&gt;

&lt;p&gt;In summary: Create regular opportunities to practice using tools.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>codequality</category>
      <category>qe</category>
      <category>tools</category>
    </item>
    <item>
      <title>Anatomy of test automation</title>
      <dc:creator>Ben Dowen</dc:creator>
      <pubDate>Mon, 01 Feb 2021 23:24:11 +0000</pubDate>
      <link>https://dev.to/dowenb/anatomy-of-test-automation-e9o</link>
      <guid>https://dev.to/dowenb/anatomy-of-test-automation-e9o</guid>
      <description>&lt;p&gt;With the rise of low-code and no-code solutions, I've been thinking about the problem they are trying to solve.&lt;/p&gt;

&lt;p&gt;This lead me to think wider about the parts of Testing that can be supported by tools and automation.&lt;/p&gt;

&lt;h2&gt;
  
  
  System under test
&lt;/h2&gt;

&lt;p&gt;In the begining, you need the correct version of the System Under Test.&lt;/p&gt;

&lt;p&gt;This maybe as simple as taking the latest build of a single isolated service.&lt;/p&gt;

&lt;p&gt;More likely, this will involve getting matching versions of multiple services that work together to form a system.&lt;/p&gt;

&lt;p&gt;This task alone may not be trivial, more then likely it can be automated with help of a Continuous Integration (CI) platform.&lt;/p&gt;

&lt;p&gt;Something like Jenkins that can be configured to kick off builds when you commit changes to source control.&lt;/p&gt;

&lt;p&gt;All CI systems I know of require at least minimal code, or at least a configuration file of some sort that gives instructions on how to build the Software.&lt;/p&gt;

&lt;p&gt;Likely this is a wider concern then Test Automation, you won't be the only one who wants software built.&lt;/p&gt;

&lt;p&gt;But I've worked in consultancies who still build the odd thing by hand and FTP it to a server.&lt;/p&gt;

&lt;p&gt;So if you don't already have a slick answer for this, it's a barrier to automation straight away.&lt;/p&gt;

&lt;h2&gt;
  
  
  The supporting environment
&lt;/h2&gt;

&lt;p&gt;The SUT will seldom live on it's own, unsupported by dependencies. This might e mean having the right Node or Java versions available.&lt;/p&gt;

&lt;p&gt;It could also mean setting up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Databases&lt;/li&gt;
&lt;li&gt;Storage&lt;/li&gt;
&lt;li&gt;Queues&lt;/li&gt;
&lt;li&gt;Proxies&lt;/li&gt;
&lt;li&gt;Load balancers&lt;/li&gt;
&lt;li&gt;Third party API or appropriate mocks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each of these may also need special configuration or base data seeding that isn't specific to any given scenario.&lt;/p&gt;

&lt;p&gt;If you are lucky you can get some or all of your dependencies deployed using some type of automation. Maybe Docker images that can be Deployed by your CI System.&lt;/p&gt;

&lt;p&gt;Living the dream. More automation, definitely some code, hopefully some Infrastructure as code.&lt;/p&gt;

&lt;p&gt;Failing that, you might have some static servers. hopefully managed by a friendly Ops engineer. Otherwise another job for you.&lt;/p&gt;

&lt;p&gt;Again, if this isn't already slick and automated, another barrier to entry.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test scenario
&lt;/h2&gt;

&lt;p&gt;Okay, the big one. Let's assume we overcame all the hurdles above. Now let's break down our Test cases.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;p&gt;In addition to all the setup you've done to get this far you might still need a big more. Maybe some users with appropriate access.&lt;/p&gt;

&lt;h3&gt;
  
  
  Test data
&lt;/h3&gt;

&lt;p&gt;If your inputs and outputs are static, this might be trivial.&lt;/p&gt;

&lt;p&gt;For me, I often work with non trivial test data that requires some level of templating.&lt;/p&gt;

&lt;p&gt;I often need to make sure dates represent today, even if I wrote the test and captured the data months ago.&lt;/p&gt;

&lt;p&gt;In some cases test data can be generated automatically using libraries like faker. I know some tools, like Mockoon include Faker out the box.&lt;/p&gt;

&lt;h3&gt;
  
  
  System state (Given)
&lt;/h3&gt;

&lt;p&gt;Now your going to want to get your system into the starting state.&lt;/p&gt;

&lt;p&gt;Some examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User is logged in&lt;/li&gt;
&lt;li&gt;A the right page is loaded&lt;/li&gt;
&lt;li&gt;An entry doesn't already exist for new TODO item you are about to create&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is something your automation framework, code or otherwise really should handle.&lt;/p&gt;

&lt;p&gt;Finally, something we can recognise as Test Automation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Action (When)
&lt;/h3&gt;

&lt;p&gt;This is the core of the test. Stimulating the users action or a sequence of multiple actions that we expect to make some change to the system state.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User clicks a button&lt;/li&gt;
&lt;li&gt;API call is made&lt;/li&gt;
&lt;li&gt;File is changed&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Assertion of expected result (Then)
&lt;/h3&gt;

&lt;p&gt;This is where most of the debate comes in about Automated Checks and Human testing. Ignoring any Ai for a moment.&lt;/p&gt;

&lt;p&gt;This is where we have a coded assertion. I don't mean we need to be using a programming language, but we need to have an unambiguous way to choose if the actual results we got are what we expect.&lt;/p&gt;

&lt;p&gt;If they match our coded expectations the test passed, otherwise it falls.&lt;/p&gt;

&lt;p&gt;While we can make test smart to an extent and we can look for shapes and ranges, ultimately we can only assert on what we can expect.&lt;/p&gt;

&lt;p&gt;This can definitely be done by any automation framework, whatever the language, low-code or no-code.&lt;/p&gt;

&lt;p&gt;If we got this far we are winning, provided of course we did our Test Analysis right and we are checking for useful things.&lt;/p&gt;

&lt;h2&gt;
  
  
  Logging and reporting
&lt;/h2&gt;

&lt;p&gt;Analysing logs and making reports can definitely be fully or partially Automated.&lt;/p&gt;

&lt;p&gt;This might take the form of some Console output that can be captured by your CI System and be linked to a build. It could also take the form of a HTML report, complete with graphs, screenshots, API responses to even video recording.&lt;/p&gt;

&lt;p&gt;What you will probably miss is the contextual logging. The logs from the dependencies and more distant parts of your SUT. This can also be captured and logged, but takes a fair amount more thought.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tools and supporting script's
&lt;/h2&gt;

&lt;p&gt;Of course this maximalist description describes pretty much an end to end or system integration test.&lt;/p&gt;

&lt;p&gt;As I'm sure expert's like Mark Winteringham, Richard Bradshaw and Alan Richardson would tell you, you can get great value from Automation and Tools to support your testing way short of an end to end test.&lt;/p&gt;

&lt;p&gt;I've done this myself on plenty of occasions by creating tools to capture or generate test data, of by mocking APIs to support my Exploratory Testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion final thoughts
&lt;/h2&gt;

&lt;p&gt;If you were not convinced already that to succeed, an automation strategy need support and buy in from many people in various roles, I hope you are now a convert.&lt;/p&gt;

&lt;p&gt;In my opinion, and I am making some assumptions, low-code or no code only attempts to solve.&lt;/p&gt;

&lt;p&gt;In fact, I would go further and say Test Automation Frameworks only try and solve part of the problem. And that's OK.&lt;/p&gt;

&lt;p&gt;Building software is a team game, and Software Quality even more so.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>automatin</category>
    </item>
    <item>
      <title>Hosting a Twitter bot for free on Heroku</title>
      <dc:creator>Ben Dowen</dc:creator>
      <pubDate>Sat, 30 Jan 2021 21:20:56 +0000</pubDate>
      <link>https://dev.to/dowenb/hosting-a-twitter-bot-for-free-on-heroku-2h6c</link>
      <guid>https://dev.to/dowenb/hosting-a-twitter-bot-for-free-on-heroku-2h6c</guid>
      <description>&lt;p&gt;Cover Photo by &lt;a href="https://www.pexels.com/@kaboompics?utm_content=attributionCopyText&amp;amp;utm_medium=referral&amp;amp;utm_source=pexels"&gt;Kaboompics.com from Pexels&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Originally posted on my learning journal: &lt;a href="https://journal.fullsnacktester.com/learning/2021/01/30/twitter-bot.html"&gt;https://journal.fullsnacktester.com/learning/2021/01/30/twitter-bot.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;!! Please note, Heroku are removing their free dynos, so you can no longer run a Twitter bot on Heroku for free. See &lt;a href="https://blog.heroku.com/next-chapter"&gt;https://blog.heroku.com/next-chapter&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Following a tutorial
&lt;/h2&gt;

&lt;p&gt;I started writing the &lt;a href="https://twitter.com/TesterOfTheDay"&gt;@TesterOfTheDay&lt;/a&gt; Twitter bot by following a tutorial. I am not ashamed to admit it, I wanted to make a Twitter bot, not learn how to make a Twitter bot. So I used the final state of the tutorial as my starting point.&lt;/p&gt;

&lt;p&gt;You can find the tutorial I followed here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/sumedhpatkar/how-i-created-a-twitter-bot-using-node-js-and-heroku-368b#create-app"&gt;How to create a Twitter Bot using Node.js and Heroku&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I have no intention of repeating anything from that tutorial, if you want to follow it, go read it. Of course I changed it enough so that it searched for &lt;a href="https://twitter.com/hashtag/TesterOfTheDay"&gt;#TesterOfTheDay&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you want to start from my final state, go right ahead and grab the code from GitHub:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/dowenb/testeroftheday-twitterbot"&gt;testeroftheday-twitterbot&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Using dotenv to protect credentials
&lt;/h2&gt;

&lt;p&gt;The tutorial used a &lt;code&gt;config.js&lt;/code&gt; method for providing the app with Twitter API keys, with a vague note not to leak your credentials. As I wasn't familiar with how to use a &lt;code&gt;config.js&lt;/code&gt; in a secure why while hosting my repo openly on GitHub, I went with what I know and used &lt;a href="https://www.npmjs.com/package/dotenv"&gt;dotenv&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For local development I have a &lt;code&gt;.env&lt;/code&gt; file that I do not check into GitHub. The way dotenv works, if a .env file is present it loads the content into environment variables, accessible in NODE via process.env.&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="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dotenv&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;twit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;twit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;


&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;twit&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;consumer_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;CONSUMER_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;consumer_secret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;CONSUMER_SECRET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;access_token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ACCESS_TOKEN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;access_token_secret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ACCESS_TOKEN_SECRET&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I then configured the environment variables (my Twitter credentials) in Heroku. For this I followed the Heroku documentation: &lt;a href="https://devcenter.heroku.com/articles/config-vars"&gt;Configuration and Config Vars&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Switching to 10 minute schedule for huge savings
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The problem
&lt;/h3&gt;

&lt;p&gt;By default &lt;a href="https://dev.to/sumedhpatkar"&gt;Sumedh Patkar&lt;/a&gt; Twitter Bot uses &lt;code&gt;setInterval&lt;/code&gt; to trigger once every minute. This gives a very fast response, and is infrequent enough to comply with the Twitter API rules, as far as I can tell at least. This method has one big consequence, it was burning thorough my free dynos, aka credit on Heroku.&lt;/p&gt;

&lt;h3&gt;
  
  
  The solution
&lt;/h3&gt;

&lt;p&gt;I changed from using an infinite loop to a one off execution that could be triggered by the &lt;a href="https://devcenter.heroku.com/articles/scheduler"&gt;Heroku Scheduler&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Note to install the free Heroku Scheduler plugin, I did need to add a Credit Card to my account. This had an added benefit of doubling my free dynos.&lt;/p&gt;

&lt;p&gt;Now the scheduler in the free plugin only allows a trigger once every 10 minutes, but for the Tester of The Day bot this was still plenty. Realistically there are only a small handful of Tweets on that hashtag every day and no where near enough to justify a 1 minute repetition.&lt;/p&gt;

&lt;p&gt;You can see for yourself the minor code change on GitHub in this commit:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/dowenb/testeroftheday-twitterbot/commit/ea095b8572f29555e548c2b61afae386406fea3f"&gt;https://github.com/dowenb/testeroftheday-twitterbot/commit/ea095b8572f29555e548c2b61afae386406fea3f&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It also required following the docs and setting up the Scheduler plugin. The job simply runs &lt;code&gt;node bot.js&lt;/code&gt; every 10 minutes and was trivial to setup once I had added my credit card.&lt;/p&gt;

&lt;p&gt;Make sure you also turn off the &lt;code&gt;web&lt;/code&gt; and &lt;code&gt;worker&lt;/code&gt; Dyno formation. You don't need that running, because execution now comes only from the scheduler.&lt;/p&gt;

&lt;h3&gt;
  
  
  The savings $$$
&lt;/h3&gt;

&lt;p&gt;On a free Heroku account you get 550 "dyno hours", raising to 1000 when you register a credit card.&lt;/p&gt;

&lt;p&gt;In a month with 31 days, running the Twitter bot 24 hours a day in a loop would consume 24 * 31 hours, that is 744! Even when adding my credit card, this wouldn't of left me with much credit to host anything else for free.&lt;/p&gt;

&lt;p&gt;With the change to running one every 10 minutes, in January my Twitter bot consumed only 51 hours. What is more, that includes over one full day wroth of hours a the start of the month before I made the change!&lt;/p&gt;

&lt;p&gt;So I've one from using up all my credit, to gently sipping away at it. I expect in February I'll see the full benefit with even further reduction in usage.&lt;/p&gt;

&lt;h2&gt;
  
  
  In conclusion
&lt;/h2&gt;

&lt;p&gt;If you don't need a process to respond to web requests, and you don't need it to be running 24/7 consider using the Heroku Scheduler. It could allow you to run for free what might otherwise cost your more, or reduce your usage if your are already on a paid tier.&lt;/p&gt;

&lt;p&gt;While I found this change valuable on Heroku with my Twitter bot, the principle is potentially transferable to other situations. Let me know how you get on!&lt;/p&gt;

&lt;h2&gt;
  
  
  Tester of The Day
&lt;/h2&gt;

&lt;p&gt;While I am here, let me tell you, Tester of The Day is a daily award that celebrates great people who contribute to the Software Testing community. Winners are induced into the &lt;a href="http://testeroftheday.fullsnacktester.com/"&gt;Tester of The Day: Hall of Fame&lt;/a&gt;. Check it out!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>showdev</category>
      <category>node</category>
      <category>twitter</category>
    </item>
    <item>
      <title>Testing HTML5 Upload </title>
      <dc:creator>Ben Dowen</dc:creator>
      <pubDate>Mon, 23 Sep 2019 14:48:31 +0000</pubDate>
      <link>https://dev.to/dowenb/testing-html5-upload-5eh6</link>
      <guid>https://dev.to/dowenb/testing-html5-upload-5eh6</guid>
      <description>&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;p&gt;A current project I am testing involves a HTML5 file upload. I had thought that the "Browser" a file prompt would prevent me from using a Selenium test framework to automate this process. However it turns out, as with many things that this is a "Solved problem".&lt;/p&gt;

&lt;p&gt;The short answer is, you can identify the "Browser" button input element and use "Send Keys" function to provide the path to the file you want to upload. You then trigger the submit butting using the "Click" command as normal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup a virtual environment and install SeleniumBase
&lt;/h2&gt;

&lt;p&gt;I entered the following commands in a PowerShell prompt, I already have Python 3, pip and virtualenv installed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;e:\dev&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;virtualenv&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;uploadtestenv&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;\uploadtestenv\Scripts\activate.ps1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nx"&gt;pip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;seleniumbase&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;seleniumbase&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;chromedriver&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;seleniumbase&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;mkdir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;file_upload_test&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;file_upload_test&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SeleniumBase Help docs are available: &lt;a href="https://github.com/seleniumbase/SeleniumBase/tree/master/help_docs"&gt;https://github.com/seleniumbase/SeleniumBase/tree/master/help_docs&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  file_upload_test.py
&lt;/h2&gt;

&lt;p&gt;To run this example - copy the following into a file called &lt;code&gt;file_upload_test.py&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;seleniumbase&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseCase&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;time&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt;  &lt;span class="n"&gt;time&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;remove&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyTestClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseCase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_basic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# setup testdata to be uploaded
&lt;/span&gt;
        &lt;span class="c1"&gt;# time based filename generated for this run only
&lt;/span&gt;        &lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;".txt"&lt;/span&gt;

        &lt;span class="c1"&gt;# path with filename
&lt;/span&gt;        &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"E:&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;dev&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;file_upload_test&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;

        &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;"w+"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"This is line %d&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="c1"&gt;# SelinumBase test
&lt;/span&gt;        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"https://the-internet.herokuapp.com/upload"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;send_keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'#file-upload'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;click&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'#file-submit'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;assert_exact_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'#uploaded-files'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Clean up testdata
&lt;/span&gt;        &lt;span class="n"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To run the test (again, PowerShell, same folder):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pytest .\file_upload_test.py --demo_mode
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Thank you
&lt;/h2&gt;

&lt;p&gt;This prototype example makes use of the HTML5 Uploader on the wonderful "The Internet" resource, by &lt;a href=""&gt;Dave Haeffner&lt;/a&gt;. A very helpful resource for helping to test out Selenium tests. Check it out: &lt;a href="https://the-internet.herokuapp.com"&gt;https://the-internet.herokuapp.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The test data creation example is based on a Guru99 article: &lt;a href="https://www.guru99.com/reading-and-writing-files-in-python.html"&gt;Python File Handling: Create, Open, Append, Read, Write&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cover Photo "Python Book" by &lt;a href="https://www.pexels.com/@divinetechygirl"&gt;Christina Morillo&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>selenium</category>
      <category>testing</category>
      <category>automation</category>
    </item>
    <item>
      <title>Works on my machine</title>
      <dc:creator>Ben Dowen</dc:creator>
      <pubDate>Fri, 19 Jul 2019 16:22:45 +0000</pubDate>
      <link>https://dev.to/dowenb/works-on-my-machine-17eb</link>
      <guid>https://dev.to/dowenb/works-on-my-machine-17eb</guid>
      <description>&lt;p&gt;Originally posted on my blog:&lt;br&gt;
&lt;a href="https://www.dowen.me.uk/it-works-on-my-machine/"&gt;https://www.dowen.me.uk/it-works-on-my-machine/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, you just found this great bug and it's returned "cannot reproduce", or you have been told "it works on my machine", classic right?&lt;/p&gt;

&lt;p&gt;As a tester, in this situation, it can be easy to get defensive. Am I being told I am making it up? Am I being disrespected, why should I raise bugs if they are not important enough to fix?&lt;/p&gt;

&lt;p&gt;My suggestion, turn this on its head and consider this for a moment. Time to get technical! What details can be added to help identify the root cause of the issue? Can you do more investigation and help understand what is different between the environment you tested on, and the one the developer tried to reproduce it in?&lt;/p&gt;

&lt;p&gt;Ways you could add value in response to "it works on my machine" in include:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Identifying the exact build or deployment you observed the issue on, and check is this the same build the developer is checking against? Can you check the build they are using, maybe the issue is already fixed, but you haven't been given the latest code?&lt;/li&gt;
&lt;li&gt;Identify what platform are you both using. If it's web, make sure to check not only the Browser but the version of that browser. If it's mobile, what version of Android or iOS is installed?&lt;/li&gt;
&lt;li&gt;Is there any additional logging you can get to help add context? If you can find an exception being thrown that is captured in a log, this can go a long way towards helping identify the issue.&lt;/li&gt;
&lt;li&gt;If you can continue to reproduce the issue, can you give the developer access to your machine or environment? If you are remote, can you set up a screen sharing session? At a minimum, it should be easy enough to capture a video of the steps. for this, I use Open Broadcast Software Studio &lt;a href="https://obsproject.com/download"&gt;https://obsproject.com/download&lt;/a&gt;, but many alternatives exist.&lt;/li&gt;
&lt;li&gt;If any of these have helped get to the root of the problem and get the bug fixes, try and use them more often in your usual bug reports, and see if you can reduce your "Works on my machine" count.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I hope my thoughts on this are useful, I am really interested to know if you agree, disagree, or even better have additional hints and tips! if you do, please let me know on twitter: &lt;a href="https://twitter.com/dowenb"&gt;https://twitter.com/dowenb&lt;/a&gt;&lt;/p&gt;

</description>
      <category>testing</category>
      <category>beginners</category>
      <category>debug</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Two simple tests you should be using with Postman</title>
      <dc:creator>Ben Dowen</dc:creator>
      <pubDate>Fri, 12 Apr 2019 14:02:21 +0000</pubDate>
      <link>https://dev.to/dowenb/two-simple-tests-you-should-be-using-with-postman-53hj</link>
      <guid>https://dev.to/dowenb/two-simple-tests-you-should-be-using-with-postman-53hj</guid>
      <description>&lt;h2&gt;
  
  
  Add some tests
&lt;/h2&gt;

&lt;p&gt;Postman is a fantastic part of your testing toolbox. I've recently had cause to use it to help track down a performance issue.&lt;br&gt;
One thing I found pretty quickly, is that reading a wall of "PASS" results in the test runner, and trying to pick out slow responses is painful.&lt;/p&gt;

&lt;p&gt;So how do you get a bit more out of Postman, without investing time writing detailed tests? Simple, use the built-in examples!&lt;/p&gt;

&lt;h2&gt;
  
  
  Capture the request you want to test
&lt;/h2&gt;

&lt;p&gt;First you need to capture the request you want to test. If you don't already know what this is, you can capture it pretty easily.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fuwwuj3o7pt0nbgqe31uf.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fuwwuj3o7pt0nbgqe31uf.PNG" alt="Copy request as cURL Bash from Chrome"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Load Dev tools in a browser such as Chrome, visit the page you want to test, identify the network request and right-click copy request (cURL Bash).&lt;/p&gt;

&lt;p&gt;Now use the "Import" option in Postman, and import as "Raw text", past in the copied request.&lt;br&gt;
&lt;a href="https://media.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%2Fkomqfpu7n77uga7w2i30.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fkomqfpu7n77uga7w2i30.PNG" alt="Import request as raw text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tip: Note if your request is authenticated, this will only work while your bearer token is valid.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open the "Tests" tab
&lt;/h2&gt;

&lt;p&gt;Open the "Tests" tab on your request, this is where you will see, on the right, a list of built-in examples.&lt;br&gt;
&lt;a href="https://media.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%2Fm0vty089mbensq7zjq88.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fm0vty089mbensq7zjq88.PNG" alt="Postman Tests tab"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Check HTTP status code
&lt;/h2&gt;

&lt;p&gt;At a very minimum, you should have an idea what return code your expecting. If you expect the request to be successful, your probably looking for "200" OK.&lt;/p&gt;

&lt;p&gt;For other HTTP codes see: &lt;a href="//http.cat"&gt;HTTP Status Cats&lt;/a&gt; or &lt;a href="https://httpstatusdogs.com" rel="noopener noreferrer"&gt;HTTP Status Dogs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhttp.cat%2F200" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhttp.cat%2F200" alt="HTTP Cats 200 OK Status"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;pm.test("Status code is 200", function () {&lt;br&gt;
    pm.response.to.have.status(200);&lt;br&gt;
});&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Check Response time
&lt;/h2&gt;

&lt;p&gt;And here is the fun bit, setting an expected response time. This is another built-in example, make good use of it!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fl9nz19krxjiwrlqkxobn.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fl9nz19krxjiwrlqkxobn.jpg" alt="Speed"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;pm.test("Response time is less than 200ms", function () {&lt;br&gt;
    pm.expect(pm.response.responseTime).to.be.below(200);&lt;br&gt;
});&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Use the Collection Runner to run it lots of times
&lt;/h2&gt;

&lt;p&gt;Now if you want to check running the request many times - save the request to a "Collection" and use the Test Runner to run it lots of times!&lt;/p&gt;

&lt;p&gt;For extra danger, try injecting faults or creating a "worse case scenario" while the test is running to see how your service responses to fault conditions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Learn more
&lt;/h2&gt;

&lt;p&gt;I learned a lot of what I know about Postman from the excellent free course by &lt;a href="https://twitter.com/ambertests" rel="noopener noreferrer"&gt;Amber Race&lt;/a&gt; on the &lt;a href="https://testautomationu.applitools.com" rel="noopener noreferrer"&gt;Test Automation University&lt;/a&gt;: &lt;a href="https://testautomationu.applitools.com/exploring-service-apis-through-test-automation/" rel="noopener noreferrer"&gt;Exploring Service APIs through Test Automation&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>automation</category>
      <category>rest</category>
      <category>webdev</category>
    </item>
    <item>
      <title>What do you do, when you are stuck?</title>
      <dc:creator>Ben Dowen</dc:creator>
      <pubDate>Thu, 28 Mar 2019 15:05:07 +0000</pubDate>
      <link>https://dev.to/dowenb/what-do-you-do-when-you-are-stuck-1e4n</link>
      <guid>https://dev.to/dowenb/what-do-you-do-when-you-are-stuck-1e4n</guid>
      <description>&lt;p&gt;I've been struggling with bug I've been trying to investigate now for over 24 hours. At this point, I need a break, so much so I'm considering going to the Gym, if you know me, you will know that is extreme.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fuf0vb64w22wnstcgzxgs.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fuf0vb64w22wnstcgzxgs.jpg" alt="Gym Workout"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This leads me to my semi-serious question, what do you do when you get stuck?&lt;/p&gt;

&lt;p&gt;If I get stuck for a short amount of time on something, I make a cup of tea. Maybe watch a few minutes of a show on Netflix and let my mind wonder.&lt;/p&gt;

&lt;p&gt;But now I'm stuck for a little longer - what should I do? Of course part of the answer is ask for help, and I am. But I'm thinking more about tactics other people use to break down problems I might be missing.&lt;/p&gt;

&lt;p&gt;Your input is most welcome! Please comment below.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>watercooler</category>
      <category>problem</category>
      <category>stuck</category>
    </item>
    <item>
      <title>Show off your Test Automation Skills!</title>
      <dc:creator>Ben Dowen</dc:creator>
      <pubDate>Wed, 20 Mar 2019 09:09:53 +0000</pubDate>
      <link>https://dev.to/dowenb/show-off-your-test-automation-skills-3j6i</link>
      <guid>https://dev.to/dowenb/show-off-your-test-automation-skills-3j6i</guid>
      <description>&lt;p&gt;I recently posted about the Test Automation University:&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/dowenb" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F135303%2F1788f453-894a-4b8a-9aec-a49556ecd332.jpg" alt="dowenb"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/dowenb/path-to-test-automation-success-587p" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Path to Test Automation Success&lt;/h2&gt;
      &lt;h3&gt;Ben Dowen ・ Mar 6 '19&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#testing&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#automation&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#learning&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#qa&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;They have just introduced a shiny new feature, where you get a "Certificate" for completing a course, that can easily be shared on Twitter, LinkedIn or put on your CV!&lt;/p&gt;

&lt;p&gt;They have also introduced a few new courses since my last post, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://testautomationu.applitools.com/introduction-to-testng/" rel="noopener noreferrer"&gt;Introduction to TestNG&lt;/a&gt; with Rex Jones II&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://testautomationu.applitools.com/automating-your-api-tests-with-rest-assured/" rel="noopener noreferrer"&gt;Automating your API tests with REST Assured&lt;/a&gt; with Bas Dijkstra&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have already completed a course, you can &lt;br&gt;
&lt;a href="https://testautomationu.applitools.com/certificate" rel="noopener noreferrer"&gt;find your certificate here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For example, here is one of mine:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fbtbi6hjkryb13n5opyvq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fbtbi6hjkryb13n5opyvq.png" alt="Ben's Certificate"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Got any other, creative ways, to show off your learning and skills? Maybe you have a great technique for building a portfolio, or you do all your learning in open GitHub repos so you can show perspective employers?&lt;/p&gt;

&lt;p&gt;Let me know! I'm looking for new ways to record and show off my learning - while also opening myself up so others can more easily critique my work and give me feedback. Discuss in comments.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>automation</category>
      <category>career</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Testing IS for Beginners</title>
      <dc:creator>Ben Dowen</dc:creator>
      <pubDate>Thu, 14 Mar 2019 17:16:14 +0000</pubDate>
      <link>https://dev.to/dowenb/testing-is-for-beginners-44da</link>
      <guid>https://dev.to/dowenb/testing-is-for-beginners-44da</guid>
      <description>&lt;p&gt;Jon Calhoun recently posted a very detailed explanation of why "Testing is Not for Beginners"&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/joncalhoun" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2747%2F8b5d21ec-b87c-40fc-ada2-5d239a8b1fd0.jpg" alt="joncalhoun"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/joncalhoun/when-nil-isnt-equal-to-nil-5bbh" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Testing is Not for Beginners&lt;/h2&gt;
      &lt;h3&gt;Jon Calhoun ・ Mar 13 '19&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#go&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#beginners&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#testing&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;I can relate and agree to much of the content, but reject the main premise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Health warning
&lt;/h2&gt;

&lt;p&gt;I am writing this to express myself and understand for myself why I think test analysis skills are important to developers. If you find I am waffling on, feel free to move on! honestly, I won't judge or be offended.&lt;/p&gt;

&lt;p&gt;Also I probably have lot's more to say on the topic I haven't managed to get down yet - so I may even make further posts. Deal with it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bias of a professional tester
&lt;/h2&gt;

&lt;p&gt;First of all, please know that I am biased. I have been working professionally as a Tester, and not a Dev since 2012. For longer then that I have been an armature developer, but I have never done it professionally.&lt;/p&gt;

&lt;h2&gt;
  
  
  I reject your reality, and replace it with my own
&lt;/h2&gt;

&lt;p&gt;I honestly believe learning some of the skills of a Test Analyst can make even a new Dev a &lt;em&gt;better&lt;/em&gt; Dev. But how?&lt;/p&gt;

&lt;p&gt;OK so I hope you will agree with me that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Finding bugs early saves time and sanity&lt;/li&gt;
&lt;li&gt;Bugs in Design or Requirements can be very expensive&lt;/li&gt;
&lt;li&gt;Learning from failure is good and important, besides when does it ever work first time?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Where I totally agree whit Jon, if you try and learn how assertions and unit tests work on day 1, before you learn concepts and syntax, you're going to fail. In that context, "Testing is NOT for beginners", sure.&lt;/p&gt;

&lt;h2&gt;
  
  
  But how can Test Analysis help with any of this?
&lt;/h2&gt;

&lt;p&gt;Fundamentally Test Analysis is not about writing tests. It is about learning, exploring and asking questions.&lt;/p&gt;

&lt;p&gt;What kind of questions? I won't cover that again in detail, as I already made a post about that.&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/dowenb" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F135303%2F1788f453-894a-4b8a-9aec-a49556ecd332.jpg" alt="dowenb"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/dowenb/questions-you-should-be-asking-before-you-test-a-new-feature-ea9" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Questions you should be asking before you test a new feature&lt;/h2&gt;
      &lt;h3&gt;Ben Dowen ・ Mar 12 '19&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#testing&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#testanalysis&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#qa&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#beginners&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;My premise here is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The more you understand about the problem you're intending to solve (Requirement) the easier it is to break it down into smaller problems and solve them&lt;/li&gt;
&lt;li&gt;Thinking time invested early is time well spent and should save you time later&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  But what about spikes and prototyping and LEARNING how to develop?
&lt;/h2&gt;

&lt;p&gt;Of course, this doesn't mean you shouldn't being experimenting and learning! To be clear when I talk about a New Dev, I really don't mean some day 0 of your journey. &lt;br&gt;
Anyway this is still part of exploring and exploring is important!&lt;/p&gt;

&lt;p&gt;When you get to the point when you're starting a job, or contributing to open source projects you're no longer doing so on your own. This is where it starts to become more relevant to think beyond the code.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you know you are done / it's working?
&lt;/h2&gt;

&lt;p&gt;There is no need to use formal TDD or BDD while you are doing early learning. Instead spending time to undetand what functionality is important to get working, even for a demo or learning project, is useful.&lt;/p&gt;

&lt;p&gt;It's useful because it helps you be done. It's useful because it helps you break things down into smaller problems.&lt;/p&gt;

&lt;p&gt;Also it will be even more useful when you're working in a team, because you may only be responsable for a part of the functionality. And you will need to understand where "your bit" ends and some one else begins.&lt;/p&gt;

&lt;p&gt;It can be useful to express some of this in some form of Test Case, or expected behaviour, so you can exercise your code and see if it does what you expect, or if you need to keep going!&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "working" code isn't enough
&lt;/h2&gt;

&lt;p&gt;Guess what - once you get as far as a job as a Developer, or as a Tester in part of an Agile team. Working code isn't good enough.&lt;/p&gt;

&lt;p&gt;You have to remember the context for why code is being written in the first place. And usually this will be to solve a &lt;em&gt;Business need&lt;/em&gt; of some kind, assuming your intending to make money (or make some one else money). Or at very least your solving a problem.&lt;/p&gt;

&lt;p&gt;Often the problem being solved is part of a bussiness process that could be solved without technology at all, or historically relied on analogue equipment. Think shop till and paper ledgers, mail order to modern e-commerce.&lt;/p&gt;

&lt;p&gt;This is where applying some of the fundamental analysis skills from testing come in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Remember to ask "Why?" - a lot. If you understand the problem you can identify better solutions&lt;/li&gt;
&lt;li&gt;If your lucky enough to have direct access to your customer/client, maintain a dialogue. Try and "Speak the same language", and this won't be code. But it might be models, mind maps, UML, Flow Diagrams, white boards, conversations. If your really unlucky it will be written statements&lt;/li&gt;
&lt;li&gt;Remember or working on a solution to a problem, and not making software for the sake of it&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Enough already! let me get coding
&lt;/h2&gt;

&lt;p&gt;OK, I'm done. I genuinely hope this was useful for you, but honest I mostly wrote it to be able to express my opinion.&lt;/p&gt;

&lt;p&gt;Do make your own opinions and experience known, comment, write your own post, share. I am interested to learn from you so feel free to let me know!&lt;/p&gt;

</description>
      <category>testing</category>
      <category>beginners</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
