{
  "version": 3,
  "sources": ["ssg:https://framerusercontent.com/modules/APl7ZimmVbadQq9oVYNr/lL15AhBLT9iP5g45xGOa/qfddknsE_-2.js"],
  "sourcesContent": ["import{jsx as e,jsxs as t}from\"react/jsx-runtime\";import{ComponentPresetsConsumer as n,Link as o}from\"framer\";import{motion as a}from\"framer-motion\";import*as i from\"react\";import{Youtube as s}from\"https://framerusercontent.com/modules/NEd4VmDdsxM3StIUbddO/1de6WpgIbCrKkRcPfQcW/YouTube.js\";import r from\"https://framerusercontent.com/modules/pVk4QsoHxASnVtUBp6jr/QVzZltTawVJTjmjAWG3C/CodeBlock.js\";export const richText=/*#__PURE__*/t(i.Fragment,{children:[/*#__PURE__*/e(\"div\",{className:\"framer-text-module\",style:{\"--aspect-ratio\":\"560 / 315\",aspectRatio:\"560 / 315\",height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:NEd4VmDdsxM3StIUbddO/1de6WpgIbCrKkRcPfQcW/YouTube.js:Youtube\",children:t=>/*#__PURE__*/e(s,{...t,play:\"Off\",shouldMute:!0,thumbnail:\"Medium Quality\",url:\"https://youtu.be/g3gy4QHPGqc\"})})}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"Why do we even need to worry about this?\"})}),/*#__PURE__*/e(\"p\",{children:\"Many of the world's largest economies have seen stunted growth for the last few years, and shareholders want profits. Companies that are struggling are looking to shred staffing costs, and the ones that aren't still want to maximize profits.\"}),/*#__PURE__*/e(\"p\",{children:\"This brings me to number 1 on this list...\"}),/*#__PURE__*/e(\"h2\",{children:/*#__PURE__*/e(\"strong\",{children:\"1 - Understand the company you work for!\"})}),/*#__PURE__*/e(\"p\",{children:\"Is your employer struggling? Are layoffs being announced? Has your employer brought in policies typically correlated with encouraging employees to look elsewhere? Things like pay rise freezes or reducing remote working.\"}),/*#__PURE__*/e(\"p\",{children:\"Understanding your company will give you a vital heads-up and tell you if the company is interested in innovation. If you see innovation in other departments, then you know there's an appetite to increase efficiency. Suggest a way to increase output and/or decrease costs. Not only will this show your initiative, but if done right, it will nicely position you as this project's lead.\"}),/*#__PURE__*/e(\"h2\",{children:/*#__PURE__*/e(\"strong\",{children:\"2 - Be the person who cares\"})}),/*#__PURE__*/e(\"p\",{children:\"I've been in many engineering meetings across many companies. The funny thing is you see slightly different versions of the same people. There are the people who talk a good game but have never seen one of their tickets reach the done column, there's the work culture hippy, but most annoyingly, there's the person disguising laziness as pragmatism, basically suggesting not doing anything is the quickest and safest option.\"}),/*#__PURE__*/e(\"p\",{children:\"If you're lucky, there are a few people who genuinely care. If you're watching or reading this, this is you. But that doesn't mean others will see you this way. To be a \\\"person who cares,\\\" you must regularly speak up and champion quality.\"}),/*#__PURE__*/e(\"h3\",{children:/*#__PURE__*/e(\"strong\",{children:\"3 - Rock solid regression\"})}),/*#__PURE__*/e(\"p\",{children:\"One day, I will do a whole video on the problems of in-sprint testing, but for now, let me just say I'm aware of the stresses and struggles many exploratory and automation testers face as you get closer to the end of sprint.\"}),/*#__PURE__*/e(\"p\",{children:'On the one hand, you give items the time they need, but you\\'re now the \"QA bottleneck.\" On the other hand, you keep the tickets flowing, but quality may suffer.'}),/*#__PURE__*/e(\"p\",{children:\"Whether in automation or exploratory testing, an automated CI/CD regression pack is your best friend. If it fails, great. You can push that ticket back and have more time on another ticket.\"}),/*#__PURE__*/e(\"p\",{children:'If it passes, great. Now you know the ticket hasn\\'t broken anything \"old\" so you can get on with testing the new stuff.'}),/*#__PURE__*/e(\"h2\",{children:/*#__PURE__*/e(\"strong\",{children:\"4 - Share your reports!\"})}),/*#__PURE__*/e(\"p\",{children:\"This is such a simple but almost entirely overlooked area. What is the output of a developer? Well, we can look at tickets and see which features they developed.\"}),/*#__PURE__*/e(\"p\",{children:\"What's the output of a QA? \\\"Better quality\\\", it's not something you can see. In fact, I'd argue you can't see \\\"quality\\\"; you can only notice the lack of it.\"}),/*#__PURE__*/e(\"p\",{children:\"In the same way, you wouldn't think a table in a showroom is clean, but you would notice if it's dirty. It's the same in software engineering; people are far more aware of the defects that slipped through the net than everything you caught.\"}),/*#__PURE__*/e(\"p\",{children:\"Get in the habit of sharing your reports; again, this doesn't matter if you're exploratory or automation; share something. Your reports should be available to everyone at all times, but you should give a written and verbal summary once a sprint. Keep it short, but remind people what QA is doing and remind the company of what they'll be exposed to without you.\"}),/*#__PURE__*/e(\"h2\",{children:/*#__PURE__*/e(\"strong\",{children:\"5 - Stop holding yourself back\"})}),/*#__PURE__*/e(\"p\",{children:\"AI, off-shoring, and other tools are just ways to give companies what they want. Staff are expensive, and companies would like to magically get all of the benefits of their staff, plus a bunch of new ones, and they'd really like it all for less.\"}),/*#__PURE__*/e(\"p\",{children:\"You might have your own goals; maybe you're on a journey to becoming a developer. Maybe you like current ways of working and pace? These are fine, but this means your goals don't align with your employers.\"}),/*#__PURE__*/e(\"p\",{children:\"If they want faster, better, cheaper, give it to them!\"}),/*#__PURE__*/e(\"p\",{children:\"It'll be much better for you if you're in the discussions. Investigate AI tools; maybe they'll work for you, perhaps they won't, but you can provide a write-up on the pros and cons. What about codeless tooling, like DoesQA, with a proven track record of empowering good testers to do so much more while reducing runner costs? - Ok, that's the plug over.\"}),/*#__PURE__*/e(\"h2\",{children:/*#__PURE__*/e(\"strong\",{children:\"In Conclusion\"})}),/*#__PURE__*/e(\"p\",{children:\"We hate hearing that the QA teams have been off-shored, but it all starts to make sense when we find out why.\"}),/*#__PURE__*/e(\"p\",{children:\"The company wanted to save money and saw no innovation in the QA team for years.\"}),/*#__PURE__*/e(\"p\",{children:\"The QA staff had already felt distant from the engineering team and were a bottleneck each sprint.\"}),/*#__PURE__*/e(\"p\",{children:'There was nothing tangible proving the QA team\\'s value, and \"magic AI tool\" or \"off-shore\" sounded like a silver bullet.'})]});export const richText1=/*#__PURE__*/t(i.Fragment,{children:[/*#__PURE__*/e(\"p\",{children:\"I was recently chatting about good QA practices and noticed I quoted a seemingly unrelated book.\"}),/*#__PURE__*/e(\"p\",{children:\"The book was Jonathan Haidt's The Anxious Generation. You might be surprised if you've read it. If you haven't read it, consider checking it out. The broad strokes of the book cover themes of mental health, technology, play, and responsibility affecting today's young.\"}),/*#__PURE__*/e(\"p\",{children:\"You might ask, \\\"What does this have to do with good QA practices?\\\". Well, not much on the face of it. But after noticing that I'd referenced it twice, I've realized how useful some of the terms in the book are. I'll cover just one in here: bruises, not scars.\"}),/*#__PURE__*/e(\"p\",{children:'The book introduced me to \"bruises, not scars\". The idea - with children - is that you\\'re not trying to avoid all injuries, just the larger ones that would cause more significant damage or leave a permanent mark. In fact, the smaller ones, the bruises, help children learn to be more careful and become more responsible. These skills, in turn, also help to avoid scars.'}),/*#__PURE__*/e(\"p\",{children:'Bringing this back to quality assurance, we use the \"Breath before depth\" mantra when taking on new consultancy work. For our clients, this means they\\'ll get wide coverage with a light touch very quickly before going deeper on areas identified as most worthy. This is different from the common AC or in-sprint approach, where the items in play (regardless of their overall priority) get automation tests.'}),/*#__PURE__*/e(\"p\",{children:\"The in-sprint approach means you're trying to avoid minor bruises while leaving yourself open to several inches of stitches.\"}),/*#__PURE__*/e(\"p\",{children:\"We should stop being fearful of bruises. Bruises are ok; sometimes, they can even be good. They may highlight gaps in your processes, which could lead to scars and force us to become more responsible. But most importantly, the goal of protecting against all bruises is exceptionally expensive.\"}),/*#__PURE__*/e(\"p\",{children:\"Of course, we want the highest quality standard possible, but time costs must be balanced with potential adverse effects. I have seen teams automating an accordion showcasing the comprising materials of a product. This is fine until you understand there wasn't a single test covering email delivery or function. Nor were very common purchasing options covered.\"}),/*#__PURE__*/e(\"p\",{children:\"The engineering team gets a valuable lesson if a defect is discovered with the new accordion. They might find the developers and UAT both missed something; maybe this has been overlooked before, and adding a default AC to a template is a good idea that could avoid more bruises and even scars in the future.\"}),/*#__PURE__*/e(\"p\",{children:\"It's hard to imagine a \\\"higher-up\\\" losing their cool over something like this, but it's even harder to imagine them being consoled by the knowledge of the accordion tests when payments or emails go down.\"}),/*#__PURE__*/e(\"p\",{children:'Test automation has a bit of bad taste to many \"higher-ups\" we talk to. We hear automation is too slow, too expensive, and frankly, a waste of time. We hear companies have unit tests, integration tests, contract tests, component tests, API tests, and everything else...'}),/*#__PURE__*/e(\"p\",{children:\"... but they don't have any confidence.\"}),/*#__PURE__*/e(\"p\",{children:\"It's common by the point we're talking to them that they have already invested hundreds of thousands into migrating into Cypress from something that wasn't working now hear, \\\"Cypress has limitations, we should migrate to Playwright\\\".\"}),/*#__PURE__*/e(\"p\",{children:\"Please take this away; you must factor in your stakeholders, your \\\"higher-ups\\\", and how they see test automation. If you protect them against 20 bruises, they won't have a clue; if they end up getting minor bruises from a lack of coverage, they probably won't even notice it. But you must have good coverage in critical business areas and protect them (and, by extension, yourself) from scars!\"}),/*#__PURE__*/e(\"p\",{children:\"If it helps, share this in your next retro and start a conversation on how best to increase confidence by focusing on what matters.\"}),/*#__PURE__*/e(\"p\",{children:\"Reach out if you would like assistance adding critical coverage asap. We can help with short-term solutions while you build your capabilities or as a migration.\"})]});export const richText2=/*#__PURE__*/t(i.Fragment,{children:[/*#__PURE__*/t(\"p\",{children:[\"Since the global pandemic swept the globe a few years ago, one area that has yet to recover (and continues to decline) is the \",/*#__PURE__*/e(\"strong\",{children:\"quality of shipped software\"}),\".\\xa0\"]}),/*#__PURE__*/e(\"h2\",{children:\"The Problem\"}),/*#__PURE__*/e(\"p\",{children:\"There has been a severe decline in the amount of testing performed per release as companies scramble to make up the losses of the pandemic. However, something interesting is that many e-commerce companies did very well during this time. As people could not leave their homes, they took their impulse purchases online.\"}),/*#__PURE__*/e(\"p\",{children:\"This led to a development boom. Many new features and changes to existing functionality started flowing through the pipes. But then something interesting happened - quality started to slip. I don\u2019t mean the age-old joke that deadlines tighten, so QA is shrunk into a comically small amount of time. I mean, the quality of the quality (?!) took a massive hit.\"}),/*#__PURE__*/e(\"p\",{children:\"With remote working becoming the norm, office conversations disappeared. Developers and Testers no longer spoke with each other as much as they used to. The context was no longer a shared team involvement but just an \u201Cif you fancy it\u201D option.\\xa0\"}),/*#__PURE__*/e(\"h3\",{children:\"Join the standup, if you want.\"}),/*#__PURE__*/e(\"p\",{children:\"This extended to meetings, where the team could usually air issues or concerns or celebrate new ideas. With the dissolution of these ceremonies, teams became segmented, isolated, and disconnected from each other.\"}),/*#__PURE__*/e(\"p\",{children:\"I have seen teams now wholly missing the refinement and planning meetings; instead, all of the tickets are JFDI, or a more safe-for-work acronym of JDI (Just Do It). Developers were picking up work with ropey-at-best requirements, not involving the test team members, smashing some keys to get the \u201Cfeature\u201D done, and then throwing it over the fence.\\xa0\"}),/*#__PURE__*/e(\"p\",{children:\"This lack of requirements trickles down to the testing, where light-touch checks are performed, and then the code is \u201Cpromoted\u201D to the real testers, the users.\"}),/*#__PURE__*/e(\"h3\",{children:\"More time writing code, less time testing.\"}),/*#__PURE__*/e(\"p\",{children:\"Now that the testers had more time, they turned to anti-value addition. That may seem harsh, but it's true. Instead of working out ways to improve quality, this extra time was consumed entirely with learning coding.\\xa0\"}),/*#__PURE__*/e(\"p\",{children:\"This was then a self-fuelling spiral that made more \u201Cbusy work\u201D\u2014time taken out of a working day performing tasks to enable one to achieve one's original goal. However, the value output and quality improvement were nowhere to be found.\\xa0\"}),/*#__PURE__*/e(\"p\",{children:\"We now have teams running 100ds of tests, mixing UI and API testing, and modifying the application under test to work for them all while missing the critical journeys the users are taking.\"}),/*#__PURE__*/e(\"h3\",{children:\"Struggling to attribute issues to functionality\"}),/*#__PURE__*/e(\"p\",{children:\"When something goes wrong in production, fewer and fewer can be easily attributed to a particular feature/ticket or release.\\xa0\"}),/*#__PURE__*/e(\"p\",{children:\"These items are now raised as Production Defects found by users or business stakeholders who have seen a report raising a red flag.\\xa0\"}),/*#__PURE__*/t(\"p\",{children:[\"No joke, I have seen e-commerce companies push code to production relating to payments, resulting in failed orders and \",/*#__PURE__*/e(\"strong\",{children:\"double refunding\"}),\" the users?!?! How, on this green earth, did an issue like this get to prod?\\xa0\"]}),/*#__PURE__*/e(\"p\",{children:\"It's simple: The payment server was mocked, the integrated version was not tested due to \u201Climitations\u201D or time constraints, and the lower packs resulted in all-green results. This oversight led to a P1 / P0 critical issue being found by both users and the business.\\xa0\"}),/*#__PURE__*/e(\"h3\",{children:\"Once bitten, twice shy.\"}),/*#__PURE__*/e(\"p\",{children:\"This problem has a catastrophic effect on the test team's goal, causing confidence in the testing to suffer. This leads to more \u201Chuman interaction testing\u201D time allocated to checking new releases, which impacts the cycle time of features.\"}),/*#__PURE__*/e(\"p\",{children:\"Teams then look to \u201Cfix\u201D the testing but are entirely missing the initial objective that they set out to do. Instead, the \u201Csunk cost\u201D fallacy kicks in, and you invest even more time and effort (money, in other words) in getting some levels of confidence back.\\xa0\"}),/*#__PURE__*/e(\"p\",{children:\"While you will undoubtedly get back to some levels, at what cost? From the initial standpoint of gaining confidence before going live, this could potentially have been months or even years.\"}),/*#__PURE__*/e(\"h2\",{children:\"A Solution\"}),/*#__PURE__*/e(\"p\",{children:\"There are many different approaches to resolving some of the issues I mentioned earlier. Let\u2019s examine them one by one.\"}),/*#__PURE__*/e(\"h3\",{children:\"Hey, have you got a minute?\"}),/*#__PURE__*/e(\"p\",{children:\"If I had a penny for every time I have sent or received this. But, joking aside, talking through features with developers and product folk can massively increase the chance of good-quality software on the other side.\\xa0\"}),/*#__PURE__*/e(\"p\",{children:\"Communication is vital and promotes those brain juices to start flowing. Have you considered this? I wonder what will happen if you\u2026 All good bug hunts first begin with a cheeky chat with the developer who may have introduced them.\"}),/*#__PURE__*/e(\"h3\",{children:\"Nope, this ticket needs to be refined more!\"}),/*#__PURE__*/e(\"p\",{children:\"Don\u2019t be scared to reject testing something that is not refined, even if it has already been developed. Do the product and engineering teams have to collaborate to get the story to a point where you, as a quality lover, can deterministically and categorically approve or reject a creature as ready?\"}),/*#__PURE__*/e(\"p\",{children:\"Certain things can assist, such as a good Definition of Ready and Definition of Done, but those principles only work if you hold people accountable for following them. Shout out if a ticket does not look ready. Bounce a ticket out of QA if you have yet to have a handover.\"}),/*#__PURE__*/e(\"p\",{children:\"Soon enough, the team will start to realize that if you put sh*t in one end, you don\u2019t get a polished product out the other end. Start refining and talking, and boom, good things happen!\"}),/*#__PURE__*/e(\"h3\",{children:\"Write some code, but first, write some tests.\"}),/*#__PURE__*/e(\"p\",{children:\"Now I get it: writing code can be fun and enjoyable, and it's personal development.\\xa0\"}),/*#__PURE__*/t(\"p\",{children:[\"But you must satisfy the business reason for your role\u2019s existence\u2014some tests. Why not create \",/*#__PURE__*/e(o,{href:{pathVariables:{tcfKQ1IoL:\"6-hour-production-automation-test-pack\"},unresolvedPathSlugs:{tcfKQ1IoL:{collectionId:\"qfddknsE_\",collectionItemId:\"yX8X3zTcN\"}},webPageId:\"nbTUTx03b\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!0,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"a six-hour production test pack\"})}),\"?\"]}),/*#__PURE__*/e(\"p\",{children:\"Pick tooling that gives you high-level confidence over the critical user journeys. The freedom this opens will allow you to focus on shifting these value additions earlier in the development cycle, also known as Shift-Left testing.\"}),/*#__PURE__*/t(\"p\",{children:[\"Another vital part is testing the site as a user would have interacted with it. \",/*#__PURE__*/e(o,{href:{webPageId:\"SJTSS0x_8\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!0,scopeId:\"contentManagement\",smoothScroll:!0,children:/*#__PURE__*/e(a.a,{children:\"Filling out MFA\"})}),\" codes? \",/*#__PURE__*/e(o,{href:{webPageId:\"SJTSS0x_8\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!0,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Reading Emails\"})}),\"? All these steps should be tested and done on production first, then updated to work cross-environment later.\"]}),/*#__PURE__*/e(\"h3\",{children:\"Continuously Improve, all the time.\"}),/*#__PURE__*/e(\"p\",{children:\"Now you have your \u201CGolden Threads\u201D covered, you will need to ensure these are kept up to date and any new priorities added quickly.\"}),/*#__PURE__*/e(\"p\",{children:\"We all make mistakes; we let things slide. If the business deems something critical, add it to the pack. This way, you can deliver confidence that what has been repaired will not regress again.\"}),/*#__PURE__*/e(\"h2\",{children:\"In Conclusion, make some changes.\"}),/*#__PURE__*/e(\"p\",{children:\"The market is heading into disaster; confidence is at an all-time low, and companies burned by the wasted money decide the risk is easier to swallow than blown budgets.\\xa0\"}),/*#__PURE__*/e(\"p\",{children:\"Use tooling and frameworks that allow you to have baseline confidence, then add to that. Nobody will shout at you for finding defects earlier in the process, but they will do it if you spend all your time coding while allowing critical defects to fly out the door.\\xa0\"}),/*#__PURE__*/e(\"p\",{children:\"If you enjoyed this article, look at some of our other posts. In them, we do not wrap the situation in cotton wool but instead help expose and, therefore, understand and resolve issues.\\xa0\"}),/*#__PURE__*/e(\"p\",{children:\"The first step to fixing anything is to identify that it is broken.\\xa0\"}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(o,{href:{webPageId:\"uUIXIRiDL\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Catch you on the flip side!\"})})})]});export const richText3=/*#__PURE__*/t(i.Fragment,{children:[/*#__PURE__*/e(\"p\",{children:\"There has been lots in the news recently about a global outage caused by a simple defect in an automatic update. This grounded flights, caused healthcare chaos, and less importantly, but still impactful, stopped thousands of engineering teams from doing any work.\"}),/*#__PURE__*/e(\"h2\",{children:\"Machines have outages, \u201Cthe cloud\u201D is always online.\"}),/*#__PURE__*/e(\"p\",{children:\"In the event of a computer malfunction, what can you do? Are you able to pick up another laptop and carry on? Or are you stuck with changes that you had not pushed, or with configuration files that you cannot recover easily?\"}),/*#__PURE__*/e(\"p\",{children:\"In the constantly evolving world of cloud computing, the key benefit of being able to access systems from anywhere has become such an important part of why so many companies are transitioning.\\xa0\"}),/*#__PURE__*/e(\"p\",{children:\"Servers running in a room of the office are becoming a thing of the past, where you can spin up a new one in a few moments in the cloud, quicker than waiting for support teams to scramble to your location to assist. Additionally, in the unlikely (but still happened recently) event of a more globally spread issue, it will take even longer for support to assist, leaving you powerless to change anything.\"}),/*#__PURE__*/e(\"p\",{children:\"Far fewer online-enabled tooling providers had any issues, or if they did, the outage was contained and dealt with faster than those with on-prem equipment.\"}),/*#__PURE__*/e(\"h2\",{children:\"Adding a QA layer can multiply confidence.\"}),/*#__PURE__*/e(\"p\",{children:\"Say you had a CI/CD server running all your tests in the office. What happens if this is impacted by the same issues? You are now stuck, unable to run your checks, and the company is no longer able to deliver on any functionality or fixes.\\xa0\"}),/*#__PURE__*/e(\"p\",{children:\"If you had some of your confidence enabled online, you are able to still assert and verify that things are working, even if it is at a degraded rate.\\xa0\"}),/*#__PURE__*/e(\"p\",{children:\"Running tests in the cloud has become common practice, and more recently, become best practice. Repeatable, scalable test solutions are difficult to handle internally, leading to large amounts of time and consideration going on keeping the lights on, not delivering value.\\xa0\"}),/*#__PURE__*/e(\"h2\",{children:\"Let someone else have a sleepless night.\"}),/*#__PURE__*/e(\"p\",{children:\"If online tooling goes down, you can raise a support ticket, and track its progress. It's not your problem, it\u2019s theirs.\"}),/*#__PURE__*/e(\"p\",{children:\"As a tooling vendor, we have made many areas of the application stack failure-tolerant. By this I mean we use Application Performance Monitoring (APM) services alongside anomaly detection to ensure we are aware as soon as something happens.\\xa0\"}),/*#__PURE__*/e(\"p\",{children:\"We then have invested heavily in disaster recovery, multi-region support and regular backups. This allows us to react to a large event like this recent one, whilst minimising the impact to our users.\\xa0\"}),/*#__PURE__*/e(\"p\",{children:\"It\u2019s probably worth mentioning here, without sounding like we are bragging, but during all that chaos, we had not a single second of outage. Not a single service went offline, and no customer was affected. Sure, alerts were going off, but all of the processes and procedures that we had spent months building all fell into place. The stress was on us, not our customers.\"}),/*#__PURE__*/e(\"h2\",{children:\"So, what do I do?\"}),/*#__PURE__*/e(\"p\",{children:\"It's great to have local running capabilities. But if you want to ensure that your testing is able to handle issues like the recent ones, consider placing some of your checks on cloud-enabled tools like DoesQA.\\xa0\"}),/*#__PURE__*/e(\"p\",{children:\"I am not advocating dropping all your hard work, but how much easier would the conversation be if you were like \u201CHey, we cannot run anything here, but I can grab any laptop and still run a large amount of tests online\u201D.\"}),/*#__PURE__*/e(\"p\",{children:\"Used together with what you already have, online-enabled testing can drastically reduce stress, and allow you to deliver value from anywhere, anytime.\"}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(o,{href:{webPageId:\"uUIXIRiDL\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Until next time!\"})})})]});export const richText4=/*#__PURE__*/t(i.Fragment,{children:[/*#__PURE__*/e(\"p\",{children:\"Now, now, which one to choose. So many people have different reasons for choosing to automate their testing. Faster feedback? Dependency reduction? More coverage?\"}),/*#__PURE__*/e(\"p\",{children:\"All are valid, but there is one key rule to starting any test\u2026\"}),/*#__PURE__*/e(\"h2\",{children:\"Test Determinism\"}),/*#__PURE__*/e(\"p\",{children:\"A test case should be repeatable. There is an age-old example of how this can be done badly.\\xa0\"}),/*#__PURE__*/e(\"h2\",{children:\"Reset Password Journey\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Given\"}),\" I am a registered user\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"And\"}),\" I am able to log in with my current credentials\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"When\"}),\" I update my password\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Then\"}),\" I should be able to log in with my updated credentials\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"And\"}),\" my old credentials should no longer work\"]})})]}),/*#__PURE__*/e(\"p\",{children:\"Automating the above scenario sounds pretty straightforward. However, some people take different approaches to this.\\xa0\"}),/*#__PURE__*/e(\"p\",{children:\"If your mind goes to \u201CCool, I have a user registered already, so will log in with those\u201D - you have already fallen into a trap!\"}),/*#__PURE__*/e(\"h3\",{children:\"What Trap?\"}),/*#__PURE__*/e(\"p\",{children:\"You are walking straight into a trap. What happens if:\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"The test fails on the \u201CThen I should be able to log in with my updated credentials\u201D step?\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"I run 2 of these tests at the same time?\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"The user is deleted\"})})]}),/*#__PURE__*/t(\"p\",{children:[\"In order for you to have a known state - You have to ensure that you \",/*#__PURE__*/e(\"strong\",{children:\"set up\"}),\" and \",/*#__PURE__*/e(\"strong\",{children:\"tear down\"}),\" your state.\\xa0\"]}),/*#__PURE__*/e(\"h3\",{children:\"Setting up your state\"}),/*#__PURE__*/e(\"p\",{children:\"In this example - would be to either:\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Create a new user at the start / before running the test\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Update the users password to a known state prior to starting the test (although good password storage principles would inhibit this)\"})})]}),/*#__PURE__*/e(\"h3\",{children:\"Tearing down / Cleaning up\"}),/*#__PURE__*/e(\"p\",{children:\"Not that this is a requirement, but it is always nice to leave the place how you found it!\"}),/*#__PURE__*/e(\"p\",{children:\"Once your test is complete (regardless of pass or fail), either:\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Delete the newly created user\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Reset the password back (same issues as setup apply)\"})})]}),/*#__PURE__*/e(\"h2\",{children:\"Teaching you to suck eggs.\"}),/*#__PURE__*/e(\"p\",{children:\"Now you might be saying, \u201CSam, why are you saying something so obvious\u201D - and you would be justified to do so. But this principle, or rule, can apply to a multitude of different situations.\\xa0\"}),/*#__PURE__*/e(\"p\",{children:\"Such as:\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/t(\"li\",{\"data-preset-tag\":\"p\",children:[/*#__PURE__*/e(\"p\",{children:\"Placing an order on an e-commerce website, and validating an email is received\"}),/*#__PURE__*/e(\"ul\",{children:/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"If you use the same email address each time, how do you know it\u2019s failed?\"})})})]}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Buying a product without first adding / setting stock can lead to inconsistent results\"})})]}),/*#__PURE__*/e(\"p\",{children:\"So although this may seem silly to mention, take a look over your tests and see if you find anywhere that you are missing this rule. Take a look, and then you can silently thank me, all whilst making your quality that bit better!\"}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(o,{href:{webPageId:\"uUIXIRiDL\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Until next time!\"})})})]});export const richText5=/*#__PURE__*/t(i.Fragment,{children:[/*#__PURE__*/e(\"h2\",{children:\"The Quality Sandwich\"}),/*#__PURE__*/e(\"p\",{children:\"This article may sound like the \u201CBest BLT Recipe\u201D. It\u2019s not \u2014 But I assure you, it's just as tasty!\"}),/*#__PURE__*/e(\"p\",{children:\"Many Quality teams worldwide face a similar problem: tests clash when running at any level of concurrency simultaneously. \"}),/*#__PURE__*/e(\"p\",{children:\"The solution to this problem, while it appears complex, is actually really simple. Following easy steps, you can ensure that no matter the test case you are designing, you can be safe knowing that it will run at Unlimited* concurrency.\"}),/*#__PURE__*/e(\"p\",{children:\"Why the asterisk, Sam? I hear you ask. Well, some environmental factors can impact your ability. Continue forward and see if you have any of these or if you can find a solution to said issues. \"}),/*#__PURE__*/e(\"p\",{children:\"Now, let's move on to the ingredients for great automation testing at scale. \"}),/*#__PURE__*/e(\"h3\",{children:\"Your outer layer - Test Setup\"}),/*#__PURE__*/t(\"p\",{children:[\"In this \u201Cbread\u201D layer, you \",/*#__PURE__*/e(o,{href:{webPageId:\"EdfBLQPDw\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"set up everything needed for the test execution\"})}),\" to be able to run without requiring exterior help. Need some products to add to a bag? Find them here, and then pass them onward in a known format for your tests to consume.\"]}),/*#__PURE__*/e(\"h3\",{children:\"The filling - Test Execution\"}),/*#__PURE__*/e(\"p\",{children:\"With the correct test data/setup configured, your execution steps should now use that and run whichever test they are meant to. Use the data provided and create tests that are dynamic enough not to be tied down to a particular environment or data set. \"}),/*#__PURE__*/e(\"p\",{children:\"You now have something that can run on production, all the way down the stacks onto a local development machine.\"}),/*#__PURE__*/e(\"h3\",{children:\"The final layer - Test Teardown\"}),/*#__PURE__*/e(\"p\",{children:\"With the test complete, regardless of the outcome, you should clean up anything you can to reset the application's state. While having completely fresh data every time is preferable, some integrations or functionality might hinder this. Clean up your mess so the next run can have a fresh start. \"}),/*#__PURE__*/e(\"p\",{children:\"If executed correctly, you will end up with a quality sandwich. Now that you have been introduced to this concept, you might think that you are in a strange position. \"}),/*#__PURE__*/e(\"h3\",{children:\"Meat Bread Meat. \"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"103\",src:\"https://framerusercontent.com/images/JEzFC1uRn8Si3qVTUs8ehirAg4.gif\",style:{aspectRatio:\"498 / 206\"},width:\"249\"}),/*#__PURE__*/e(\"p\",{children:\"If your functional test code calls out to APIs or other areas to get/set information mid-test, you risk the tests being too tied to a particular data shape or value. If the API schema is updated for whatever reason, you are left with a failing test, but the issue is not what the test was designed to check; it is failing on data. \"}),/*#__PURE__*/e(\"p\",{children:\"Like a sandwich in the real world, this works but is not the ideal format. Because it's nested so deep inside functional/test code, you end up losing the structure and compromising the confidence in the data.\"}),/*#__PURE__*/t(\"p\",{children:[\"Additionally, when \",/*#__PURE__*/e(o,{href:{webPageId:\"SJTSS0x_8\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"running tests with concurrency\"})}),\", you may end up with race conditions, whereby one test relies on one state and another differently. \"]}),/*#__PURE__*/e(\"p\",{children:\"Setting up what you need in the functional filling layer outside allows you to control this with hooks such as Before Each or Before All, and similarly with the teardown, After Each or After All.\"}),/*#__PURE__*/e(\"p\",{children:\"Your framework may not have these steps or hooks, but it's easy enough for you to add them yourself; before calling the test script, run another file, and after execution is complete, run the teardown functions. \"}),/*#__PURE__*/e(\"p\",{children:\"After reading this, you may feel like a refactor is in order, but trust me, once you do, you will notice an immediate and massive difference in the agility of your automated tests.\"}),/*#__PURE__*/e(\"p\",{children:\" \"}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"br\",{className:\"trailing-break\"})})]});export const richText6=/*#__PURE__*/t(i.Fragment,{children:[/*#__PURE__*/t(\"p\",{children:[\"I see a variant of this question asked weekly in the \",/*#__PURE__*/e(o,{href:\"https://www.reddit.com/r/QualityAssurance/\",motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!0,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"r/QualityAssurance\"})}),\" subreddit and figured it would be helpful if I summarised the pros and cons I've read for each of Selenium, \",/*#__PURE__*/e(o,{href:{webPageId:\"vq3WkzT5Q\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Cypress, and Playwright\"})}),\".\"]}),/*#__PURE__*/t(\"p\",{children:[\"For the sake of this comparison, we will make some general assumptions. We'll consider website/web app testing only. We'll also assume the company has no existing test pack, test automation skills, or knowledge of a specific framework. And we'll also assume you're not interested in a \",/*#__PURE__*/e(o,{href:{webPageId:\"vq3WkzT5Q\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Test Automation IDE\"})}),\" or \",/*#__PURE__*/e(o,{href:{webPageId:\"zDArIeeYU\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Codeless or Low-code Test Automation\"})}),\".\"]}),/*#__PURE__*/e(\"p\",{children:\"The goal of this post is not to tell you what test automation framework is best for your specific requirements but to provide a good, generalized starting point for your own specialized evaluation.\"}),/*#__PURE__*/e(\"p\",{children:\"Let's begin...\"}),/*#__PURE__*/e(\"h2\",{children:\"Selenium\"}),/*#__PURE__*/e(\"img\",{alt:'u/TheNudelz wrote \"Selenium is the one that will always get you a job.\"',className:\"framer-image\",height:\"200\",src:\"https://framerusercontent.com/images/4Mev7MzKZ0fvX2hz3kazkbJM.webp\",srcSet:\"https://framerusercontent.com/images/4Mev7MzKZ0fvX2hz3kazkbJM.webp?scale-down-to=512 512w,https://framerusercontent.com/images/4Mev7MzKZ0fvX2hz3kazkbJM.webp?scale-down-to=1024 1024w,https://framerusercontent.com/images/4Mev7MzKZ0fvX2hz3kazkbJM.webp 1200w\",style:{aspectRatio:\"1200 / 400\"},width:\"600\"}),/*#__PURE__*/t(\"p\",{children:[\"Users (of \",/*#__PURE__*/e(o,{href:\"https://www.reddit.com/r/QualityAssurance/\",motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!0,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"r/QualityAssurance\"})}),\") will often mention that Selenium is slower to learn and run and somewhat limited compared to newer frameworks.\"]}),/*#__PURE__*/e(\"p\",{children:\"Selenium is slowly\\xa0being replaced\\xa0in the industry, but it still has massive usage, many champions, and is far from dead. When users ask what they should learn (as opposed to what they should use), Selenium is spoken about more positively. Selenium knowledge is considered a great foundation and is still in demand in the current market.\"}),/*#__PURE__*/e(\"p\",{children:\"When people say Selenium (without specifying a different language), they\\xa0are typically referring\\xa0to the Java variant.\\xa0This\\xa0is mainly due to adoption\\xa0but also because Selenium Java is faster to run and has much better documentation and support.\\xa0This\\xa0makes Selenium unique on this list as the other frameworks share their default language of JavaScript.\"}),/*#__PURE__*/e(\"h2\",{children:\"Cypress\"}),/*#__PURE__*/e(\"img\",{alt:'u/squiddygamer wrote \"I am using Cypress fine\"',className:\"framer-image\",height:\"200\",src:\"https://framerusercontent.com/images/Z5mNPosMsRbxpueGIBlI07qRk4.webp\",srcSet:\"https://framerusercontent.com/images/Z5mNPosMsRbxpueGIBlI07qRk4.webp?scale-down-to=512 512w,https://framerusercontent.com/images/Z5mNPosMsRbxpueGIBlI07qRk4.webp?scale-down-to=1024 1024w,https://framerusercontent.com/images/Z5mNPosMsRbxpueGIBlI07qRk4.webp 1200w\",style:{aspectRatio:\"1200 / 400\"},width:\"600\"}),/*#__PURE__*/e(\"p\",{children:\"Many consider Cypress the easiest to learn and likely the fastest to create tests\\xa0in. Several fundamental issues force users to learn specific workarounds or discover essential test requirements that are blocked later in building complex test packs.\"}),/*#__PURE__*/t(\"p\",{children:[\"Many thought Cypress was a\\xa0great\\xa0advancement in \",/*#__PURE__*/e(o,{href:{webPageId:\"zDArIeeYU\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Test Automation\"})}),\" years ago, and because of this, it saw explosive adoption in the industry. In more recent years, however, Cypress has plateaued and even started to decline.\"]}),/*#__PURE__*/e(\"h2\",{children:\"Playwright\"}),/*#__PURE__*/e(\"img\",{alt:'u/Littl_Sun wrote \"Playwright without any doubt.\"',className:\"framer-image\",height:\"200\",src:\"https://framerusercontent.com/images/7u39oQl9H0kOPf8JMJ8KRWwFY.webp\",srcSet:\"https://framerusercontent.com/images/7u39oQl9H0kOPf8JMJ8KRWwFY.webp?scale-down-to=512 512w,https://framerusercontent.com/images/7u39oQl9H0kOPf8JMJ8KRWwFY.webp?scale-down-to=1024 1024w,https://framerusercontent.com/images/7u39oQl9H0kOPf8JMJ8KRWwFY.webp 1200w\",style:{aspectRatio:\"1200 / 400\"},width:\"600\"}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(o,{href:{webPageId:\"vq3WkzT5Q\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Playwright\"})}),\"\\xa0is spoken\\xa0about very fondly. Although it might not be considered, at large, quite as fast to learn or write tests in as Cypress, it would be a very close second. Playwright also benefits from being less opinionated, resulting in cleaner, more standard code.\"]}),/*#__PURE__*/e(\"p\",{children:\"Whereas Selenium and Cypress are waning in popularity, Playwright is rapidly growing in adoption. Unlike the others, I struggled to find any clearly negative user feedback for Playwright.\"}),/*#__PURE__*/t(\"p\",{children:['Whenever the question\\xa0is framed\\xa0as \"What should I use to test?\" ',/*#__PURE__*/e(o,{href:{webPageId:\"vq3WkzT5Q\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Playwright\"})}),\" is the community's winner by majority vote.\\xa0But\\xa0when a user asks what they should learn before looking for their first automation role, confidence drops. Current adoption is a crucial factor;\\xa0there are just more roles\\xa0calling for Selenium and Cypress experience.\"]}),/*#__PURE__*/t(\"p\",{children:[\"Another factor is that because Playwright is\\xa0cleaner,\\xa0and requires less framework-specific knowledge, it's easier for people with non-test-specific coding experience to pivot into \",/*#__PURE__*/e(o,{href:{webPageId:\"zDArIeeYU\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Test Automation\"})}),'. This results in more viable candidates for each scarce role. This potentially results in Playwright Automation Test positions earning less and being\\xa0harder\\xa0to acquire.\\xa0But, as much as this sounded reasonable enough for inclusion here, this is\\xa0highly\\xa0likely to vary with time and across regions. I also\\xa0just\\xa0didn\\'t want this to become a \"just pick Playwright\" post.']}),/*#__PURE__*/e(\"h2\",{children:\"Conclusion:\\xa0just\\xa0pick Playwright!\"}),/*#__PURE__*/t(\"p\",{children:[\"With specific use cases set aside where one of the others would excel for a distinct reason, Playwright is the best Test Automation \",/*#__PURE__*/e(\"strong\",{children:\"code framework\"}),\" currently available.\"]}),/*#__PURE__*/t(\"p\",{children:[\"Any issues you face with Playwright would\\xa0likely\\xa0be universal to all coded test automation frameworks, such as remote runner costs/reliability and a lack of persistent services for things like \",/*#__PURE__*/e(o,{href:{webPageId:\"SJTSS0x_8\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"generating MFA tokens\"})}),\", interacting with and \",/*#__PURE__*/e(o,{href:{webPageId:\"SJTSS0x_8\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"asserting on emails\"})}),\", \",/*#__PURE__*/e(o,{href:{webPageId:\"SJTSS0x_8\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"etc\"})}),\".\\xa0However, as one of our\\xa0key\\xa0assumptions above was that \\\"you're not interested in a \",/*#__PURE__*/e(o,{href:{webPageId:\"zDArIeeYU\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Test Automation IDE\"})}),\" or \",/*#__PURE__*/e(o,{href:{webPageId:\"zDArIeeYU\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Codeless Test Automation\"})}),',\" we will rapidly move on. But if you wanted a ',/*#__PURE__*/e(o,{href:{webPageId:\"HGeE8fLXr\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Playwright vs. Cypress vs. DoesQA comparison\"})}),\", we have you covered.\"]}),/*#__PURE__*/e(\"h3\",{children:\"Already in a team and looking to create a test pack?\"}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(o,{href:{webPageId:\"vq3WkzT5Q\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:/*#__PURE__*/e(\"strong\",{children:\"Playwright\"})})}),/*#__PURE__*/e(\"strong\",{children:\"\\xa0is the best high-code option. \"}),/*#__PURE__*/e(o,{href:{webPageId:\"vq3WkzT5Q\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:/*#__PURE__*/e(\"strong\",{children:\"DoesQA\"})})}),/*#__PURE__*/e(\"strong\",{children:\" is the best low-code option.\"})]}),/*#__PURE__*/e(\"h3\",{children:\"Looking\\xa0to get your first Test Automation role?\"}),/*#__PURE__*/t(\"p\",{children:[\"This\\xa0is more tricky, I\\xa0echo the pragmatic sentiments of much of the \",/*#__PURE__*/e(o,{href:\"https://www.reddit.com/r/QualityAssurance/\",motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!0,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"r/QualityAssurance\"})}),\" community: look at the market around you and learn whatever will be the most lucrative...\\xa0and Playwright.\"]}),/*#__PURE__*/e(\"p\",{children:\"\u2014\u2014\u2014\"}),/*#__PURE__*/t(\"p\",{children:[\"Everyone should stay current with the available \",/*#__PURE__*/e(o,{href:{webPageId:\"zDArIeeYU\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"automation test tools\"})}),\" and frameworks growing in popularity.\"]}),/*#__PURE__*/t(\"p\",{children:[\"This\\xa0was a lot of fun to produce; I want to give a\\xa0huge\\xa0shout-out to the \",/*#__PURE__*/e(o,{href:\"https://www.reddit.com/r/QualityAssurance/\",motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!0,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"r/QualityAssurance\"})}),\" subreddit and the helpful commenters over there (but just the helpful ones =P).\"]})]});export const richText7=/*#__PURE__*/t(i.Fragment,{children:[/*#__PURE__*/e(\"p\",{children:\"Software\\xa0development teams can\\xa0be divided\\xa0into two camps: those who build Dark Mode early and those who choose to wait.\"}),/*#__PURE__*/e(\"p\",{children:\"Dark Mode looks sexy! It's visually appealing but with minimal actual benefit. So whenever a team spends time on it, they prioritize form over function. Furthermore, they marginally slow development and testing for all future features.\"}),/*#__PURE__*/e(\"h2\",{children:\"We chose to wait.\"}),/*#__PURE__*/e(\"p\",{children:\"We always planned to offer a Dark Mode but said it would remain at the bottom of the list. All user-requested and headline features will come first! Today, we're proud to say we've cleared that list.\"}),/*#__PURE__*/e(\"p\",{children:\"Let's just take a moment to look at just a few features that pushed Dark Mode down in just the last year:\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(o,{href:{webPageId:\"SJTSS0x_8\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:/*#__PURE__*/e(\"strong\",{children:\"Email Inbox\"})})}),\": fully testable complete with its own family of Nodes\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(o,{href:{webPageId:\"SJTSS0x_8\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:/*#__PURE__*/e(\"strong\",{children:\"MFA\"})})}),/*#__PURE__*/e(\"strong\",{children:\":\"}),\" Hold MFA Secrets in your account and generate authentic MFA tokens mid-test\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(o,{href:{webPageId:\"SJTSS0x_8\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:/*#__PURE__*/e(\"strong\",{children:\"Customizable failure states\"})})}),\": giving you more control\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(o,{href:{webPageId:\"SJTSS0x_8\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:/*#__PURE__*/e(\"strong\",{children:\"Adyen Payment Express Node\"})})}),\": to simplify your checkout tests\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(o,{href:{webPageId:\"SJTSS0x_8\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:/*#__PURE__*/e(\"strong\",{children:\"SFTP\"})})}),\": A collection of Nodes to Upload and check files & folders\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(o,{href:{webPageId:\"SJTSS0x_8\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:/*#__PURE__*/e(\"strong\",{children:\"Node Groups\"})})}),\": the power to build your\\xa0own\\xa0reusable functions\\xa0\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(o,{href:{webPageId:\"SJTSS0x_8\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:/*#__PURE__*/e(\"strong\",{children:\"Cross-browser\"})})}),\": adding Firefox, Edge, and countless simulated devices\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(o,{href:{webPageId:\"SJTSS0x_8\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:/*#__PURE__*/e(\"strong\",{children:\"File generation\"})})}),\": generate CSV, PDFs, PNGs (and more) to test file uploading\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(o,{href:{webPageId:\"SJTSS0x_8\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:/*#__PURE__*/e(\"strong\",{children:\"Slack integration\"})})}),\": including Automation-to-Manual handover\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(o,{href:{webPageId:\"SJTSS0x_8\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:/*#__PURE__*/e(\"strong\",{children:\"Lighthouse\"})})}),/*#__PURE__*/e(\"strong\",{children:\" & \"}),/*#__PURE__*/e(o,{href:{webPageId:\"SJTSS0x_8\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:/*#__PURE__*/e(\"strong\",{children:\"Pa11y Audits\"})})}),\": to improve user experience and prove compliance\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(o,{href:{webPageId:\"SJTSS0x_8\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:/*#__PURE__*/e(\"strong\",{children:\"Wait for\\xa0Text Change\"})})}),\":\\xa0because sometimes the element doesn't change; only the text does\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(o,{href:{webPageId:\"SJTSS0x_8\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:/*#__PURE__*/e(\"strong\",{children:\"Conditional Stop\"})})}),\": for advanced multi-environment test flows\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(o,{href:{webPageId:\"SJTSS0x_8\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:/*#__PURE__*/e(\"strong\",{children:\"Custom headers\"})})}),\": Inject custom headers, for the people who need it\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(o,{href:{webPageId:\"SJTSS0x_8\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:/*#__PURE__*/e(\"strong\",{children:\"Trigger Child Test\"})})}),\": Tests triggering other tests, with values passed over.\"]})})]}),/*#__PURE__*/e(\"p\",{children:\"Everything above, and honestly, so many more, are now done and battle-tested by our rapidly increasing user base. Moreover, Dark Mode became the most user-requested feature as we started the work, proving our alignment with customers.\"}),/*#__PURE__*/e(\"p\",{children:\"We strongly believe that this is the right way to develop software, and we would have been comfortable continuing to push Dark Mode for another year or more if needed. So, the fact I can now say...\"}),/*#__PURE__*/e(\"h2\",{children:'\"DARK MODE is HERE, and it is stunning!!!!!!!!\"'}),/*#__PURE__*/e(\"p\",{children:'...brings a tear to my eye! Not because \"Light Mode\" was burning my retinas but because this marks a new chapter for DoesQA.'}),/*#__PURE__*/t(\"p\",{children:[\"We will continue to prioritize function and push user-requested features to the very top of our roadmap, but when I look at people's accounts and see tests with hundreds of Nodes interacting with hard-to-test services like Microsoft Dynamics 365, Salesforce, Excel online, and custom CMSs, and hundreds of thousands of the highest quality tests I've seen in my career running every month and growing! I know we have done what we set out to do, \",/*#__PURE__*/e(\"strong\",{children:'\"enable the best testers to make the best\\xa0tests,\\xa0faster, cheaper\\xa0and\\xa0easier than anyone could have imagined\"'}),\".\"]}),/*#__PURE__*/e(\"p\",{children:\"To everyone who's created a feature request pushing Dark Mode down by a few days or weeks, sincerely, we thank you! You have\\xa0really\\xa0helped make DoesQA what it is today!\"}),/*#__PURE__*/e(\"p\",{children:\"And, to all the cypress and playwright fanboys, I have this to say...\\xa0You had Dark Mode from day one, but when are you getting MFA, a testable email inbox, live file generation, or branching test flows?! \uD83D\uDE1C\"})]});export const richText8=/*#__PURE__*/t(i.Fragment,{children:[/*#__PURE__*/e(\"p\",{children:\"Everyone builds their own single-use Test Framework just so the next employee or agency can park it and start over on their own single-use framework.\"}),/*#__PURE__*/t(\"p\",{children:[\"It's an endless cycle. Before \",/*#__PURE__*/e(o,{href:{webPageId:\"Owida8HbZ\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"DoesQA\"})}),\", its founders did this too. We would join a team and start realizing their test framework's issues and limitations. Often, the test results were so flaky that nobody (not even the framework's creators) would trust them. It'd be slow, \\\"scaling is an issue for another day\\\" we might hear. And it wouldn't be able to test at least one critical area of the site for some incredibly frustrating reason like \\\"checkout uses iframes, and we can't interact with iframes\\\" \u2014 pure madness.\"]}),/*#__PURE__*/t(\"p\",{children:['So, we started building \"',/*#__PURE__*/e(o,{href:{webPageId:\"Owida8HbZ\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"The Final Framework\"})}),'\". Fast-forward a couple of years and a few hundred thousand lines of code, and we have ',/*#__PURE__*/e(o,{href:{webPageId:\"Owida8HbZ\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"DoesQA\"})}),\".\"]}),/*#__PURE__*/t(\"p\",{children:[\"Excited, we started showing everyone we knew, from CTOs and Heads of Engineering to Manual and Automation Testers. Oh! \",/*#__PURE__*/e(\"strong\",{children:\"CTOs, Heads of Engineering, and manual testers love what we have created\"}),\". Automation Testers, on the other hand...\"]}),/*#__PURE__*/t(\"p\",{children:[\"What is the difference between these groups? CTOs, Heads of Engineering, and Manual Testers are all quality-focused. In contrast, most Automation Testers are really SDETs (Software Development Engineer in Test). They want to solve problems and enjoy coding the solution. This is the fun part. Don't take my word for it; I wrote\\xa0\",/*#__PURE__*/e(o,{href:\"https://www.reddit.com/r/QualityAssurance/comments/15rr3jf/a_letter_to_codeless_test_automation_sceptics/\",motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!0,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:/*#__PURE__*/e(\"strong\",{children:'A Letter to Codeless Test Automation \"Sceptics\"'})})}),\"\\xa0on the quality assurance subreddit and was told this.\"]}),/*#__PURE__*/e(\"img\",{alt:\"Here's the thing.  If a company has QA Automation engineers, guys and girls who know how to write decent code and can whip selenium or playwright or whatever into shape, chances are they like what they do. Writing code is the fun part. Manual testing, test cases, documentation, that's all fluff that gets in the way.  So when someone like yourself says, \\\"Hey, we've got a test tool that writes the code for you!\\\", those people, they don't get excited. They get upset. Because you're offering to take away the part of the job they like the most.\",className:\"framer-image\",height:\"348\",src:\"https://framerusercontent.com/images/K3KQBEh8RjlJ3dyw5rfHC2KFHaM.webp\",srcSet:\"https://framerusercontent.com/images/K3KQBEh8RjlJ3dyw5rfHC2KFHaM.webp?scale-down-to=512 512w,https://framerusercontent.com/images/K3KQBEh8RjlJ3dyw5rfHC2KFHaM.webp?scale-down-to=1024 1024w,https://framerusercontent.com/images/K3KQBEh8RjlJ3dyw5rfHC2KFHaM.webp 1778w\",style:{aspectRatio:\"1778 / 696\"},width:\"889\"}),/*#__PURE__*/t(\"p\",{children:[\"If the code is \\\"decent\\\", reliable, and can do everything the company wants, including visual regression, functional, and accessibility testing at scale and across multiple browsers; then there's really no issue. Assuming there's little to no difference between the \",/*#__PURE__*/e(o,{href:{webPageId:\"Owida8HbZ\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"cost of the codeless test automation tool\"})}),\" and the costs/time associated with developing everything in-house.\"]}),/*#__PURE__*/e(\"p\",{children:'Unfortunately, this commenter and many others, aren\\'t doing this calculation. Coding is fun, and the tasks associated with quality assurance are \"fluff that gets in the way\".'}),/*#__PURE__*/e(\"p\",{children:\"Worse, when others showed an interest, they would get downvoted!\"}),/*#__PURE__*/e(\"img\",{alt:'An \"interested\" user being downvoted',className:\"framer-image\",height:\"232\",src:\"https://framerusercontent.com/images/MUQLtOCT1Rk8sTwYIkA6tli7BH4.webp\",srcSet:\"https://framerusercontent.com/images/MUQLtOCT1Rk8sTwYIkA6tli7BH4.webp?scale-down-to=512 512w,https://framerusercontent.com/images/MUQLtOCT1Rk8sTwYIkA6tli7BH4.webp?scale-down-to=1024 1024w,https://framerusercontent.com/images/MUQLtOCT1Rk8sTwYIkA6tli7BH4.webp 1028w\",style:{aspectRatio:\"1028 / 464\"},width:\"514\"}),/*#__PURE__*/t(\"p\",{children:[\"The Reddit users of \",/*#__PURE__*/e(o,{href:\"https://www.reddit.com/r/QualityAssurance/\",motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!0,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"r/QualityAssurance\"})}),\" are right; Codeless Test Automation is not\\xa0\",/*#__PURE__*/e(\"strong\",{children:\"for\"}),\"\\xa0Automation Testers. It's\\xa0\",/*#__PURE__*/e(\"strong\",{children:\"for\"}),\"\\xa0Heads of Engineering who want fewer defects raised by end users, CTOs who want stability and confidence in the core business revenue streams, and manual testers who are stuck monotonously retesting the same steps on repeat because using automation is (apparently) only for people with coding skills.\"]}),/*#__PURE__*/t(\"p\",{children:[\"I wrote \",/*#__PURE__*/e(o,{href:\"https://www.reddit.com/r/QualityAssurance/comments/15rr3jf/a_letter_to_codeless_test_automation_sceptics/\",motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!0,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"that Reddit post\"})}),\" eight months ago. Since then, we've had more than one thousand companies switch to \",/*#__PURE__*/e(o,{href:{webPageId:\"Owida8HbZ\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"DoesQA\"})}),\" and almost a million tests have been run.\"]}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(o,{href:{webPageId:\"Owida8HbZ\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Codeless Test Automation\"})}),\" might be something some Automation Testers hate, but it's why companies love it and are switching!\"]})]});export const richText9=/*#__PURE__*/t(i.Fragment,{children:[/*#__PURE__*/e(\"p\",{children:\"Most modern tooling uses services such as Sentry or NewRelic to boost their observability in both production and in lower-down environments.\\xa0\"}),/*#__PURE__*/e(\"p\",{children:\"With the convergence of certain things, like browser render and JavaScript support, the requirement to test across different browsers and devices is no longer quite as essential as it once was.\"}),/*#__PURE__*/e(\"p\",{children:\"But real users, your customers, might be facing issues that you did not foresee, and without large amounts of effort/time/resources, you cannot capture everything. Plus, the issue might be non-browser-related, such as location, certain operating systems, edge-case user journeys, or different screen types.\"}),/*#__PURE__*/t(\"p\",{children:[\"You can observe though. If you have a high enough user throughput in your application, you will quickly be able to shape your \",/*#__PURE__*/e(\"strong\",{children:\"Golden Threads\"}),\" that users are doing and ensure that the top 90+% of your users will be unaffected by a change. These may be completely different from how the business imagined the tool would be used.\\xa0\"]}),/*#__PURE__*/t(\"p\",{children:[\"Here at \",/*#__PURE__*/e(o,{href:{webPageId:\"Owida8HbZ\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"DoesQA\"})}),\", we use the observability platforms to monitor everything, the runner health (CPU/Memory/Network), all of our event-driven architecture, and most importantly, the web app itself. We can trace and see exactly how our users are interacting with our tooling, and draw patterns and conclusions about how we should update something.\\xa0\"]}),/*#__PURE__*/e(\"p\",{children:\"Take this example that came up recently when one of our amazing users raised an issue. The user had a Touch for an Element before a Select node for the same Element. I looked through the data, observed the number of times this was done, and found this user was in the <1% (in fact, they were the first) to do this. It helped us understand the severity of the request, and act accordingly.\"}),/*#__PURE__*/e(\"p\",{children:'In the above example, the user reached out to us, but we were already on the case. Our alerting had notified us of an increase in the test case \"started\" to \"fail\" ratio for that account. We had already started looking into why and planning an update to protect against this edge case. It was a hidden superpower that allowed us to arm ourselves with a clear answer for them without having to ask for steps to reproduce or anything like that.\\xa0'}),/*#__PURE__*/e(\"p\",{children:\"We have 100% uptime on our production platform, something we are very proud of, and our runners are 100% reliable, and a large part of this is down to building in these layers of observability from the start. We can see issues happening lower down, without the need for additional testing, by leveraging these tools.\\xa0\"}),/*#__PURE__*/e(\"p\",{children:\"Involving your QA team in these tools will give them superpowers, let them focus their energy on making your application stable for your users, and help them push back on areas where the users are nowhere near.\\xa0\"}),/*#__PURE__*/e(\"p\",{children:\"Once you have confidence in these areas, your teams can focus on the polish around the outside.\\xa0\"}),/*#__PURE__*/e(\"p\",{children:\"We love our observability for many reasons, and you should start if you have not already!\"})]});export const richText10=/*#__PURE__*/t(i.Fragment,{children:[/*#__PURE__*/e(\"p\",{children:\"It does not matter what automation testing tool or framework you use. If you want to deliver a quality product to your users, you should also want to give a testable product to your testers.\"}),/*#__PURE__*/e(\"h2\",{children:\"IDs\"}),/*#__PURE__*/e(\"p\",{children:\"IDs are great; you probably use IDs for several things already. You might have anchor points through a page to give users a nice place to jump to. You might have them on your forms or the fields inside. You might use IDs for A/B testing your call to action or applying styling. This is the problem with IDs; there are too many purposes.\\xa0\"}),/*#__PURE__*/e(\"h2\",{children:\"Test IDs\"}),/*#__PURE__*/e(\"p\",{children:\"Adding Test IDs is the single best way to massively improve your testability, regardless of your automation test tool or framework.\"}),/*#__PURE__*/e(\"h2\",{children:\"What is a Test ID?\"}),/*#__PURE__*/t(\"p\",{children:[\"A Test ID is an HTML attribute (commonly \",/*#__PURE__*/e(\"code\",{children:\"data-test-id\"}),\" but there are \",/*#__PURE__*/e(o,{href:\"https://docs.does.qa/additional-items/elements#element-types\",motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!0,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"many aliases\"})}),\") added to core elements to speed up and simplify testing.\"]}),/*#__PURE__*/e(\"div\",{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/QVzZltTawVJTjmjAWG3C/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(r,{...t,code:'<button data-test-id=\"login-button\" type=\"submit\">Login</button>',language:\"JSX\"})})}),/*#__PURE__*/e(\"p\",{children:\"Test IDs can be added to any element, but if you're getting started, I would suggest the following:\"}),/*#__PURE__*/t(\"ul\",{style:{\"--framer-text-color\":\"rgb(14, 16, 26)\"},children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",style:{\"--framer-text-color\":\"rgb(14, 16, 26)\"},children:/*#__PURE__*/e(\"p\",{children:\"Buttons\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",style:{\"--framer-text-color\":\"rgb(14, 16, 26)\"},children:/*#__PURE__*/e(\"p\",{children:\"Links\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",style:{\"--framer-text-color\":\"rgb(14, 16, 26)\"},children:/*#__PURE__*/e(\"p\",{children:\"Forms & Inputs\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",style:{\"--framer-text-color\":\"rgb(14, 16, 26)\"},children:/*#__PURE__*/e(\"p\",{children:\"User Feedback (alerts, modals, form validation, loading spinners, etc.)\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",style:{\"--framer-text-color\":\"rgb(14, 16, 26)\"},children:/*#__PURE__*/e(\"p\",{children:\"Menus\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",style:{\"--framer-text-color\":\"rgb(14, 16, 26)\"},children:/*#__PURE__*/e(\"p\",{children:\"Lists\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",style:{\"--framer-text-color\":\"rgb(14, 16, 26)\"},children:/*#__PURE__*/e(\"p\",{children:\"Checkout Summaries\"})})]}),/*#__PURE__*/e(\"h2\",{children:\"How do Test IDs save engineering time?\"}),/*#__PURE__*/e(\"p\",{children:'Let\\'s say a developer adds a \"forgotten password\" button to a login form; the resulting code might look like this:'}),/*#__PURE__*/e(\"div\",{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/QVzZltTawVJTjmjAWG3C/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(r,{...t,code:'<form class=\"login\" action=\"/login\" method=\"post\">\\n  <h1 class=\"h3 mb-3 font-weight-normal\">Please Login</h1>\\n  <label for=\"inputEmail\" class=\"sr-only\">Email address</label>\\n  <input type=\"email\" id=\"inputEmail\" class=\"form-control mb-2\" placeholder=\"Email address\" required autofocus />\\n  <label for=\"inputPassword\" class=\"sr-only\">Password</label>\\n  <input type=\"password\" id=\"inputPassword\" class=\"form-control mb-2\" placeholder=\"Password\" required />\\n  <button class=\"btn btn-lg btn-primary btn-block\" type=\"submit\">Login</button>\\n  <p class=\"mt-5 mb-3 text-muted\">\\n    <a href=\"/forgotten-password\">Forgot password?</a>\\n  </p>\\n</form>',language:\"JSX\"})})}),/*#__PURE__*/e(\"p\",{children:\"An automation tester will look at this and have to create a selector. They might use a combination of tags and classes for the element and its parents. Nothing here is too tricky, but producing a unique selector on a large page often takes several minutes.\"}),/*#__PURE__*/e(\"p\",{children:\"Now let's look again with Test IDs added:\"}),/*#__PURE__*/e(\"div\",{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/QVzZltTawVJTjmjAWG3C/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(r,{...t,code:'<form data-test-id=\"login-form\" class=\"login\" action=\"/login\" method=\"post\">\\n  <h1 class=\"h3 mb-3 font-weight-normal\">Please Login</h1>\\n  <label for=\"inputEmail\" class=\"sr-only\">Email address</label>\\n  <input data-test-id=\"login-username\" type=\"email\" id=\"inputEmail\" class=\"form-control mb-2\" placeholder=\"Email address\" required autofocus />\\n  <label for=\"inputPassword\" class=\"sr-only\">Password</label>\\n  <input data-test-id=\"login-password\" type=\"password\" id=\"inputPassword\" class=\"form-control mb-2\" placeholder=\"Password\" required />\\n  <button data-test-id=\"login-button\" class=\"btn btn-lg btn-primary btn-block\" type=\"submit\">Login</button>\\n  <p class=\"mt-5 mb-3 text-muted\">\\n    <a data-test-id=\"login-forgotten-password\" href=\"/forgotten-password\">Forgot password?</a>\\n  </p>\\n</form>',language:\"JSX\"})})}),/*#__PURE__*/e(\"p\",{children:\"These Test IDs will only take a developer seconds to add and a tester seconds to use. So, this has already saved your engineering team, as a whole, several minutes per selector. But the real benefits are still to come.\"}),/*#__PURE__*/e(\"h2\",{children:\"How Test IDs improve test quality?\"}),/*#__PURE__*/e(\"p\",{children:\"The quality of the selector is far better; here's the above comparison as an example:\"}),/*#__PURE__*/e(\"div\",{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/QVzZltTawVJTjmjAWG3C/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(r,{...t,code:'[data-test-id=\"login-forgotten-password\"] // <-- Robust Test ID',language:\"JSX\"})})}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"em\",{children:\"Side Node: \"}),/*#__PURE__*/e(o,{href:{webPageId:\"Owida8HbZ\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:/*#__PURE__*/e(\"em\",{children:\"DoesQA\"})})}),/*#__PURE__*/e(\"em\",{children:\" has a specific \"}),/*#__PURE__*/e(o,{href:\"https://docs.does.qa/additional-items/elements#element-types\",motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!0,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:/*#__PURE__*/e(\"em\",{children:\"selector type for Test IDs\"})})}),\" \uD83D\uDE09\"]}),/*#__PURE__*/e(\"div\",{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/QVzZltTawVJTjmjAWG3C/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(r,{...t,code:\"form.login > p.text-muted > a // <-- Flaky CSS Selector\",language:\"JSX\"})})}),/*#__PURE__*/e(\"p\",{children:\"Both of the selectors above were unique at the time they were created. But whereas the Test ID should permanently be unique, the other will stop being unique if another link is added to the login form; here's an example:\"}),/*#__PURE__*/e(\"div\",{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/QVzZltTawVJTjmjAWG3C/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(r,{...t,code:'<form class=\"login\" action=\"/login\" method=\"post\">\\n  <h1 class=\"h3 mb-3 font-weight-normal\">Please Login</h1>\\n  <!-- ... -->\\n  <button class=\"btn btn-lg btn-primary btn-block\" type=\"submit\">Login</button>\\n  <p class=\"mt-5 mb-3 text-muted\">\\n    <a href=\"/forgotten-password\">Forgot password?</a>\\n    <a href=\"/register\">Create Account</a>\\n  </p>\\n</form>',language:\"JSX\"})})}),/*#__PURE__*/e(\"p\",{children:\"With the addition of a new link, previous tests will start failing. Revisiting this test to improve the selector is wasted time that could be used to expand test coverage elsewhere.\"}),/*#__PURE__*/e(\"h2\",{children:\"How Test IDs make testing more efficient?\"}),/*#__PURE__*/t(\"p\",{children:[\"We have already examined how Test IDs can save some time; with some imagination, we can extrapolate this to substantial efficiency gains in the long term. But there's a much more direct way to show that \",/*#__PURE__*/e(\"strong\",{children:\"Test IDs will bring massive time savings\"}),\".\"]}),/*#__PURE__*/t(\"p\",{children:[\"What happens when the login form gets a face-lift? As it's such an integral area of your service, you have hundreds of tests following through it. Your functional regression tests shouldn't care if your form inputs now look slightly different (that's the job of your \",/*#__PURE__*/e(o,{href:{webPageId:\"j8vkaNlXd\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Visual Regression tests\"})}),\").\"]}),/*#__PURE__*/e(\"p\",{children:\"The simple solution is that your existing Test IDs can be reused. While development is ongoing, you could even have the same test pack running on different environments, one with the new form and another with the old. Here's a new form reusing the Test IDs:\"}),/*#__PURE__*/e(\"div\",{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/QVzZltTawVJTjmjAWG3C/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(r,{...t,code:'<form data-test-id=\"login-form\" class=\"max-w-md mx-auto mt-8 bg-white shadow-md rounded px-8 pt-6 pb-8 mb-4\" action=\"/login\" method=\"post\">\\n  <div class=\"mb-4\">\\n    <label class=\"block text-gray-700 text-sm font-bold mb-2\" for=\"username\">Username</label>\\n    <input data-test-id=\"login-username\" class=\"shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline\" id=\"username\" type=\"text\" placeholder=\"Username\" required />\\n  </div>\\n  <div class=\"mb-6\">\\n    <label class=\"block text-gray-700 text-sm font-bold mb-2\" for=\"password\">Password</label>\\n    <input data-test-id=\"login-password\" class=\"shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 mb-3 leading-tight focus:outline-none focus:shadow-outline\" id=\"password\" type=\"password\" placeholder=\"Password\" required />\\n  </div>\\n  <div class=\"flex items-center justify-between\">\\n    <button data-test-id=\"login-button\" class=\"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline\" type=\"submit\">Sign In</button>\\n    <a data-test-id=\"login-forgotten-password\" class=\"inline-block align-baseline font-bold text-sm text-blue-500 hover:text-blue-800\" href=\"/forgotten-password\">Forgot Password?</a>\\n  </div>\\n</form>',language:\"JSX\"})})}),/*#__PURE__*/e(\"h3\",{children:\"More Testing, Less Coding\"}),/*#__PURE__*/e(\"p\",{children:\"Automation Testing is the overlapping area on a Vent Diagram between Coding and Testing. You want to save manual testing time by running high-quality automation tests with broad coverage, but traditionally, you've needed coders to write these tests while wanting them designed with a tester's mind.\"}),/*#__PURE__*/t(\"p\",{children:[\"Times are changing, and creating a \",/*#__PURE__*/e(o,{href:{webPageId:\"Owida8HbZ\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"high-quality test pack without code\"})}),\" is both possible and \",/*#__PURE__*/e(o,{href:{webPageId:\"HGeE8fLXr\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"desirable\"})}),\". However, building page objects/elements required \",/*#__PURE__*/e(o,{href:{pathVariables:{tcfKQ1IoL:\"manual-tester-guide-to-css-selectors-for-test-automation\"},unresolvedPathSlugs:{tcfKQ1IoL:{collectionId:\"qfddknsE_\",collectionItemId:\"daFVinFN9\"}},webPageId:\"nbTUTx03b\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"some knowledge of CSS\"})}),\" or XPath. \",/*#__PURE__*/e(\"strong\",{children:\"These coding skills are entirely unnecessary\"}),\" and result in slower and less reliable tests than using the Test IDs inserted by developers.\"]}),/*#__PURE__*/e(\"h3\",{children:\"Note to Devs\"}),/*#__PURE__*/t(\"p\",{children:[\"Howdy \uD83D\uDC4B, adding Test IDs to your department's code standards would be fantastic. This will add minimal time to your development work, and the automation test team will repay you with \",/*#__PURE__*/e(\"strong\",{children:\"faster feedback\"}),\", \",/*#__PURE__*/e(\"strong\",{children:\"broader test coverage\"}),\", and \",/*#__PURE__*/e(\"strong\",{children:\"generally high confidence in your work\"}),\".\"]}),/*#__PURE__*/e(\"p\",{children:\"Thank you,\"}),/*#__PURE__*/e(\"h3\",{children:\"What is the best way to get started using Test IDs?\"}),/*#__PURE__*/t(\"p\",{children:[\"While writing this, I added 97 Test IDs to the \",/*#__PURE__*/e(o,{href:{webPageId:\"Owida8HbZ\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"DoesQA\"})}),\" app by first adding the \",/*#__PURE__*/e(o,{href:\"https://github.com/davidcalhoun/eslint-plugin-test-selectors?tab=readme-ov-file#eslint-plugin-test-selectors\",motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!0,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Test Selectors ESLint Plugin\"})}),\", running the linting, and working through the warnings. It only took 20 minutes to do everything, and now I can change the rule from warnings to errors to ensure every new commit adheres to this rule as part of our in-house code standards.\"]}),/*#__PURE__*/e(\"p\",{children:\"I recommend this approach.\"})]});export const richText11=/*#__PURE__*/t(i.Fragment,{children:[/*#__PURE__*/e(\"p\",{children:\"This post is a continuation of a talk I did recently. It\u2019s meant to be thought-inducing, somewhat savage, and over-simplifying of certain areas. Buckle up, and read on!\"}),/*#__PURE__*/e(\"h2\",{children:/*#__PURE__*/e(\"strong\",{children:\"The 1000 buzzwords for \u201CSoftware Testing\u201D\"})}),/*#__PURE__*/t(\"p\",{children:[\"Over the years, as silos and scope has become more prominent, more and more names are being coined to describe a testing activity. Gone are the days when \u201CTesting\u201D was all-encompassing. You now have to define that you want Regression, Performance, Load, \",/*#__PURE__*/e(o,{href:{webPageId:\"NS4VXQ4sG\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Accessibility\"})}),\", \",/*#__PURE__*/e(o,{href:{webPageId:\"j8vkaNlXd\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Visual Regression\"})}),\", and Exploratory testing done on each item. These could fall into the lap of different people now, or even different companies altogether.\\xa0\"]}),/*#__PURE__*/t(\"p\",{children:[\"But it all boils down to a single word. \",/*#__PURE__*/e(\"strong\",{children:\"Confidence\"}),\". Without confidence, the activities have little to no value and all but real costs. But out of all of the buzzwords you can name, none directly mean code, or the requirement to write more code to achieve said Confidence. So here is the first question to ask yourself:\"]}),/*#__PURE__*/e(\"p\",{children:'\"Does Code Equal Confidence? Or are the activities that the code is performing providing Confidence?\"'}),/*#__PURE__*/e(\"p\",{children:\"Now, I will answer it for you.\"}),/*#__PURE__*/e(\"h2\",{children:/*#__PURE__*/e(\"strong\",{children:\"Code !== Confidence\"})}),/*#__PURE__*/t(\"p\",{children:[\"We already cover this somewhat in our \",/*#__PURE__*/e(o,{href:{pathVariables:{tcfKQ1IoL:\"all-new-code-is-shit\"},unresolvedPathSlugs:{tcfKQ1IoL:{collectionId:\"qfddknsE_\",collectionItemId:\"vxW8NXrs0\"}},webPageId:\"nbTUTx03b\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!0,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"All New Code is Shit\"})}),\" article, so I won't go over the covered ground here. With each line of custom - or copied - code, you have introduced the tightened risk of blame falling under that layer. If you are the one to write/incorporate it, you bear the ownership of it. With a new test failure, the layers of ownership have to be stepped through from the bottom up. Was it the script? The step code? The framework code? The runner code?\"]}),/*#__PURE__*/e(\"h2\",{children:/*#__PURE__*/e(\"strong\",{children:\"Coding !== Engineering\"})}),/*#__PURE__*/t(\"p\",{children:[\"Now, there are instances where custom creations are needed, edge cases that require a different approach to the vanilla way most tooling can cope with. Let's take an e-commerce website for example, if there is no decent REST or GraphQL API to source products, this is somewhere that your requirements as a tester, and your skills as an \",/*#__PURE__*/e(\"em\",{children:\"engineer\"}),\" come into play.\"]}),/*#__PURE__*/e(\"p\",{children:\"You can define, refine, and create something new, something you own and engineer into existence, which directly benefits the rest of the quality stacks.\"}),/*#__PURE__*/e(\"h2\",{children:/*#__PURE__*/e(\"strong\",{children:\"Test Code > Development Code\"})}),/*#__PURE__*/e(\"p\",{children:\"Developers, or Software Engineers are designing systems to allow the desired criterion to be met in as little 1st party code as possible. Some of the ways this is achieved is by:\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Using shared modules like npm packages\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Using created frameworks such as React or Angular\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Testing their work with tools like Jest\"})})]}),/*#__PURE__*/e(\"p\",{children:\"Their goal is to ship the most robust, but smallest, changes. So why do testers seem to be going to great lengths to do the literal opposite?\"}),/*#__PURE__*/e(\"p\",{children:\"Extending lightweight frameworks such as Cypress with heavy-weight \u201Chelpers\u201D, or muddying the lines between what a UI test should be doing (acting like the user) and other layers of testing.\\xa0\"}),/*#__PURE__*/t(\"p\",{children:[\"If testers took the same stance as the other engineers around them, they would be making use of the same toolsets to achieve that goal. \",/*#__PURE__*/e(\"br\",{}),/*#__PURE__*/e(\"br\",{}),\"Prompting common AI to output 100ds of lines of - now responsible - code doesn\u2019t seem to make a lot of sense. Maintenance, Security, Performance, and Computing all have costs, and for every curly brace and semi-colon you write, all of these go up.\\xa0\"]}),/*#__PURE__*/e(\"h2\",{children:/*#__PURE__*/e(\"strong\",{children:\"But Sam, I like to code!\"})}),/*#__PURE__*/e(\"p\",{children:\"So in conclusion, it's okay to be writing code, but it's also okay to leverage other people's code, which they are responsible for, to achieve a boost in productivity!\"}),/*#__PURE__*/t(\"p\",{children:[\"A great SDET / AQA / Quality Engineer (so many names) will be great at any area we have been over, but if they had to focus less on one, it means they can focus more on another. Do you fancy solving some of your problems, and making them ours? \",/*#__PURE__*/e(o,{href:{webPageId:\"l9knRz8Kt\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!0,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Try DoesQA today\"})}),\"!\"]})]});export const richText12=/*#__PURE__*/t(i.Fragment,{children:[/*#__PURE__*/e(\"p\",{children:\"100% of issues found by users happen on your production system. With the increasing rise of Shift-Left testing, we have seen the gap between testing and end-users widen into a chasm.\"}),/*#__PURE__*/e(\"p\",{children:\"I'm not going to argue against shift-left testing (today \uD83D\uDE1C), but instead, highlight the growing need for some testing on the right-hand side: an automated test pack running on production.\"}),/*#__PURE__*/e(\"p\",{children:\"Regardless of any other automated tests you have, a production test pack will bring you and your stakeholders peace of mind.\"}),/*#__PURE__*/t(\"p\",{children:[\"Let's list the requirements of our \",/*#__PURE__*/e(\"strong\",{children:\"Production Automation Test Pack\"}),\".\"]}),/*#__PURE__*/e(\"h2\",{children:\"Reports\"}),/*#__PURE__*/e(\"p\",{children:\"Let's start from the right and shift left \uD83D\uDE0A; we'll need reports. Ideally, we'll be able to receive an email or Slack notification if the pack ever fails. We'll want to view all the passing runs to help identify the route cause as fast as possible.\"}),/*#__PURE__*/e(\"h2\",{children:\"Runners\"}),/*#__PURE__*/e(\"p\",{children:\"We need to be able to run this test pack every couple of hours. Runners should be fast, reliable, and run in parallel. We'll want the results to be quick and trustworthy and not have one issue blocking us from discovering more.\"}),/*#__PURE__*/e(\"h2\",{children:\"Schedule\"}),/*#__PURE__*/e(\"p\",{children:\"We may want to avoid any extra site traffic during our busiest periods, and if we want our test to run every few hours, we will need a schedule.\"}),/*#__PURE__*/e(\"h2\",{children:\"CI/CD\"}),/*#__PURE__*/e(\"p\",{children:\"We want to kick this production test pack off immediately after a live/prod deployment. There's no point waiting for the schedule if we know something new could cause issues.\"}),/*#__PURE__*/e(\"h2\",{children:\"The Tests\"}),/*#__PURE__*/e(\"p\",{children:\"We need tests to run! Let's not worry about our 6-hour time restraint and figure out what we would want if we could.\"}),/*#__PURE__*/e(\"h3\",{children:\"\u2014 Functional Smoke Tests\"}),/*#__PURE__*/t(\"p\",{children:[\"We'll want to test site navigation, registration, login, and user account areas as a standard. If the site is e-commerce, we'll also want to create a few baskets of different products, like one-size items and gift cards, and check the checkout summaries and subtotals are all correct. We'll need to do calculations on dynamic values for this. We're not trying to create a \",/*#__PURE__*/e(o,{href:{pathVariables:{tcfKQ1IoL:\"6-key-parts-of-an-automated-regression-test-pack\"},unresolvedPathSlugs:{tcfKQ1IoL:{collectionId:\"qfddknsE_\",collectionItemId:\"cHIAKU232\"}},webPageId:\"nbTUTx03b\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"full regression pack\"})}),\" here, just a light smoke test (at least to start with).\"]}),/*#__PURE__*/e(\"h3\",{children:\"\u2014 Lighthouse Tests\"}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(o,{href:{webPageId:\"NS4VXQ4sG\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Accessibility\"})}),\" and Performance metrics can easily drift down if you don't monitor them. We'll want a way to set the lowest acceptable lighthouse scores for these, and ideally, SEO, to make sure we catch any slow regressions. Production is the best place for these metric tests.\"]}),/*#__PURE__*/e(\"h3\",{children:\"\u2014 Visual Regression\"}),/*#__PURE__*/t(\"p\",{children:[\"Certain pages and elements are not changed frequently, so \",/*#__PURE__*/e(o,{href:{webPageId:\"j8vkaNlXd\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Visual Regression\"})}),\" would be perfect for validating that everything is as expected. Visual Regression also adds a massive layer of protection from the dangers of functional-only testing (but that's for another day).\"]}),/*#__PURE__*/e(\"h2\",{children:\"Other factors to consider\"}),/*#__PURE__*/e(\"p\",{children:\"Our production system might have bot protections; we may be unable to test anything if we can't get through the production firewall. Luckily, there's always a path through, whether that's IP white-listing (we'll need static IPs), a cookie (which we'll need to be able to set), or custom headers (sounds complex, but isn't).\"}),/*#__PURE__*/e(\"h2\",{children:\"Why the 6-hour time restraint?\"}),/*#__PURE__*/e(\"p\",{children:\"Most people's work day is between 7 and 9 hours long, and given interruptions like meetings, the best you can hope for in a single day of actual work is about 6 hours. If you can make a task doable in a single day, it has a much higher chance of happening.\"}),/*#__PURE__*/e(\"p\",{children:\"A production test pack brings so many benefits, even a 6-hour one, that it's far better to have something today than plan for something larger in the future, which then never happens.\"}),/*#__PURE__*/e(\"h2\",{children:\"But is this possible in 6 hours?\"}),/*#__PURE__*/t(\"p\",{children:[\"Yes, 100% you can do all this and more in 6 hours using \",/*#__PURE__*/e(o,{href:{webPageId:\"Owida8HbZ\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"DoesQA\"})}),\". Everything above is available right out of the box; all you need to do is create the elements and start drag-n-dropping the nodes into place.\"]}),/*#__PURE__*/e(\"p\",{children:\"Schedules, Slack integration, and CI/CD will only take minutes. Runner setup won't even take seconds; they're ready to go whenever you are. Every Node you could ever need is at your disposal. We use static IPs, so there are no headaches there, either.\"}),/*#__PURE__*/e(\"h2\",{children:\"But is it possible to do all this with code?\"}),/*#__PURE__*/e(\"p\",{children:\"Maybe, we doubt it, but we have spoken to many die-hard selenium/cypress/playwright automation testers who have told us they can do everything DoesQA can do just as quickly in code. So I guess if the individual has the required skills, experience, caffeine, and the 6 hours.\"}),/*#__PURE__*/t(\"p\",{children:[\"If you can do this, \",/*#__PURE__*/e(o,{href:{webPageId:\"MXnN_wiho\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"we'd love to hear from you!\"})})]}),/*#__PURE__*/e(\"h2\",{children:\"Conclusion\"}),/*#__PURE__*/e(\"p\",{children:\"A production automation test pack is something everyone should want, regardless of all other automation tests taking place elsewhere.\"}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"You can start small, but you should start!\"})}),/*#__PURE__*/t(\"p\",{children:[\"Do all this and much more with a \",/*#__PURE__*/e(o,{href:{webPageId:\"Owida8HbZ\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"DoesQA\"})}),\". If you get stuck at any point, \",/*#__PURE__*/e(o,{href:{webPageId:\"MXnN_wiho\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"reach out, and we'll jump in\"})}),\"!\"]})]});export const richText13=/*#__PURE__*/t(i.Fragment,{children:[/*#__PURE__*/e(\"p\",{children:\"\\\"Flakiness\\\" is the worst thing in automation testing. It's much worse than having low coverage or slow test running times. Having no tests at all is preferable to having flaky ones. At least this way, you know you're relying entirely on manual testing without any false confidence.\"}),/*#__PURE__*/e(\"p\",{children:\"Before we look at what you should do to reduce test flakiness, we should explore some scenarios to illustrate why flakiness is so damaging.\"}),/*#__PURE__*/e(\"h2\",{children:\"False Positives\"}),/*#__PURE__*/e(\"p\",{children:\"False positives are when there are bugs in the software you're testing, but the related tests pass. These are (hopefully) the rarest type of flakiness but can be very damaging.\"}),/*#__PURE__*/e(\"p\",{children:'False positives can come about in numerous ways; almost all are human errors. But before you think, \"I\\'m better than that,\" please remember very few people deliberately cause car crashes. Mistakes happen, especially when rushing or distracted.'}),/*#__PURE__*/e(\"p\",{children:\"Despite its rarity, I've seen this caused by widely different areas of a test pack. With one, someone had set up a CI/CD pipeline to return the response from the test pack once it had finished OR ZERO! After a simple change, this fell into the \\\"OR\\\" for the first time and started returning passes, even though the pack didn't even start. Another was just a low-quality test. The test logged into a user's account but didn't do any checks after that point. The server returned a custom error page, but the pack was still \\\"green\\\".\"}),/*#__PURE__*/e(\"h2\",{children:\"False Negatives\"}),/*#__PURE__*/e(\"p\",{children:'After the potential consequences of the above, you might be tempted to think these are preferable, but they are just as bad! False positives are when your tests fail in an area that would be considered a pass by a human. When people say \"Flakiness\" or \"Flaky Test,\" this is the type they typically are referring to.'}),/*#__PURE__*/e(\"p\",{children:\"False negatives can happen for so many different reasons that I'll just quick-fire a bunch:\"}),/*#__PURE__*/t(\"ul\",{style:{\"--framer-text-color\":\"rgb(14, 16, 26)\"},children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",style:{\"--framer-text-color\":\"rgb(14, 16, 26)\"},children:/*#__PURE__*/e(\"p\",{children:\"Requests taking longer in different environments\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",style:{\"--framer-text-color\":\"rgb(14, 16, 26)\"},children:/*#__PURE__*/e(\"p\",{children:\"Tests sharing data\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",style:{\"--framer-text-color\":\"rgb(14, 16, 26)\"},children:/*#__PURE__*/e(\"p\",{children:\"Tests overlapping\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",style:{\"--framer-text-color\":\"rgb(14, 16, 26)\"},children:/*#__PURE__*/e(\"p\",{children:\"Tests not being circular\\xa0\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",style:{\"--framer-text-color\":\"rgb(14, 16, 26)\"},children:/*#__PURE__*/e(\"p\",{children:\"Unstable environment\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",style:{\"--framer-text-color\":\"rgb(14, 16, 26)\"},children:/*#__PURE__*/e(\"p\",{children:\"Unstable remote runners\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",style:{\"--framer-text-color\":\"rgb(14, 16, 26)\"},children:/*#__PURE__*/e(\"p\",{children:\"Bad element selectors\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",style:{\"--framer-text-color\":\"rgb(14, 16, 26)\"},children:/*#__PURE__*/e(\"p\",{children:\"Minor UI changes\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",style:{\"--framer-text-color\":\"rgb(14, 16, 26)\"},children:/*#__PURE__*/e(\"p\",{children:\"And, of course, test script mistakes\"})})]}),/*#__PURE__*/e(\"p\",{children:\"All of the above and many more can cause your test pack to fail when you or someone else manually testing the same thing would consider it a pass.\"}),/*#__PURE__*/t(\"p\",{children:[\"If left unchecked, this will destroy all confidence in test automation within your team, department, and company. No joke, this can cost you your job. I don't mean directly like, \\\"This is a false negative, YOU'RE FIRED!\\\" but engineering teams and companies only have so much budget. When nobody values the output from the test automation pack, they will stop valuing the people who work on it and look at alternatives like off-shore test teams and \",/*#__PURE__*/e(o,{href:{pathVariables:{tcfKQ1IoL:\"3-types-of-codeless-automation-testing-tools\"},unresolvedPathSlugs:{tcfKQ1IoL:{collectionId:\"qfddknsE_\",collectionItemId:\"Zig_9AVVq\"}},webPageId:\"nbTUTx03b\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Magic-based testing solutions\"})}),\".\"]}),/*#__PURE__*/e(\"h2\",{children:\"Why ignoring fails leads to flakiness?\"}),/*#__PURE__*/e(\"p\",{children:'There is no such thing as \"Flakiness\". It\\'s just the term we use to mean unstable for an unknown reason.\\xa0'}),/*#__PURE__*/e(\"p\",{children:'If your test pack fails and you don\\'t stop and give it the required investigation time, it becomes \"Flaky\".'}),/*#__PURE__*/e(\"p\",{children:\"If your test pack fails and, after investigation, you realize it's because your remote runners had an outage, it's not a flaky test pack. It's a runner outage. If you discover it's because you needed to swap a pause for a wait-for element, it was just the need for a test improvement.\"}),/*#__PURE__*/e(\"h2\",{children:\"What should you do when your pack fails?\"}),/*#__PURE__*/e(\"p\",{children:\"Stop, Investigate & Eradicate!\"}),/*#__PURE__*/e(\"p\",{children:\"Before anything else, talk as an entire team about the importance of having confidence in the test automation pack. It's there to be a speed boost, but everyone must value it and believe the results.\"}),/*#__PURE__*/e(\"p\",{children:'This conversation should include scrum people, as you must make them aware that investigating all fails will take priority; you need to allow adequate time for this. You also need development representatives, as not all \"Red Runs\" are false negatives!'}),/*#__PURE__*/e(\"p\",{children:\"Your pack should be green. If it turns red, Stop, Investigate, and Eradicate!\"}),/*#__PURE__*/e(\"h2\",{children:\"What should happen when you correctly find a bug?\"}),/*#__PURE__*/e(\"p\",{children:\"If there's value in the steps preceding the buggy area, shorten the test.\"}),/*#__PURE__*/e(\"p\",{children:\"If you already have that coverage elsewhere, temporarily exclude or remove the test until the bug is fixed.\"}),/*#__PURE__*/e(\"p\",{children:\"Your pack should be green. If it turns red, Stop, Investigate, and Eradicate!\"}),/*#__PURE__*/e(\"h2\",{children:\"What should you do if you notice a false result?\"}),/*#__PURE__*/e(\"p\",{children:\"Make everyone aware of the false positive/negative and make it the highest possible priority.\"}),/*#__PURE__*/e(\"p\",{children:\"If you don't Stop, Investigate, and Eradicate every single instance, you will never reach the point where the entire engineering team values the test pack results and, by extension, all the effort you have put in.\"}),/*#__PURE__*/e(\"h2\",{children:\"What can you do to reduce flakiness?\"}),/*#__PURE__*/e(\"p\",{children:\"Human-error will always be the most significant factor, partially when people need to rush or have limited time while bouncing between meetings.\"}),/*#__PURE__*/e(\"p\",{children:\"Integrations are also a significant complexity. When you have a bespoke test pack and need to connect up remote runners, there's always room for configuration and 3rd party issues.\"}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(o,{href:{webPageId:\"Owida8HbZ\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Codeless test automation\"})}),' resolves these prominent reasons for \"Flakiness\" as there\\'s little room for human error, and runners are integrated out of the box.']}),/*#__PURE__*/e(\"p\",{children:\"But the number one way to reduce flakiness is to Stop, Investigate, and Eradicate! If you continue to ignore these issues, they will only grow.\"})]});export const richText14=/*#__PURE__*/t(i.Fragment,{children:[/*#__PURE__*/e(\"p\",{children:\"Just like Neapolitan ice cream, codeless test automation comes in three flavors. Each has its pros and cons. In this, we'll take a brief high-level look at each one.\"}),/*#__PURE__*/e(\"h2\",{children:\"1 - Record and Playback\"}),/*#__PURE__*/e(\"p\",{children:'This one is pretty \"Ronseal\" (you might get this reference if you\\'re from the UK), meaning it \"does what it says on the tin\".'}),/*#__PURE__*/e(\"p\",{children:\"To use a record and playback tool, you hit record, perform any of your desired actions, and hit stop. You'll now have a test that you can playback.\"}),/*#__PURE__*/e(\"h3\",{children:\"Pros:\"}),/*#__PURE__*/e(\"p\",{children:\"Record and playback codeless automation testing is the fastest and easiest option to get started. \"}),/*#__PURE__*/e(\"h3\",{children:\"Cons:\"}),/*#__PURE__*/e(\"p\",{children:\"Maintenance is considerably more complex than creation, leading many to simply delete and re-record failing tests. Action-only testing is another concern; record and playback can simulate mouse and keyboard events but will not perform checks automatically. This leads to tests that pass if they get to the end and fail if they can't.\"}),/*#__PURE__*/e(\"h3\",{children:\"When should you use record and playback?\"}),/*#__PURE__*/e(\"p\",{children:\"Manual testers could benefit from using record and playback tools more often. They might have to repeatedly test and retest the same steps during a development cycle but not need that automation afterward. For these short-lived repetitive tasks, record and playback is perfect.\"}),/*#__PURE__*/e(\"h2\",{children:\"2 - Magic-based Testing\"}),/*#__PURE__*/e(\"p\",{children:\"This category includes AI and visual-based testing. If we consider a Playwright or Cypress script as a control, Magic-based testing tools would be the furthest departure.\"}),/*#__PURE__*/e(\"p\",{children:\"The use of tools like this will differ a lot, but the core concept is you'll get more testing for your inputted effort.\"}),/*#__PURE__*/e(\"h3\",{children:\"Pro:\"}),/*#__PURE__*/e(\"p\",{children:\"Smart, it's possible tools like these could find issues you wouldn't even consider testing for. \"}),/*#__PURE__*/e(\"h3\",{children:\"Cons:\"}),/*#__PURE__*/e(\"p\",{children:\"Unclear what is being tested and what is not. Some tools might have to learn what a genuine defect is and what is typical for your system. It's common to have false negatives and false positives, making these codeless test tools very time-consuming to dial in.\"}),/*#__PURE__*/e(\"p\",{children:'When talking to an AI engineer for one of the market-leading AI codeless tools, they told me, \"It\\'s like hiring a junior tester; you have to teach them and watch over them.\"'}),/*#__PURE__*/e(\"h3\",{children:\"When should you use Magic-based testing?\"}),/*#__PURE__*/e(\"p\",{children:\"This type of codeless test tool provides real benefits as an additional QA layer of protection. The main issue is their considerable cost (both time and money) to set up; if these aren't issues to you, go for it!\"}),/*#__PURE__*/e(\"h2\",{children:\"3 - Code-without-code\"}),/*#__PURE__*/e(\"p\",{children:\"Going back to using Playwright or Cypress as a control, these codeless test automation tools are the closest. These tools are interfaces that provide optimizations and efficiency benefits without allowing mistakes to be made like you can with code.\"}),/*#__PURE__*/e(\"h3\",{children:\"Pros:\"}),/*#__PURE__*/t(\"p\",{children:[\"Tools in this category often provide fast, easy access to advanced features, which would be time-consuming to set up manually, like \",/*#__PURE__*/e(o,{href:{webPageId:\"j8vkaNlXd\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"visual regression\"})}),\", \",/*#__PURE__*/e(o,{href:{webPageId:\"NS4VXQ4sG\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"accessibility\"})}),\", video recordings, etc.\"]}),/*#__PURE__*/e(\"h3\",{children:\"Cons:\"}),/*#__PURE__*/e(\"p\",{children:\"Vendor lock-in. It's always worth investigating if you can export your tests created in a codeless test automation tool like this.\"}),/*#__PURE__*/e(\"h3\",{children:\"When should you use a code-without-code test tool?\"}),/*#__PURE__*/e(\"p\",{children:\"Anyone who values the control and clarity that come with a very well-coded bespoke test pack without the skill or labor investment to create one in-house. \"}),/*#__PURE__*/t(\"p\",{children:[\"When considering a code pack plus the required remote runners, these tools can \",/*#__PURE__*/e(o,{href:{webPageId:\"HGeE8fLXr\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"improve your testing and reduce costs\"})}),\" massively in one go. \",/*#__PURE__*/e(o,{href:{webPageId:\"l9knRz8Kt\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Everyone should at least try\"})}),\".\"]}),/*#__PURE__*/e(\"h2\",{children:\"Conclusion\"}),/*#__PURE__*/e(\"p\",{children:\"You have loads of options. Each category has several providers, each with its specialties and uniqueness. The options are no longer 1) a second development team inside QA to write tests or 2) nothing.\"}),/*#__PURE__*/t(\"p\",{children:[\"Like the Neapolitan ice cream, you'll probably have a good idea of your preference, but before you reach for a double scoop, why not \",/*#__PURE__*/e(o,{href:{webPageId:\"l9knRz8Kt\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"start a DoesQA evaluation\"})}),\"?\"]})]});export const richText15=/*#__PURE__*/t(i.Fragment,{children:[/*#__PURE__*/e(\"p\",{children:\"In the rapidly evolving landscape of software development, test automation stands as a cornerstone for achieving speed, efficiency, and reliability. To accurately evaluate the effectiveness and maturity of a test automation capability within a business, we propose the S.C.O.R.E method\"}),/*#__PURE__*/e(\"p\",{children:\"This method breaks down the evaluation into five key dimensions: Stability, Coverage, Optimisation, Relevance, and Efficiency. Each dimension is rated on a scale from 1 to 10, culminating in a comprehensive score out of 50.\"}),/*#__PURE__*/e(\"p\",{children:\"Let's delve into each aspect.\"}),/*#__PURE__*/e(\"h2\",{children:\"S - Stability\"}),/*#__PURE__*/e(\"p\",{children:\"Stability measures how consistently and reliably the test automation suite executes. It considers the frequency of false positives/negatives, the robustness of the test environment, and the ability to predictably reproduce test results. A high score in stability indicates a test suite that provides consistent results, has minimal flakiness, and operates in a well-maintained test environment.\"}),/*#__PURE__*/e(\"h2\",{children:\"C - Coverage\"}),/*#__PURE__*/e(\"p\",{children:\"Coverage assesses the extent to which the test automation suite encompasses the breadth and depth of the application's features, including UI, API, unit, integration, and system tests. It also considers the coverage of different user scenarios, platforms, and devices. A perfect score in coverage signifies a comprehensive testing strategy that leaves no critical area untested.\"}),/*#__PURE__*/e(\"h2\",{children:\"O - Optimisation\"}),/*#__PURE__*/e(\"p\",{children:\"Optimisation evaluates the efficiency of the test automation framework in terms of:\"}),/*#__PURE__*/t(\"ul\",{style:{\"--framer-font-size\":\"15px\",\"--framer-text-alignment\":\"left\",\"--framer-text-color\":\"rgb(209, 210, 211)\",\"--framer-text-transform\":\"none\"},children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Execution time\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Resource consumption\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Maintenance efforts.\"})})]}),/*#__PURE__*/e(\"p\",{children:\"This includes the use of parallel testing, test data management strategies, and the ability to quickly update tests in response to application changes. High marks in optimisation indicate a lean, agile testing process that maximises resources and minimises bottlenecks.\"}),/*#__PURE__*/e(\"h2\",{children:\"R - Relevance\"}),/*#__PURE__*/e(\"p\",{children:\"Relevance measures how well the test automation aligns with current and future business requirements, including the ability to adapt to changes in technology, market demands, and software development methodologies. A test suite scoring high in relevance is one that not only addresses present needs but is also designed to evolve with the business landscape.\"}),/*#__PURE__*/e(\"h2\",{children:\"E - Efficiency\"}),/*#__PURE__*/e(\"p\",{children:\"Efficiency considers the return on investment of the test automation efforts, including the impact on release cycles, defect detection rates, and overall contribution to product quality and team productivity. An efficient test automation capability demonstrates clear value, supporting faster releases without compromising quality.\"}),/*#__PURE__*/e(\"h2\",{children:\"Final S.C.O.R.E\"}),/*#__PURE__*/e(\"p\",{children:\"By evaluating each dimension, a business can gain a holistic view of its test automation capability. The final S.C.O.R.E, out of a possible 50 points, offers a clear metric to gauge maturity, identify areas for improvement, and benchmark against industry standards or competitors. This systematic approach enables organisations to strategically invest in their test automation infrastructure, ensuring it is robust, comprehensive, and aligned with business goals.\"}),/*#__PURE__*/e(\"p\",{children:\"In summary, the S.C.O.R.E method provides a structured framework for assessing the effectiveness of test automation within a business.\"}),/*#__PURE__*/e(\"p\",{children:\"By giving attention to Stability, Coverage, Optimisation, Relevance, and Efficiency, organisations can ensure their test automation strategies are not only effective but also poised to support current and future development needs.\"})]});export const richText16=/*#__PURE__*/t(i.Fragment,{children:[/*#__PURE__*/e(\"h2\",{children:\"What is an automation regression test pack?\"}),/*#__PURE__*/e(\"p\",{children:\"Your automated regression test pack is your primary quality gate. It should run on an environment as close to production as possible and ideally before exploitative testing efforts start.\"}),/*#__PURE__*/e(\"p\",{children:'The outcome of the regression test pack is not to tell you everything is fine, \"send it\". But to save your team time while giving you the confidence to move on to the next phase, typically time-consuming manual testing. This should not be understated!'}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"A good regression test pack will save time!\"})}),/*#__PURE__*/e(\"h2\",{children:\"What are the 6 Key Parts of an Automated Regression Test Pack?\"}),/*#__PURE__*/t(\"p\",{children:[\"Every regression test pack should be shaped according to the industry and purpose of the software. But every good regression test pack will include the following \",/*#__PURE__*/e(\"strong\",{children:\"6 key parts of an automated regression test pack\"}),\":\"]}),/*#__PURE__*/e(\"h3\",{children:\"1 - Critical Business Flows\"}),/*#__PURE__*/e(\"p\",{children:\"These are the areas that, if broken, fundamentally mean your service is down. If they occur on production, you would roll back a release.\"}),/*#__PURE__*/e(\"p\",{children:\"For an e-commerce website, this would be adding items to a cart and performing a complete card checkout.\"}),/*#__PURE__*/e(\"p\",{children:\"Most of these will likely be obvious to you, but it's always worth asking around to see if anyone else comes up with different items on the list. Some Critical Business Flows might be more hidden. Your company may have customers or partners with specific flows that need coverage.\"}),/*#__PURE__*/e(\"h3\",{children:\"2 - High-Risk Areas\"}),/*#__PURE__*/e(\"p\",{children:\"These are areas of particular complexity or frequent change.\"}),/*#__PURE__*/e(\"p\",{children:'Continuing to use e-commerce as an example, this might be \"discount stacking,\" where the user has six \"3 for 2\" items in their cart, plus a \"10% off\" discount code, and is trying to use up an old gift card before paying the rest of a credit card.'}),/*#__PURE__*/e(\"p\",{children:\"I suggest talking to developers to get a list of areas that send a shiver down their spine.\"}),/*#__PURE__*/e(\"h3\",{children:\"3 - Negative Testing\"}),/*#__PURE__*/e(\"p\",{children:'For every positive test, there are dozens of negative tests. Negative tests are those off of the \"happy path\" or \"golden thread\". These include validation messages, failed action errors, and anywhere where your application tries to nudge the user back onto a \"happy path\".'}),/*#__PURE__*/e(\"p\",{children:\"Here are some common examples:\"}),/*#__PURE__*/t(\"ul\",{style:{\"--framer-text-color\":\"rgb(14, 16, 26)\"},children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",style:{\"--framer-text-color\":\"rgb(14, 16, 26)\"},children:/*#__PURE__*/e(\"p\",{children:\"The inputted email address on a register form already has an account.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",style:{\"--framer-text-color\":\"rgb(14, 16, 26)\"},children:/*#__PURE__*/e(\"p\",{children:'An item in a user\\'s basket becomes \"out of stock\" before checkout.'})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",style:{\"--framer-text-color\":\"rgb(14, 16, 26)\"},children:/*#__PURE__*/e(\"p\",{children:\"A user tries to set a password that doesn't meet the minimum requirements.\"})})]}),/*#__PURE__*/e(\"p\",{children:\"Manual/behavioral testers are the go-to here. They might already have a list but will easily come up with many on the spot.\"}),/*#__PURE__*/e(\"h3\",{children:\"4 - Browser and Platform Coverage\"}),/*#__PURE__*/e(\"p\",{children:\"Luckily, browsers have matured and are more similar and reliable than ever. But user fragmentation is still on the rise. This fragmentation mainly comes from mobile devices, specifically, the vast variation in screen sizes.\"}),/*#__PURE__*/e(\"p\",{children:'To give users the best experience at different sizes, most websites and web apps will include media queries to alter site behavior based on viewport size. For instance, the primary navigation will often be replaced with a \"burger menu\".'}),/*#__PURE__*/e(\"p\",{children:\"Using these alterations should be included in your automated regression test pack. Ensure your regression tests run on multiple browsers and various screen sizes.\"}),/*#__PURE__*/e(\"p\",{children:\"Talk to whoever manages the analytics account. Ideally, you'll gain access, but if you still need to, ask them to provide a breakdown of the devices, browsers, and resolutions to help guide your prioritization.\"}),/*#__PURE__*/e(\"h3\",{children:\"5 - Regression Tests for Bug Fixes\"}),/*#__PURE__*/e(\"p\",{children:\"Include tests that prove previous defects are still fixed. Your users don't want to see old bugs return, nor does anyone internally. Regressing on previously found and fixed issues can cause a lot of stress in what might be a well-functioning team otherwise.\\xa0\\xa0\"}),/*#__PURE__*/e(\"p\",{children:'Murphy\\'s law of \"anything that can go wrong will go wrong\" is a useful guide here. If something has previously shown itself to be possible to go wrong, it likely will again.'}),/*#__PURE__*/e(\"p\",{children:\"You'll probably be able to run a query on whatever tool you use to manage work. If you need to ask someone, your Scrum Master or whoever manages work tickets should be able to help.\\xa0\"}),/*#__PURE__*/e(\"h3\",{children:\"6 - Integrated User Journeys\"}),/*#__PURE__*/e(\"p\",{children:\"Your automated regression test pack should be fully integrated, and you should write tests as if a real user is using your site.\"}),/*#__PURE__*/e(\"p\",{children:\"Avoid tests that jump (navigate using the address bar) to a page and perform an action before jumping to the next. Users navigate, and so should your tests.\"}),/*#__PURE__*/e(\"p\",{children:'Avoid mocking wherever possible. Unit and integration testing is like tasting each ingredient of a cheeseburger; it\\'s a good idea and will save you time and money if any ingredient turns out to be \"off\". But your customers will consume it differently. To truly know if you have a good cheeseburger, you need a finished cheeseburger with all its parts and take a big old bite.'}),/*#__PURE__*/e(\"p\",{children:\"This one is more of a guide on how to create your tests. They shouldn't be small blocks but connected chains. Analytics can help you again here, but I suggest talking to custom services, too.\\xa0\"}),/*#__PURE__*/e(\"h2\",{children:\"Room for a part 2!\"}),/*#__PURE__*/e(\"p\",{children:'I could have easily made this the 10 or 12 key parts of an automated regression test pack, covering localization, accessibility, security, and even SEO. But I\\'ll save them for part 2, \"Extending your automated regression test pack.\"'}),/*#__PURE__*/e(\"p\",{children:\"I hope you found this helpful. If it did, please share.\"})]});export const richText17=/*#__PURE__*/t(i.Fragment,{children:[/*#__PURE__*/t(\"p\",{children:[\"This article might sound like a non-starter. Surely \",/*#__PURE__*/e(o,{href:{webPageId:\"NS4VXQ4sG\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"Accessibility testing\"})}),\" is always important?! Well, let's run over the main benefits, and how you can make sure you are ticking all the boxes.\"]}),/*#__PURE__*/e(\"h2\",{children:\"1. Equal Experience for all\"}),/*#__PURE__*/e(\"p\",{children:\"Every single user that comes to your site / app / blog has a baseline expectation, to be able to interact, navigate and read your content in a way that they are comfortable. If someone using only a keyboard cannot get to key areas, they are having a degraded experience to those that use a mouse. \"}),/*#__PURE__*/e(\"h2\",{children:\"2. It's the Law!\"}),/*#__PURE__*/t(\"p\",{children:[\"Something we all agree with, if you are creating an amazing shopping experience, why should it discriminate against anyone? WCAG and other standards were created to give a level playing field, and tooling, like \",/*#__PURE__*/e(o,{href:{webPageId:\"Owida8HbZ\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"DoesQA\"})}),\", has made checking against these standards as easy as possible.\"]}),/*#__PURE__*/e(\"h2\",{children:\"3. Not just about clicking buttons \"}),/*#__PURE__*/e(\"p\",{children:\"Theres more to these standards, and a lot of them have knock-on effects to ensuring that your SEO is top tier:\"}),/*#__PURE__*/e(\"h3\",{children:\"Performance Metrics\"}),/*#__PURE__*/e(\"p\",{children:\"How long does it take to load the page? Do you have loads of un-used JavaScript clogging up the browser? Optimizing performance metrics not only improves accessibility but also enhances the overall user experience, making your site more efficient and responsive.\"}),/*#__PURE__*/e(\"h3\",{children:\"SEO Metrics\"}),/*#__PURE__*/e(\"p\",{children:\"How well is your content structured for search engines? Proper use of headings, alt text, and semantic HTML can significantly boost your site's visibility and accessibility in search engine results.\"}),/*#__PURE__*/e(\"h3\",{children:\"Best Practices\"}),/*#__PURE__*/e(\"p\",{children:\"Are you following the latest web development standards? Adhering to best practices in coding and design ensures a more accessible and maintainable website, reducing future technical debt and improving user satisfaction.\"}),/*#__PURE__*/e(\"h3\",{children:\"PWA (Progressive Web App)\"}),/*#__PURE__*/e(\"p\",{children:\"Does your site work well on all devices and connection speeds? A well-implemented PWA ensures that your website is not only accessible but also provides a seamless and engaging experience across different platforms and network conditions.\"}),/*#__PURE__*/e(\"h2\",{children:\"4. You actually save money\"}),/*#__PURE__*/e(\"p\",{children:\"A majority of search engines (Google, Bing etc) use these metrics to score your website, if you reach high scores, this has a large positive impact on your organic traffic, saving that money spent on advertisements and other paid sources.\"}),/*#__PURE__*/e(\"h2\",{children:\"5. Better user experience as a by-product\"}),/*#__PURE__*/e(\"p\",{children:\"Each and every improvement to any section relating to Accessibility Testing has an added benefit of improving the entire experience of your website for all users!\"}),/*#__PURE__*/e(\"h2\",{children:\"Some important FAQ's and additional info:\"}),/*#__PURE__*/e(\"h3\",{children:'What is considered a \"good\" score on Lighthouse?'}),/*#__PURE__*/e(\"p\",{children:'Whilst the score is out of 100 for each of the sections, anything above 90 is considered \"good\"'}),/*#__PURE__*/e(\"h3\",{children:\"What is a bad score on Lighthouse?\"}),/*#__PURE__*/e(\"p\",{children:\"Anything below 50 (0-49) is considered poor, and in need of major improvement. Each rule has a weight, so you might find that fixing the major items has a large improvement in the score.\"}),/*#__PURE__*/e(\"h3\",{children:\"How can I test Lighthouse scores automatically on my website?\"}),/*#__PURE__*/t(\"p\",{children:[\"Head to \",/*#__PURE__*/e(o,{href:{webPageId:\"Owida8HbZ\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"DoesQA\"})}),', grab an account, and drag in our \"Validators\" to check scores. Set up a schedule or CI/CD webhook integration to continually test these scores over time.']}),/*#__PURE__*/e(\"h3\",{children:\"How can I test against WCAG2A, WCAG2AA and WCAG2AAA rules?\"}),/*#__PURE__*/t(\"p\",{children:[\"Using \",/*#__PURE__*/e(o,{href:{webPageId:\"Owida8HbZ\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"DoesQA\"})}),\", simply drag in our Pa11y node, and select the desired conformance level, hit play, and within a few moments, you will have a list of issues, or a glowing green report!\"]}),/*#__PURE__*/e(\"h3\",{children:\"Do different viewports / devices get different accessibility scores?\"}),/*#__PURE__*/e(\"p\",{children:\"Yes! You could get an amazing score on Desktop, but make sure to use Tablet and Phone viewports / emulation to get total validation.\"}),/*#__PURE__*/e(\"h3\",{children:\"How much does it cost to check for Accessibility?\"}),/*#__PURE__*/t(\"p\",{children:[\"Google Chrome has Lighthouse built in, but if you want to test WCAG2 standards, and be able to run all of these checks daily on 30+ devices, head to \",/*#__PURE__*/e(o,{href:{webPageId:\"Owida8HbZ\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"DoesQA to get started\"})}),\". In less than 5 minutes, you can have tests across your site, and piece of mind that you are following the guidelines set.\"]}),/*#__PURE__*/e(\"h3\",{children:\"How can I monitor my WCAG2 scores over time?\"}),/*#__PURE__*/t(\"p\",{children:[\"Create a simple test in \",/*#__PURE__*/e(o,{href:{webPageId:\"Owida8HbZ\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"DoesQA\"})}),\", and schedule it to run daily / weekly to get insights into how your site is performing over a longer period. Like having a time-machine, the past is always present.\"]}),/*#__PURE__*/t(\"p\",{children:[\"Ready to get started? \",/*#__PURE__*/e(o,{href:{webPageId:\"Owida8HbZ\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"We are!\"})})]})]});export const richText18=/*#__PURE__*/t(i.Fragment,{children:[/*#__PURE__*/e(\"p\",{children:\"Like the Pyramids of Giza, the Testing Pyramid has remained largely unchanged for eons.\"}),/*#__PURE__*/e(\"p\",{children:\"But whereas one is literally set-in-stone, the other was more of an idea. A pragmatic idea to help development teams succeed with agile. But much has changed since Mike Cohn first published Succeeding with Agile in 2009, and it might be worth another look.\"}),/*#__PURE__*/e(\"h2\",{children:\"Like a sandwich from 2009, a sniff-test is overdue.\"}),/*#__PURE__*/e(\"p\",{children:\"I was a developer before 2009, and everything was a mess! Some places were probably more organized or modern. But what I saw most commonly was engineering teams made up entirely of developers. I can't remember where I was when I first saw a full-time tester in a dev team. Often, they were bought in for short periods to test everything manually, then disappeared. It was the Dark Ages!\"}),/*#__PURE__*/e(\"p\",{children:\"Unit tests were rare, and it would be a few years before anything viable arrived in the end-to-end space.\"}),/*#__PURE__*/e(\"p\",{children:\"So back when Succeeding with Agile was published, it was the best remedy. Development teams were writing better code by writing a bit more code to test their code... as they wrote the first code. And it works. Code quality improves without even running the unit test. This is partly due to the developer thinking about their code from a second perspective.\"}),/*#__PURE__*/e(\"h2\",{children:\"Develop Quality!\"}),/*#__PURE__*/e(\"p\",{children:'Companies want features and services to make money, so \"testing\" has always been hard for bosses to swallow.'}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"em\",{children:\"\\\"I'm already paying for developers; why should I also pay for testers just to tell me I'm being ripped off?\\\"\"}),\" is a common sentiment - even if it's not expressed verbally.\\xa0\"]}),/*#__PURE__*/e(\"p\",{children:\"Unsurprisingly, companies want the highest possible quality directly from the developers. And so, the Test Pyramid has become a foundational part of the development landscape.\"}),/*#__PURE__*/e(\"h2\",{children:\"High quality, but not high confidence\"}),/*#__PURE__*/e(\"p\",{children:\"Quality code is quite an open term. We assume it means working, but different people will have different opinions. I've worked with many developers who will think quality is about how something is written (use of libraries, code structure, runtime efficiency etc). So naturally, when they write quality unit-tested code they skew towards their preferences.\"}),/*#__PURE__*/e(\"p\",{children:\"This could sound contentious, so I'll give an example. Assume a function should have a known input, do some processing, and produce a known output. Simple, perfect, easy, without any room for error. They write what they consider quality code; they write an amazing comment, format the function to be easily understandable, and they write a few unit tests.\\xa0\"}),/*#__PURE__*/e(\"p\",{children:\"The code is peer-reviewed, and standard testing is performed. No one says anything, so it's promoted to live.\"}),/*#__PURE__*/e(\"h2\",{children:\"What's the problem?\"}),/*#__PURE__*/e(\"p\",{children:'Well, \"should have a known input\". This function doesn\\'t exist in isolation; without looking at all the upstream code, that \"should\" requires a lot of trust. Another developer might take a different approach to quality, one that produces more resilient code, regardless of the unit testing.'}),/*#__PURE__*/e(\"p\",{children:\"They should have raised this at the pull request stage. But it's working; the unit test proves it. I'm sure all developers reading this have been in many conversations where one person says something is done, and another thinks it could be done better. They usually end with nothing changing.\"}),/*#__PURE__*/e(\"h2\",{children:\"Focus on confidence, not quality.\"}),/*#__PURE__*/e(\"p\",{children:\"Confidence is what matters. You can have high-quality blocks of unit-tested code and still have zero confidence. Why? Because users are making you aware of issues.\"}),/*#__PURE__*/e(\"p\",{children:\"What you need is end-to-end automation tests. A large automation regression pack that is run on every change. One that gets updated with every defect a user finds not only to validate that the specific defect is fixed but also ensures it can never regress.\"}),/*#__PURE__*/e(\"h2\",{children:'\"The Pyramid\"'}),/*#__PURE__*/e(\"p\",{children:\"This can and should be done in every engineering team. But there's an obstacle. This thing that keeps getting in the way. It's like a really wide block of stone blocking your path. One that is hard to get around as it's just as wide as it is long. And you can't easily get over it either with it's perfect 60\\xb0 slope... I'm describing a pyramid, \\\"The Test Pyramid\\\", let's move on.\"}),/*#__PURE__*/e(\"p\",{children:'I\\'ve heard \"leaders\" in testing say in public talks that they routinely delete automation tests with their PowerPoint slide of \"The Pyramid\" illuminated in garish colors behind them. I\\'ve heard others use \"Shift-Left\" as a way for QA Teams to blame developers for bad code. Yes, any bad code is the developer\\'s fault, but the QA job is to support the engineering team by catching these before they go out, right?'}),/*#__PURE__*/e(\"p\",{children:'We need to stop using \"The Pyramid\" as anything more than 2009s pragmatic idea to help improve quality. Its purpose is to increase testing efficiently, not set limits or not argue for its reduction.'}),/*#__PURE__*/e(\"h2\",{children:\"So what's 2024s Pragmatic Idea?\"}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Do more testing more quickly for less money.\"}),/*#__PURE__*/e(\"br\",{}),'This might sound like a joke or the start of the \"sales pitch\" part of the post, but it\\'s not.']}),/*#__PURE__*/e(\"p\",{children:\"Two of the most significant differences between 2009 and now are:\"}),/*#__PURE__*/t(\"ol\",{style:{\"--framer-text-color\":\"rgb(14, 16, 26)\"},children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",style:{\"--framer-text-color\":\"rgb(14, 16, 26)\"},children:/*#__PURE__*/e(\"p\",{children:\"The cost of good developers has rocketed\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",style:{\"--framer-text-color\":\"rgb(14, 16, 26)\"},children:/*#__PURE__*/e(\"p\",{children:\"The cost of good automation testing has plummeted\"})})]}),/*#__PURE__*/e(\"p\",{children:\"Ask yourself; if you could have all of your most common user journeys as full end-to-end automation tests and be able to run them in single-digit minutes as part of your CI/CD. Or you could have 100% unit test coverage. What would give you more confidence?\"}),/*#__PURE__*/e(\"p\",{children:\"In 2009, one was almost impossible and could double the engineering cost if pursued. The other would slow each feature down a little bit.\"}),/*#__PURE__*/e(\"p\",{children:'Now, in 2024, the benefits of unit tests remain the same, and you should do as much as you can while remaining efficient. Full end-to-end automation, on the other hand, has seen a revolution. Test automation has become so easy and so cost-effective it\\'s astonishing to see \"The Pyramid\" being used as a prescribed ratio of end-to-end to unit tests.'}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"We say don't limit your automation testing. Test as much as possible, then relax and enjoy your increased confidence.\"})}),/*#__PURE__*/t(\"p\",{children:[\"You're overdue if you haven't investigated \",/*#__PURE__*/e(o,{href:{webPageId:\"Owida8HbZ\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"end-to-end automation testing\"})}),\" in the last few years! Take a look at what's new in the \",/*#__PURE__*/e(o,{href:{webPageId:\"Owida8HbZ\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"codeless test automation space\"})}),\" and give a few tools a go! Of course, \",/*#__PURE__*/e(o,{href:{webPageId:\"Owida8HbZ\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"I suggest starting with DoesQA\"})}),\".\"]})]});export const richText19=/*#__PURE__*/t(i.Fragment,{children:[/*#__PURE__*/e(\"p\",{children:\"Hello there, CTO-person reading this; you're looking sharp today. Or, if you're an engineering manager, senior dev, dev, junior dev, tester, student, or random person who clicked the wrong link, nice t-shirt!\"}),/*#__PURE__*/e(\"p\",{children:\"Strap in because beans are about to spill, cats are about to vacate bags, and games will be given away!\"}),/*#__PURE__*/e(\"p\",{children:\"But first, we need to lay some groundwork.\"}),/*#__PURE__*/e(\"h2\",{children:\"What would an Automation Test team look like?\"}),/*#__PURE__*/e(\"p\",{children:\"Well, it would consist of one or more Automation Testers. This only begs the question: What does an Automation Tester look like? Which is a stupid question!\"}),/*#__PURE__*/e(\"p\",{children:\"We should ask, what makes up an Automation Tester besides the very-squishy and not-so-squishy pieces wrapped in skin?\"}),/*#__PURE__*/e(\"p\",{children:\"An Automation tester needs 2 or 3 things, depending on how complex you want to make things.\"}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"One\"}),') A tester\\'s mindset. That special something that compels someone to quickly click a button more times than any \"normal\" person or urges them to click Back right after clicking The Buy Now Button.']}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"TWO\"}),') The knowledge to turn \"The Buy Now Button\" into something a computer can understand. These will likely be CSS selectors, or if you have a Microsoft Zune in a drawer somewhere, XPath selectors.']}),/*#__PURE__*/t(\"p\",{children:[\"You might be thinking, \",/*#__PURE__*/e(\"em\",{children:'\"Hey, I have a manual tester with a tester\\'s mindset AND a frontend developer who can do that other thing\"'}),\".\"]}),/*#__PURE__*/t(\"p\",{children:[\"Nice work! You've guessed the punchline to this piece! But I'll continue anyway because I did say 2 or 3 things, and I've only given you the first two parts. \",/*#__PURE__*/e(\"strong\",{children:\"mwahahaha\"})]}),/*#__PURE__*/e(\"h2\",{children:\"Meet your secret Automation Test team.\"}),/*#__PURE__*/e(\"p\",{children:\"50% Frontend Developer, 50% behavioral *cough* manual *cough* Tester.\"}),/*#__PURE__*/e(\"p\",{children:\"Now, you could buy them a gift card to a romantic restaurant and see where it goes, crossing your fingers and waiting patiently for several years for your investment to possibly pay off. Or you could split the work in two and get the bang for your buck right now!\"}),/*#__PURE__*/e(\"p\",{children:\"Ask your frontend developer(s) to create the page objects for a given page or ask them to provide this as part of the standard practice (definition of done). \"}),/*#__PURE__*/e(\"p\",{children:'With the right tool, your behavioral tester can use these alone with simple commands like \"Touch\" or \"Set Value\" to create automation tests for everything they currently have to do manually.'}),/*#__PURE__*/e(\"p\",{children:\"Think of this as introducing Patrick to Spongebob, uniting Mario and Luigi, or add a Buzz to your Woody.\"}),/*#__PURE__*/e(\"p\",{children:\"Did you catch the 3rd part?\"}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"You need the right tool.\"}),\" I won't say there's only one option here; \",/*#__PURE__*/e(o,{href:{pathVariables:{tcfKQ1IoL:\"best-codeless-test-automation-tools-2023\"},unresolvedPathSlugs:{tcfKQ1IoL:{collectionId:\"qfddknsE_\",collectionItemId:\"BTxh59OXg\"}},webPageId:\"nbTUTx03b\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!0,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"several options exist.\"})}),\" The important thing is that your selectors must be easily maintainable, and the tool must be simple enough to allow someone without a coding background to ultimately script tests.\"]}),/*#__PURE__*/e(\"h2\",{children:\"Split beans\"}),/*#__PURE__*/e(\"p\",{children:\"There you have it, the secret automation test team you already have.\"}),/*#__PURE__*/e(\"p\",{children:\"Your front-enders can create selectors so fast that keystrokes will produce a unified BBBBRRRRRRR. They may also start adding testIds, making this even quicker for themselves while accidentally improving overall quality.\"}),/*#__PURE__*/e(\"p\",{children:\"Your testers will likely want to bridge any knowledge gaps and take steps toward reducing manual regression monotony and, of course, the pay increases that come with learning automation testing.\"}),/*#__PURE__*/e(\"p\",{children:\"Of course, a dedicated automation test team would be better, but hey, bug-free code that never regresses would still be better still.\"}),/*#__PURE__*/e(\"p\",{children:\"The secret is you have everything you need to make progress.\"}),/*#__PURE__*/t(\"p\",{children:[\"In the tech world, where challenges are plenty and bugs lurk in the dark (mode), your dynamic duo and their newfound sidekick (DoesQA) are here to save the day. Embrace the power of your team, laugh in the face of bugs, and let the automation adventure begin... via \",/*#__PURE__*/e(o,{href:{webPageId:\"l9knRz8Kt\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"a completely free trial\"})}),\".\"]})]});export const richText20=/*#__PURE__*/t(i.Fragment,{children:[/*#__PURE__*/e(\"p\",{children:\"Codeless test automation, a cutting-edge technological advancement, revolutionizes automated testing by eliminating the need for coding. This ensures system reliability, speeding up the testing process significantly.\\xa0\"}),/*#__PURE__*/e(\"p\",{children:\"In this guide, we'll explore codeless test automation step-by-step. So, let's get in!\"}),/*#__PURE__*/e(\"h2\",{children:\"Choosing the Right Codeless Automation Testing Tools\"}),/*#__PURE__*/e(\"p\",{children:\"Choosing the right codeless test automation tool is essential for success. Test a range of tools, including industry leaders like DoesQA. Evaluate their features, ease of use, and compatibility with your project.\\xa0\"}),/*#__PURE__*/e(\"p\",{children:\"A careful selection ensures a seamless integration into your development and testing workflow.\"}),/*#__PURE__*/e(\"h2\",{children:\"Setting Up the Test Environment\"}),/*#__PURE__*/t(\"p\",{children:[\"The next step is to set up the test environment. \",/*#__PURE__*/e(o,{href:{webPageId:\"l9knRz8Kt\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!0,children:/*#__PURE__*/e(a.a,{children:\"Begin by signing up\"})}),\" and performing a simple navigation check to your test environment. This will highlight any additional configuration that might be needed. For instance, \",/*#__PURE__*/e(o,{href:{pathVariables:{tcfKQ1IoL:\"how-to-block-unwanted-domains\"},unresolvedPathSlugs:{tcfKQ1IoL:{collectionId:\"qfddknsE_\",collectionItemId:\"s_KkuskLn\"}},webPageId:\"nbTUTx03b\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"blocking unwanted domains\"})}),\", \",/*#__PURE__*/e(o,{href:{webPageId:\"n28n9UQl0\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"whitelisting static IPs\"})}),\", etc. If you have existing Elements or Page Objects, migrating those at this stage is a good idea. A well-integrated test environment is essential for successfully implementing codeless testing in your software development lifecycle.\"]}),/*#__PURE__*/e(\"h2\",{children:\"Test Case Design and Planning\"}),/*#__PURE__*/e(\"p\",{children:\"Test case design and planning are pivotal to a successful codeless test automation strategy. Begin by clearly defining test objectives, identifying high-priority scenarios for codeless automation, and breaking down complex scenarios into manageable test cases or Flows.\\xa0\"}),/*#__PURE__*/e(\"h2\",{children:\"Recording Test Steps\"}),/*#__PURE__*/e(\"p\",{children:\"Recording test steps using your chosen codeless testing tool is simple yet essential. Some codeless test automation tools include a recorder, but the best tests are created manually. This way, the tester understands every step, improving reliability and reducing maintenance efforts later. In one browser tab, perform the test you wish to create, and in another, create the steps and elements needed to complete that step.\\xa0\"}),/*#__PURE__*/e(\"h2\",{children:\"Enhancing Test Cases\"}),/*#__PURE__*/e(\"p\",{children:\"Enhancing test cases in codeless automation involves adding validations and checkpoints to ensure the accuracy of expected outcomes. Conditional logic is crucial for handling dynamic test scenarios, allowing the automation script to adapt intelligently to varying environments or specific conditions.\\xa0\"}),/*#__PURE__*/e(\"p\",{children:\"Moreover, the efficient design of test cases is facilitated through reusable components and modules (Node Groups and Branching Flows), promoting modularity and reusability for a streamlined and scalable codeless testing process.\\xa0\"}),/*#__PURE__*/e(\"h2\",{children:\"Execution and Debugging\"}),/*#__PURE__*/e(\"p\",{children:\"Running your tests and fixing issues is crucial for successful codeless automation. Here's how:\"}),/*#__PURE__*/t(\"ul\",{style:{\"--framer-text-color\":\"rgb(14, 16, 26)\"},children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",style:{\"--framer-text-color\":\"rgb(14, 16, 26)\"},children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Start Testing\"}),\": Launch your tests with a simple click\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",style:{\"--framer-text-color\":\"rgb(14, 16, 26)\"},children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Monitor Progress:\\xa0\"}),\"Monitor the execution process to identify any unexpected behaviors. Understand how to read and interpret progress indicators.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",style:{\"--framer-text-color\":\"rgb(14, 16, 26)\"},children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Debugging Basics\"}),\": Learn the essentials of troubleshooting. Identify and fix issues by using debugging tools provided by the automation tool.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",style:{\"--framer-text-color\":\"rgb(14, 16, 26)\"},children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Common Problems:\"}),\"\\xa0Address typical challenges like element identification errors and timing issues. Gain confidence in resolving these problems to enhance your testing efficiency.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",style:{\"--framer-text-color\":\"rgb(14, 16, 26)\"},children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Documentation:\"}),\"\\xa0Document your debugging processes and solutions to build a knowledge base for future reference.\"]})})]}),/*#__PURE__*/e(\"h2\",{children:\"Reporting and Analysis\"}),/*#__PURE__*/e(\"p\",{children:\"Reporting and analysis in codeless test automation involve understanding and sharing the results of your tests. After running tests, you may need to share a PDF report or raise a defect. Explore how videos and reports can be downloaded and shared. These help teams make informed decisions about the software's quality.\"}),/*#__PURE__*/e(\"h2\",{children:\"Conclusion\"}),/*#__PURE__*/t(\"p\",{children:[\"In conclusion, getting to seamless codeless test automation empowers software development teams to enhance efficiency and reliability. \",/*#__PURE__*/e(o,{href:{webPageId:\"Owida8HbZ\"},motionChild:!0,nodeId:\"qfddknsE_\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(a.a,{children:\"This cutting-edge approach accelerates testing processes and ensures system robustness by eliminating the need for coding\"})}),\".\"]})]});\nexport const __FramerMetadata__ = {\"exports\":{\"richText13\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText8\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText3\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText1\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText19\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText7\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText12\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText20\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText14\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText2\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText10\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText11\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText5\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText18\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText17\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText6\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText16\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText9\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText15\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText4\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}"],
  "mappings": "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",
  "names": ["richText", "u", "x", "p", "ComponentPresetsConsumer", "t", "Youtube", "richText1", "richText2", "Link", "motion", "richText3", "richText4", "richText5", "richText6", "richText7", "richText8", "richText9", "richText10", "CodeBlock_default", "richText11", "richText12", "richText13", "richText14", "richText15", "richText16", "richText17", "richText18", "richText19", "richText20", "__FramerMetadata__"]
}
