{"id":8483,"date":"2026-10-07T09:27:24","date_gmt":"2026-10-07T09:27:24","guid":{"rendered":"https:\/\/dev95.site\/my-life-before-after-automated-testing\/"},"modified":"2026-10-07T09:27:24","modified_gmt":"2026-10-07T09:27:24","slug":"my-life-before-after-automated-testing","status":"publish","type":"post","link":"https:\/\/dev95.site\/ar\/my-life-before-after-automated-testing\/","title":{"rendered":"<div>My life before &#038; after automated testing<\/div>"},"content":{"rendered":"<div id=\"dev95-3356418536\" class=\"dev95-- dev95-entity-placement\"><script async=\"async\" data-cfasync=\"false\" src=\"https:\/\/pl27862732.profitableratecpmnetwork.com\/2ad7a50e0bbc23ac6801d7b77c501463\/invoke.js\"><\/script>\r\n<div id=\"container-2ad7a50e0bbc23ac6801d7b77c501463\"><\/div><\/div><div id=\"dev95-1215958512\" class=\"dev95-before-content dev95-entity-placement\"><p style=\"text-align: center;\"><strong>Stop wasting time on dead links! \ud83d\uded1 This smart platform automatically detects your device and country to give you the exact best offer instantly. Check it out now 100% free! \ud83d\udc47<\/strong><br data-sfc-root=\"ep\" data-sfc-pl=\"|||[]\" data-complete=\"true\" data-copy-service-computed-style=\"font-family: Arial, sans-serif, &quot;Noto Color Emoji&quot;; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);\" \/><a href=\"https:\/\/www.profitableratecpmnetwork.com\/pvhx5mbcc?key=ff7d362db3c20bc86fad685cc94f1fc4\">\ud83d\udd17 <strong class=\"rQesXe MPyX\" data-sfc-cp=\"\" data-sfc-root=\"ep\" data-complete=\"true\" aria-owns=\"action-menu-parent-container\" data-copy-service-computed-style=\"font-family: Arial, sans-serif, &quot;Noto Color Emoji&quot;; font-size: 16px; font-weight: 700; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);\">[Click here]<\/strong><\/a><\/p>\n<\/div><div>\n<p>It\u2019s hard for me to overstate how much my coding has improved since embracing automated testing. And yet, I used to think of it as a waste of time! This post is for my former self, demonstrating why I embrace the practice now.<\/p><div id=\"dev95-2737697838\" class=\"dev95- dev95-entity-placement\"><center>\r\n<script>\r\n  atOptions = {\r\n    'key' : '4ba6b6513c00e0ba76511f798ae56401',\r\n    'format' : 'iframe',\r\n    'height' : 50,\r\n    'width' : 320,\r\n    'params' : {}\r\n  };\r\n<\/script>\r\n<script src=\"https:\/\/www.highrevenueformat.com\/4ba6b6513c00e0ba76511f798ae56401\/invoke.js\"><\/script>\r\n\t<\/center><\/div>\n<p>Allow me to demonstrate with an example. Let\u2019s say I\u2019m adding job cancellation to a work queue. Jobs could be canceled at any time (including mid-execution), so it\u2019s complex and error prone. How do I make sure the code I wrote <strong>works<\/strong>?<\/p>\n<h1 id=\"before-automated-testing\">Before Automated Testing<\/h1>\n<p>I develop the feature piece-by-piece, manually testing it every once in a while.<\/p>\n<p>Manually testing is a pain. Each time, I have to reset the database and spin up the server; that takes a couple minutes, so I only fully test every time I\u2019ve hit a major checkpoint in the project. It\u2019s especially tricky to test cancellation during execution; I temporarily modify the code so that I can guarantee the system will be in the right state when I click the \u201ccancel\u201d button.<\/p>\n<p>The feature is almost done but\u2026 uh oh! I forgot to handle concurrency. During the refactor, I do an even more slapdash job of testing this time around, resulting in bugs that QA catches later.<\/p>\n<p>We eventually ship. Because there are <em>always<\/em> bugs, users run into one. I fix it, but only manually tested the fix itself. I don\u2019t regression test the rest of the feature, resulting in a new bug appearing in previously functional code. Oops!<\/p>\n<p>A few months later, a coworker writes a seemingly unrelated change to the database layer. It subtly breaks the work queue, and we spend a day trying to figure out why jobs are no longer cancelling.<\/p>\n<p>A year later, we add a \u201cpause\u201d feature to the job queue. This code lives side-by-side with cancellation. It\u2019s been a while, so I\u2019ve forgotten how to properly test the job queue, meaning I have to redevelop the manual tests from scratch. Inevitably, I forget to test some obscure corner cases and introduce subtle bugs that will bite me later.<\/p>\n<h1 id=\"after-automated-testing\">After Automated Testing<\/h1>\n<p>I write the tests first, then develop the feature while repeatedly verifying code using those tests.<\/p>\n<p>To start, I write empty function definitions for job cancellation. Next, I write automated tests that anticipate how job cancellation will work (targeting those empty functions). It\u2019s a slog, but it gives me a chance to think through the happy path + all corner cases I eventually want to handle. It\u2019s especially good for testing mid-execution cancellation &#8211; I can easily simulate any situation in code.<\/p>\n<p>Finally, I get around to implementing the actual feature. As I code, I constantly run my automated tests &#8211; at first, not even to verify it\u2019s correct, but to run a debugger through the half-finished code, to check that random snippets of code are doing what I expect. The tests run quickly &#8211; I don\u2019t have to spin up a whole server to verify the feature, I just run a small portion of the codebase at a time.<\/p>\n<p>Eventually, tests start passing. Even after a test passes, I realize I can make the coder cleaner or faster &#8211; small tweaks that can quickly be verified by my automed tests.<\/p>\n<p>Uh oh! I forgot about concurrency here as well. I add a few more tests relating to concurrency, then begin refactoring. As I refactor, all the old tests are still good, helping me check I didn\u2019t break any old behavior while handling concurrency.<\/p>\n<p>We ship the feature. Automated tests don\u2019t guarantee bug free code, so a customer still runs into a bug. I add a new test that reproduces the exact steps the customer ran into, then refactor the codebase until the test passes (as well as all my old tests).<\/p>\n<p>A few months later, a coworker is working on a seemingly unrelated database change. When she runs all the tests, she discovers that she\u2019s accidentally broken job cancellation. She fixes the problem before it even hits code review.<\/p>\n<p>A year later, we decide to add a job <em>pausing<\/em> feature. I write a bunch more tests, but feel relatively confident that I won\u2019t accidentally break existing cancellation code because all the old tests still run regularly.<\/p>\n<h1 id=\"benefits\">Benefits<\/h1>\n<p>From these stories, there are two key benefits of automated testing I want to highlight:<\/p>\n<p><strong>Tight feedback loops during development<\/strong> &#8211; Notice the time difference between \u201cwriting code\u201d and \u201ctesting.\u201d When I\u2019m doing manual testing, the cost is so high to test that I only do it every once in a while. With automated testing, I am <strong>constantly<\/strong> running tests on new code.<\/p>\n<p>That makes a huge difference on feedback timing. Tight feedback loops can be all the difference between strong and weak code because it\u2019s much easier to course correct if you\u2019re constantly getting nudges in the right direction. If your feedback loop is large (e.g. every few hours\/days) then it\u2019s much harder to turn the ship around once you find out you\u2019re doing something wrong.<\/p>\n<p>Did the last few lines of code I wrote help? If it took 5 minutes to manually test it, I probably wouldn\u2019t bother finding out. With automated testing, why not try it! Worst-case scenario, I run the tests in the background and forget about them; they don\u2019t interrupt my flow. And commonly, being able to run the tests constantly lets me move faster because I feel more confident in the code I just wrote.<\/p>\n<p><strong>Quick, cheap, &amp; consistent regression testing<\/strong> &#8211; One big difference in the two stories is how often I go back to test that something <em>still<\/em> works. The cost for manual regression testing is high, so I stop bothering at some point, opening up a pathway for bugs. It\u2019s also inconsistent &#8211; there\u2019s no guarantee I tested the code the same way each time when I do it myself.<\/p>\n<p>By contrast, with automated testing, it costs me almost nothing to repeatedly run regression tests. Sure, there was the high upfront cost of writing the tests, but that cost is amortized over the long development cycle of the feature. Eventually, it\u2019s far <em>cheaper<\/em> for me to have written the tests, because regression testing is always needed.<\/p>\n<p>On top of that, the automated tests make refactoring safer. We\u2019re repeatedly running into bugs &#8211; that happens regardless of automated tests &#8211; but with automated tests, when I fix them, I can be assured I didn\u2019t break any other existing behavior. That\u2019s why <a href=\"https:\/\/martinfowler.com\/books\/refactoring.html?ref=blog.danlew.net\"><u>Martin Fowler\u2019s \u201cRefactoring\u201d<\/u><\/a> essentially boils down to \u201cwrite tests, then refactor.\u201d<\/p>\n<p>Also, these regression tests don\u2019t just help me &#8211; they help <em>everyone<\/em>, even people who know nothing about this feature. Notice above how the regression test informed a coworker they\u2019d accidentally broken this feature. Not only does it catch the bug early, but when they go to fix it, the tests themselves act as documentation of how the feature is used.<\/p>\n<hr>\n<p>The two benefits above are what have dramatically changed how I develop code. While working on a feature, I\u2019ve got tight feedback loops, speeding up development. After releasing it, I\u2019ve got regression testing to ensure the code continues to work.<\/p>\n<p>This post is long enough already, but there are other benefits to automated testing I want to call out as well:<\/p>\n<p><strong>Ability to set up complex situations in tests<\/strong> &#8211; manually testing all corner cases is tricky. Automated testing lets you craft the perfect path to reproduce rare circumstances.<\/p>\n<p><strong>Backbone of CI\/CD<\/strong> &#8211; If you want the benefits of continuous deployment, you\u2019re gonna need automated tests to reduce risk of regressions.<\/p>\n<p><strong>Better code architecture<\/strong> &#8211; adapting code for automated testing improves code design. This idea could be a long post on its own, so you\u2019ll just have to trust me on this one, but it\u2019s true!<\/p>\n<h1 id=\"warnings-caveats\">Warnings \/ Caveats<\/h1>\n<p>Automated testing is a tool, and like all tools, it can be used incorrectly. I could leave food in the oven all day and burn down my house. That doesn\u2019t mean the oven is a bad tool, I just used it poorly!<\/p>\n<p>This lens is how I view most complaints I\u2019ve heard about automated testing. Like, yeah, if you use it in a shitty way, it\u2019ll feel really bad! So\u2026 don\u2019t?<\/p>\n<p>Here\u2019s some warnings \/ caveats:<\/p>\n<p><strong>You still need manual testing!<\/strong> A test is only as good as it\u2019s written, and tests can be bad \/ not cover all situations. You still need to do manual testing to make sure the test was written <em>correctly<\/em>.<\/p>\n<p><strong>Don\u2019t religiously test everything.<\/strong> There are some code paths where you get a ton of bang for your buck when testing, but others you might get minimal returns, or even negative returns (if you have to bend over backwards to make testing work). Start strategically testing where it helps the most, and expand the test coverage only as necessary.<\/p>\n<p><strong>Kill flakey tests!<\/strong> A test that randomly passes sometimes is worse than no test at all. Flakey tests should be fixed or deleted; they don\u2019t help anyone by sticking around.<\/p>\n<p><strong>Don\u2019t spend all your time writing tests for existing code.<\/strong> A lot of people who first start adopting automated tests feel obligated to go back and write tests for existing code. You lose a <em>lot<\/em> of the advantages of automated testing this way (all the \u201cdevelopment\u201d parts of it), plus the code probably already works. Instead, only write automated tests for new code OR before you refactor old code.<\/p>\n<p><strong>Avoid combinatorial explosions. <\/strong>Ideally, you mostly want to test isolated parts of the codebase. If you include too many code paths in one test, then testing all variations of that code path results in a huge number of tests (see: <a href=\"https:\/\/blog.thecodewhisperer.com\/permalink\/integrated-tests-are-a-scam?ref=blog.danlew.net\"><u>Beware the Integrated Tests Scam<\/u><\/a>).<\/p>\n<h1 id=\"getting-started\">Getting Started<\/h1>\n<p>If you\u2019re just getting into it, know that automated testing does NOT have to be an all-or-nothing activity. Start small, with whatever gets you the most bang for your buck. Start where it\u2019s easy to test, instead of trying to cover everything. Gradually, as you get more comfortable with writing automated tests, you can expand.<\/p>\n<p>Eventually, you\u2019ll wonder how you ever got by without good automated tests.<\/p>\n<\/div>\n<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_8483\" class=\"pvc_stats total_only  \" data-element-id=\"8483\" style=\"\"><i class=\"pvc-stats-icon large\" aria-hidden=\"true\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"far\" data-icon=\"chart-bar\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\" class=\"svg-inline--fa fa-chart-bar fa-w-16 fa-2x\"><path fill=\"currentColor\" d=\"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\" class=\"\"><\/path><\/svg><\/i> <img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/i0.wp.com\/dev95.site\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif?resize=16%2C16&#038;ssl=1\" border=0 \/><\/p>\n<div class=\"pvc_clear\"><\/div>\n<div id=\"dev95-1786817397\" class=\"dev95-after-content dev95-entity-placement\"><p style=\"text-align: center;\"><strong>Finally, a link that actually works for your region and device! \ud83c\udf0d Get instant access to the top exclusive offers tailored just for you right now. Don&#8217;t miss out, click here! \ud83d\udc47<\/strong><br data-sfc-root=\"ep\" data-sfc-pl=\"|||[]\" data-complete=\"true\" data-copy-service-computed-style=\"font-family: Arial, sans-serif, &quot;Noto Color Emoji&quot;; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);\" \/><a href=\"https:\/\/www.profitableratecpmnetwork.com\/uzeja8ahze?key=bc876be53d6ad0ff6370ab8ea030e479\"><strong>\ud83d\udd17 [Click here]<\/strong><\/a><\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>It\u2019s hard for me to overstate how much my coding has improved since embracing automated testing. And yet, I used to think of it as a waste of time! This post is for my former self, demonstrating why I embrace<\/p>\n<div class=\"hosteria-entry-more\"><a href=\"https:\/\/dev95.site\/ar\/my-life-before-after-automated-testing\/\" class=\"no-underline font-light  group-hover:text-primary-800 dark:group-hover:text-primary-300 py-1\">Read more &gt;&gt;&gt;<\/a><\/div>\n<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_8483\" class=\"pvc_stats total_only\" data-element-id=\"8483\" style=\"\"><i class=\"pvc-stats-icon large\" aria-hidden=\"true\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"far\" data-icon=\"chart-bar\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewbox=\"0 0 512 512\" class=\"svg-inline--fa fa-chart-bar fa-w-16 fa-2x\"><path fill=\"currentColor\" d=\"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\" class=\"\"><\/path><\/svg><\/i> <img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/dev95.site\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif\" border=\"0\" \/><\/p>\n<div class=\"pvc_clear\"><\/div>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fp_fajr_begins":"","fp_fajr_iqamah":"","fp_dhuhr_begins":"","fp_dhuhr_iqamah":"","fp_asr_begins":"","fp_asr_iqamah":"","fp_maghrib_begins":"","fp_maghrib_iqamah":"","fp_isha_begins":"","fp_isha_iqamah":"","fp_midnight":"","fp_midnight_name":"","fp_sunrise":"","fp_single_prayer_begins_title":"","fp_single_prayer_iqamah_title":"","fp_prayer_times_for_today":"","fp_hijra_date":"","fp_fajr_name":"","fp_dhuhr_name":"","fp_asr_name":"","fp_maghrib_name":"","fp_isha_name":"","fp_sunrise_name":"","fp_currentDate":"","fp_current_time":"","fp_current_title":"","fp_current_location":"","fp_masjid_name":"","fp_prayer_title":"","fp_next_prayer_iqamah_time":"","fp_next_prayer_iqamah_title":"","fp_next_prayer_begins_time":"","fp_next_prayer_begins_title":"","fp_next_prayer_title":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[9],"tags":[],"class_list":["post-8483","post","type-post","status-publish","format-standard","hentry","category-android"],"a3_pvc":{"activated":true,"total_views":0,"today_views":0},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>My life before &amp; after automated testing - Dev95<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/dev95.site\/ar\/my-life-before-after-automated-testing\/\" \/>\n<meta property=\"og:locale\" content=\"ar_AR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"My life before &amp; after automated testing - Dev95\" \/>\n<meta property=\"og:description\" content=\"It\u2019s hard for me to overstate how much my coding has improved since embracing automated testing. And yet, I used to think of it as a waste of time! This post is for my former self, demonstrating why I embraceRead more &gt;&gt;&gt;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/dev95.site\/ar\/my-life-before-after-automated-testing\/\" \/>\n<meta property=\"og:site_name\" content=\"Dev95\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-07T09:27:24+00:00\" \/>\n<meta name=\"author\" content=\"dev95\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u0643\u064f\u062a\u0628 \u0628\u0648\u0627\u0633\u0637\u0629\" \/>\n\t<meta name=\"twitter:data1\" content=\"dev95\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u0648\u0642\u062a \u0627\u0644\u0642\u0631\u0627\u0621\u0629 \u0627\u0644\u0645\u064f\u0642\u062f\u0651\u0631\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 \u062f\u0642\u0627\u0626\u0642\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/dev95.site\\\/my-life-before-after-automated-testing\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/my-life-before-after-automated-testing\\\/\"},\"author\":{\"name\":\"dev95\",\"@id\":\"https:\\\/\\\/dev95.site\\\/#\\\/schema\\\/person\\\/b807805ffe2916206b04d0938bce0298\"},\"headline\":\"My life before &#038; after automated testing\",\"datePublished\":\"2026-10-07T09:27:24+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/my-life-before-after-automated-testing\\\/\"},\"wordCount\":1736,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/#organization\"},\"articleSection\":[\"Android\"],\"inLanguage\":\"ar\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/dev95.site\\\/my-life-before-after-automated-testing\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/dev95.site\\\/my-life-before-after-automated-testing\\\/\",\"url\":\"https:\\\/\\\/dev95.site\\\/my-life-before-after-automated-testing\\\/\",\"name\":\"My life before & after automated testing - Dev95\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/#website\"},\"datePublished\":\"2026-10-07T09:27:24+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/my-life-before-after-automated-testing\\\/#breadcrumb\"},\"inLanguage\":\"ar\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/dev95.site\\\/my-life-before-after-automated-testing\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/dev95.site\\\/my-life-before-after-automated-testing\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/dev95.site\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"My life before &#038; after automated testing\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/dev95.site\\\/#website\",\"url\":\"https:\\\/\\\/dev95.site\\\/\",\"name\":\"Dev95\",\"description\":\"A comprehensive platform for data and knowledge, delivering reliable content that meets the aspirations of readers and enthusiasts.\",\"publisher\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/dev95.site\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ar\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/dev95.site\\\/#organization\",\"name\":\"Dev95\",\"url\":\"https:\\\/\\\/dev95.site\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ar\",\"@id\":\"https:\\\/\\\/dev95.site\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/dev95.site\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/rbrrbr-6.png?fit=512%2C512&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/dev95.site\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/rbrrbr-6.png?fit=512%2C512&ssl=1\",\"width\":512,\"height\":512,\"caption\":\"Dev95\"},\"image\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/dev95.site\\\/#\\\/schema\\\/person\\\/b807805ffe2916206b04d0938bce0298\",\"name\":\"dev95\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ar\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a70a73d950838b20cd80d7ebdc955737e802e8cd896044c5473b32b946c0662a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a70a73d950838b20cd80d7ebdc955737e802e8cd896044c5473b32b946c0662a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a70a73d950838b20cd80d7ebdc955737e802e8cd896044c5473b32b946c0662a?s=96&d=mm&r=g\",\"caption\":\"dev95\"},\"url\":\"https:\\\/\\\/dev95.site\\\/ar\\\/author\\\/mohammad\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"My life before & after automated testing - Dev95","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/dev95.site\/ar\/my-life-before-after-automated-testing\/","og_locale":"ar_AR","og_type":"article","og_title":"My life before & after automated testing - Dev95","og_description":"It\u2019s hard for me to overstate how much my coding has improved since embracing automated testing. And yet, I used to think of it as a waste of time! This post is for my former self, demonstrating why I embraceRead more &gt;&gt;&gt;","og_url":"https:\/\/dev95.site\/ar\/my-life-before-after-automated-testing\/","og_site_name":"Dev95","article_published_time":"2026-10-07T09:27:24+00:00","author":"dev95","twitter_card":"summary_large_image","twitter_misc":{"\u0643\u064f\u062a\u0628 \u0628\u0648\u0627\u0633\u0637\u0629":"dev95","\u0648\u0642\u062a \u0627\u0644\u0642\u0631\u0627\u0621\u0629 \u0627\u0644\u0645\u064f\u0642\u062f\u0651\u0631":"9 \u062f\u0642\u0627\u0626\u0642"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/dev95.site\/my-life-before-after-automated-testing\/#article","isPartOf":{"@id":"https:\/\/dev95.site\/my-life-before-after-automated-testing\/"},"author":{"name":"dev95","@id":"https:\/\/dev95.site\/#\/schema\/person\/b807805ffe2916206b04d0938bce0298"},"headline":"My life before &#038; after automated testing","datePublished":"2026-10-07T09:27:24+00:00","mainEntityOfPage":{"@id":"https:\/\/dev95.site\/my-life-before-after-automated-testing\/"},"wordCount":1736,"commentCount":0,"publisher":{"@id":"https:\/\/dev95.site\/#organization"},"articleSection":["Android"],"inLanguage":"ar","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/dev95.site\/my-life-before-after-automated-testing\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/dev95.site\/my-life-before-after-automated-testing\/","url":"https:\/\/dev95.site\/my-life-before-after-automated-testing\/","name":"My life before & after automated testing - Dev95","isPartOf":{"@id":"https:\/\/dev95.site\/#website"},"datePublished":"2026-10-07T09:27:24+00:00","breadcrumb":{"@id":"https:\/\/dev95.site\/my-life-before-after-automated-testing\/#breadcrumb"},"inLanguage":"ar","potentialAction":[{"@type":"ReadAction","target":["https:\/\/dev95.site\/my-life-before-after-automated-testing\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/dev95.site\/my-life-before-after-automated-testing\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/dev95.site\/"},{"@type":"ListItem","position":2,"name":"My life before &#038; after automated testing"}]},{"@type":"WebSite","@id":"https:\/\/dev95.site\/#website","url":"https:\/\/dev95.site\/","name":"Dev95","description":"\u0645\u0646\u0635\u0629 \u0634\u0627\u0645\u0644\u0629 \u0644\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0648\u0627\u0644\u0645\u0639\u0631\u0641\u0629\u060c \u062a\u0642\u062f\u0645 \u0645\u062d\u062a\u0648\u0649\u064b \u0645\u0648\u062b\u0648\u0642\u0627\u064b \u064a\u0644\u0628\u064a \u062a\u0637\u0644\u0639\u0627\u062a \u0627\u0644\u0642\u0631\u0627\u0621 \u0648\u0627\u0644\u0645\u0647\u062a\u0645\u064a\u0646.","publisher":{"@id":"https:\/\/dev95.site\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/dev95.site\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ar"},{"@type":"Organization","@id":"https:\/\/dev95.site\/#organization","name":"Dev95","url":"https:\/\/dev95.site\/","logo":{"@type":"ImageObject","inLanguage":"ar","@id":"https:\/\/dev95.site\/#\/schema\/logo\/image\/","url":"https:\/\/i0.wp.com\/dev95.site\/wp-content\/uploads\/2026\/07\/rbrrbr-6.png?fit=512%2C512&ssl=1","contentUrl":"https:\/\/i0.wp.com\/dev95.site\/wp-content\/uploads\/2026\/07\/rbrrbr-6.png?fit=512%2C512&ssl=1","width":512,"height":512,"caption":"Dev95"},"image":{"@id":"https:\/\/dev95.site\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/dev95.site\/#\/schema\/person\/b807805ffe2916206b04d0938bce0298","name":"dev95","image":{"@type":"ImageObject","inLanguage":"ar","@id":"https:\/\/secure.gravatar.com\/avatar\/a70a73d950838b20cd80d7ebdc955737e802e8cd896044c5473b32b946c0662a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/a70a73d950838b20cd80d7ebdc955737e802e8cd896044c5473b32b946c0662a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a70a73d950838b20cd80d7ebdc955737e802e8cd896044c5473b32b946c0662a?s=96&d=mm&r=g","caption":"dev95"},"url":"https:\/\/dev95.site\/ar\/author\/mohammad\/"}]}},"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/posts\/8483","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/comments?post=8483"}],"version-history":[{"count":0,"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/posts\/8483\/revisions"}],"wp:attachment":[{"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/media?parent=8483"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/categories?post=8483"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/tags?post=8483"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}