<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by AutoExplore on Medium]]></title>
        <description><![CDATA[Stories by AutoExplore on Medium]]></description>
        <link>https://medium.com/@autoexplore?source=rss-24cd8d14e27b------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*o_UsvrRI1zAco4cb4fp2CA.png</url>
            <title>Stories by AutoExplore on Medium</title>
            <link>https://medium.com/@autoexplore?source=rss-24cd8d14e27b------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 11 Apr 2026 02:08:42 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@autoexplore/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Fastest open source Git GUI: Why We Built GitComet]]></title>
            <link>https://autoexplore.medium.com/fastest-open-source-git-gui-why-we-built-gitcomet-4b2eddf5a670?source=rss-24cd8d14e27b------2</link>
            <guid isPermaLink="false">https://medium.com/p/4b2eddf5a670</guid>
            <category><![CDATA[rust]]></category>
            <category><![CDATA[git]]></category>
            <category><![CDATA[gpui]]></category>
            <category><![CDATA[open-source]]></category>
            <category><![CDATA[desktop-app]]></category>
            <dc:creator><![CDATA[AutoExplore]]></dc:creator>
            <pubDate>Thu, 19 Mar 2026 11:05:24 GMT</pubDate>
            <atom:updated>2026-03-19T11:05:24.238Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/960/1*SeJs9mCqOnnROjyy6yWlEg.gif" /><figcaption>GitComet in action: browsing Linux repository and opening Chromium repo</figcaption></figure><h4>How frustration with huge repositories, deep histories, and hundred line diffs turned into a new Git GUI.</h4><p>To be fair there is no shortage of Git GUIs to choose from. On small repositories, many of them work great. But once we pointed them at massive codebases and large diffs, the experience changed fast; and not in a good way.</p><p>Some tools froze. Some consumed gigabytes of memory. Some turned simple code review into a system stress test.</p><p>We were looking for something fairly basic: a Git client that was free to use for both personal and commercial work, didn’t stray too far from a familiar workflow, and did not make the computer unresponsive or consume gigabytes of memory while opening history or reviewing changes.</p><p>We tried SmartGit, GitKraken, and several others. But after a few days of testing, we reached an uncomfortable conclusion: the tool we wanted did not really exist.</p><p>The problem was not that every existing product was bad. Some were polished. Some were powerful. But for our taste, they either pushed workflows that felt strange, or they stopped being responsive once the repository or diff got large enough.</p><h4>Could we build the tool?</h4><p>Around the same time, we had been trying out Zed. It stood out immediately because it felt fast, reponsive and visually clean. Zed runs on their own UI framework called GPUI and we decided to see whether GPUI could serve a Git GUI built around the same principles.</p><p>It was a good decision, but it also taught us something quickly: a fast UI framework alone does not make a fast Git client. You can build the most responsive shell but that alone does not really matter if the Git layer underneath it does not scale.</p><p>That is where <a href="https://github.com/GitoxideLabs/gitoxide">gix/gitoxide</a> comes in. We tried to use it wherever possible because it had already optimized many of the Git operations that matter in real use: cloning, fetching, status checks and reading / writing git information. When a required feature was not yet supported, we fell back to the local Git installation.<br>This hybrid approach allowed for performance without giving up compatibility.</p><h4>Designing for scale</h4><p><strong>The the first problem was large Git histories.</strong></p><p>Rendering huge commit lists naively was painfully slow. The solution will sound familiar to web developers: virtualization. Instead of rendering the entire history, GitComet renders only the visible area and reuses UI elements as you scroll. As a result, it looks like one long list, but the application only does work for what is actually on screen.<br>This solved part of the problem.</p><p><strong>The next big hurdle was large file diffs.</strong><br> <br>One of our stress tests was a 50 MB HTML file with roughly 500,000 lines and conflicts on nearly every line. This test was designed to expose every weak assumption in our diff viewer. Diffing is expensive. Syntax highlighting is expensive. Rendering is expensive. And doing all three naively is a good way to crash.</p><p><strong>In early iterations, cases like that crashed the application due to out of memory exception.</strong></p><p>The turning point came when we noticed that Zed could open very large files without completely falling apart. We looked into the how and streaming kept coming up as the key idea. So we pushed that idea through the whole pipeline. Not just file reading. Streaming the diff. Streaming syntax highlighting. Streaming content. Streaming rendering. The important lesson was that partial streaming is not enough. If one stage still assumes it can fully materialize everything in memory, the bottleneck just moves somewhere else. To make huge differences workable, the entire pipeline has to respect streaming from start to finish.<br>After a few iterations, it started to work.</p><h4>Why GitComet Exists</h4><p>We did not build it to be a Git GUI that looks good in a screenshot but struggles when the repository is real. We built it for the a moment when the history is deep, the diff is ugly, the files are large, and you still need realiable tool.</p><p><a href="https://gitcomet.dev/">GitComet</a> is our attempt to make Git tooling fast, familiar, local-first, open source, and free to use for both individuals and organizations.<br>We are now bringing GitComet to the public in its early form to gather feedback and ideas.<br> <br>We know there is still a lot to improve, and we are very much at the beginning. But the core idea is clear: speed is a feature, and Git tooling should never freeze.<br> <br>If this problem sounds familiar, we hope you will try GitComet and tell us where it helps, where it breaks, and what we should build next.</p><p>Website: <a href="https://gitcomet.dev/">https://gitcomet.dev/</a><br>Repository: <a href="https://github.com/Auto-Explore/GitComet">https://github.com/Auto-Explore/GitComet</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4b2eddf5a670" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Hidden Performance Killers in Axum, Tokio, Diesel, WebRTC, and Reqwest]]></title>
            <link>https://autoexplore.medium.com/hidden-performance-killers-in-axum-tokio-diesel-webrtc-and-reqwest-8b9660ad578d?source=rss-24cd8d14e27b------2</link>
            <guid isPermaLink="false">https://medium.com/p/8b9660ad578d</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[performance]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[rust]]></category>
            <dc:creator><![CDATA[AutoExplore]]></dc:creator>
            <pubDate>Wed, 08 Oct 2025 21:01:52 GMT</pubDate>
            <atom:updated>2025-10-09T17:06:50.146Z</atom:updated>
            <content:encoded><![CDATA[<p><strong>I want to emphasize that all the used technologies in the article are great, and the performance issues were caused by my own code on how I integrated them together.</strong></p><p>This month, I have been hunting mysterious performance issues in the AutoExplore stream functionality, and what I found surprised me.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/487/1*FQg_Itj6-FAijgzM3ZfPxg.png" /></figure><blockquote>I’m writing this article to share my findings with the community to make software better for everyone.</blockquote><p>It all started innocently enough…</p><h3>The Setup</h3><p>I had built a custom screencasting pipeline:<br><strong>Chromium WebRTC (video producer) → Rust WebRTC fan-out server → WebRTC browser (viewer)</strong>.</p><p>It worked beautifully.<br>Compared to Chromium’s default image-based streaming, latency dropped from seconds to milliseconds.<br>Perfect, right?</p><p>Well… almost.</p><h3>The First Symptom: Random Black Screens</h3><p>Everything looked smooth until the WebRTC stream started disconnecting randomly.<br>To users, this appeared as an occasional black screen.</p><p>Digging into the issue, I discovered the WebRTC protocol has a “NACK” / PLI feedback mechanism. The idea is simple:<br>When a client loses a keyframe, it sends a Picture Loss Indication (PLI) request to the producer, asking for a new one.</p><p>I added PLI support end-to-end viewer → server → producer and it helped.<br>The black screen now recovered automatically.</p><p>But I wasn’t satisfied. I wanted to eliminate the black screens entirely. It’s not a good user experience if there are black screens in the middle of a stream.</p><h3>Scaling Up… and Breaking Again</h3><p>As I increased the number of viewers, the problem returned, worse than before.<br>This time, even PLIs couldn’t recover the stream.</p><p>The chromium producer logs revealed this line:</p><blockquote>Timeout: No RTCP RR received.</blockquote><p>That led me to Chromium’s source <a href="https://source.chromium.org/chromium/chromium/src/+/refs/tags/142.0.7393.8:third_party/webrtc/modules/rtp_rtcp/source/rtcp_receiver.cc;l=294-300">https://source.chromium.org/chromium/chromium/src/+/refs/tags/142.0.7393.8:third_party/webrtc/modules/rtp_rtcp/source/rtcp_receiver.cc;l=294-300</a>, where I learned that RTCP Receiver Reports (RR) are crucial feedback packets that inform the sender what data has been received.</p><p>At first, I blamed my custom Chromium producer, maybe it wasn’t reading these packets properly.<br>But after some tests, I realized the real issue was on the Rust server side.</p><h3>The Culprit: `tokio::time::interval`</h3><p>The Rust WebRTC receiver was missing ticks and sending Receiver-Reports (RR) too late, in bursts.<br>That behavior came from <strong>tokio::time::interval</strong>, which defaults to <strong>MissedTickBehavior::Burst</strong>.</p><p>After switching to <strong>Skip</strong>, the bursts disappeared.<br>I sent a PR to webrtc-rs to patch it. 🎉 <a href="https://github.com/webrtc-rs/webrtc/pull/745">https://github.com/webrtc-rs/webrtc/pull/745</a></p><p>Progress! But still, under load, black screens persisted.</p><h3>Deep Dive: Network Layer &amp; Cryptography</h3><p>I started by optimizing the WebRTC layer:</p><p>- Switched to <strong>1-to-1 UDP4</strong> connections where possible<br>- Avoided unnecessary <strong>STUN/ICE</strong> servers<br>- Predefined codec negotiations</p><p>Still, no luck.</p><p>So I turned to <strong>profiling</strong> using <strong>perf + hotspot</strong> and <strong>valgrind + kcachegrind</strong>.<br>A huge chunk of time was being spent on HTTP/2 handshakes.</p><p>well… it was sort of expected.</p><p>Even though this traffic was all internal (Azure VNET), it was encrypted due to zero-trust policies.<br>After analyzing traces with GPT-5, it suggested:<br>👉 Try Elliptic Curve (EC) certificates instead of RSA.</p><p>I replaced RSA-2048 with EC P-256 — and boom, 50% faster handshakes. Thanks, GPT-5. 😄 (Elliptic Curve certificates are faster than RSA certificates but does not support old clients)</p><p>But sadly, the black screens persisted under load.</p><h3>Mystery of the Slow Reqwest Client</h3><p>Profiling again showed the <strong>reqwest</strong> client eating CPU cycles — even though it wasn’t part of the streaming logic!</p><p>Turned out, I was creating a new client in few places to handle custom certificates authentication and trust.<br>After reading the Reqwest source code, I realized that Client is just an `<strong>Arc&lt;ClientRef&gt;</strong>` internally, cheap to clone, expensive to create.</p><p>I refactored to use a single shared client, cloned wherever needed.</p><p>Result: CPU spikes were gone, handshakes were halved, and the app felt faster.<br>But… black screens? Still there.</p><h3>The Plot Twist: It Wasn’t WebRTC at All</h3><p>At this point, I suspected Azure networking. Maybe packet loss? Maybe VM throttling?<br>To isolate it, I ran everything offline locally, and it worked flawlessly…<br>Zero delay. Zero black screens. Even with many viewers.</p><p>Then, one late night, out of pure frustration, I started hammering F5 to refresh the browser UI while watching the stream playing perfectly.<br>And suddenly — <strong>BOOM! </strong>Black screens appeared locally.</p><p>That’s when I caught it in the profiler.</p><p>Everything looked familiar — CPU spikes, TLS handshakes, encryption…<br>But one new name stood out:<br><strong>diesel::pg::connection::result::PgResult::get</strong></p><p>Wait — the database?</p><h3>The True Villain Revealed</h3><p>The streaming logic barely touched the database after startup.<br>But I realized that whenever the DB was busy auto vacuuming, analyzing, or under load — everything else slowed down.</p><p>AutoExplore is a <strong>write-heavy </strong>system; AI agents are constantly generating data.<br>And <strong>Diesel’s blocking database queries</strong> were freezing the <strong>Tokio worker threads</strong>.</p><p>That single mistake caused a domino effect:</p><p>1. Diesel blocked a worker thread.<br>2. Axum server couldn’t serve new requests <br>3. Agent Reqwest client tried new handshakes <br>4. More encryption, more CPU time spent<br>5. More database connections waiting<br>6. Tokio’s pool jammed → missed WebRTC ticks → black screen occurred</p><p>All from synchronous DB calls inside an async runtime.</p><h3>The Fix: diesel_async</h3><p>I switched to <a href="https://github.com/weiznich/diesel_async"><strong>diesel_async</strong></a> and refactored all DB queries and connection handling and it changed everything.</p><p>Now, when a query stalls, only that task waits.<br>The server stays fully responsive.<br>No more black screens. No more lag. No more mystery.</p><h3>Results</h3><p>My custom WebRTC solution now streams smoothly — with millisecond latency — no hiccups, even under a heavy load.</p><p>And the side effect?<br><strong>The whole server became twice as fast.</strong></p><h3>TL;DR — Lessons Learned</h3><p>✅ Use one shared Reqwest client — it’s cheap to clone, expensive to create<br>✅ Prefer EC certificates (e.g., P-256) for faster internal HTTPS/TLS<br>✅ Never block Tokio threads — use <strong>diesel_async</strong> or equivalent for async DB access</p><p>What started as a simple black screen bug turned into a deep dive across the Rust async stack — <br>from WebRTC internals to cryptography, HTTP handshakes, and database drivers.</p><p>Sometimes, fixing performance killers feels like solving a detective mystery, one trace at a time. 😄</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=8b9660ad578d" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AutoExplore issue reporting]]></title>
            <link>https://autoexplore.medium.com/autoexplore-issue-reporting-9a6ec0a46215?source=rss-24cd8d14e27b------2</link>
            <guid isPermaLink="false">https://medium.com/p/9a6ec0a46215</guid>
            <category><![CDATA[llm]]></category>
            <category><![CDATA[testing]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[autonomous]]></category>
            <category><![CDATA[qa]]></category>
            <dc:creator><![CDATA[AutoExplore]]></dc:creator>
            <pubDate>Wed, 07 May 2025 13:11:29 GMT</pubDate>
            <atom:updated>2025-05-07T13:11:29.874Z</atom:updated>
            <content:encoded><![CDATA[<p>Autonomous testing without specified test cases creates a unique challenge for issue reporting. How to present the information about the found issues in a way that it is easy to understand and reproduce without overloading the user with too much information?</p><h3>Report categories</h3><p>During test agent execution, the agent tests and analyzes many different aspects of the service under test in parallel. These analyzed aspects include HTML markup, network traffic, rendered user interface, application logs, and many more. As the agent executes, without breaks or pauses, it quickly generates a lot of information about the application.</p><p>The main reports view tries to help navigate this issue list by categorizing similar types of issues into groups.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*p9fxLhhKZ-6kOlfw.png" /></figure><p>These categories are</p><ul><li><strong>Errors</strong> Uncaught Javascript exceptions, failed http requests, error logs from browser console.</li><li><strong>Audit</strong> Browser audit results, form validation issues, client side validation etc.</li><li><strong>Performance</strong> Performance related audits, network traffic performance, page load times and slow Javascript code.</li><li><strong>Deprecations</strong> Deprecated API usage, deprecated HTML elements, deprecated CSS properties.</li><li><strong>Accessibility</strong> Accessibility issues, missing aria attributes, missing alt attributes, low text contrast etc.</li><li><strong>Security</strong> Security issues, missing security headers, insecure http requests, insecure cookies.</li><li><strong>External</strong> Issues detected outside the configured application domain.</li><li><strong>Reasoning</strong> LLM reasoning results from the service under test</li><li><strong>Other</strong> Issues that do not fit into any of the above categories, for example: Agent getting stuck on a specific view.</li></ul><p>Each category can then be opened in a separate view that shows a list of issues that belong to that category. The list of issues is again grouped by the similarity of the issue. This allows counting how many times a similar issue has occurred and when it was first and last seen. Finally, selecting a group opens a detailed view of the issue.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*diqIWRprb7AqGrRs.png" /></figure><h3>Detailed view</h3><p>The detailed view shows the lowest level of details about the reported issue. It allows navigating through different variations of the same issue. It is useful to better understand the scope of the issue. If, for example, the same error has occurred on multiple pages, it can be related to a certain widget or a user flow.</p><p>Below the occurrence navigation menu, there is a timeline view that shows what the agent did during the selected occurrence and what happened on the application before and after the issue occurred. Timeline view allows navigating the agent steps using screenshots from the application, as well as understanding network race conditions by seeing when the network request started and when it finished. Certain issues only occur when network requests finish in an unexpected order.</p><p>Following the agent steps in the timeline view can help to understand the issue better and reproduce it, the steps can be easily followed even without technical knowledge.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*W6t8pgtGY43btWlF.png" /></figure><p>Finally, the detailed view shows the information about the issue itself. This information varies depending on the type of issue.</p><p>At AutoExplore, we are committed to helping R&amp;D teams implement autonomous testing as part of their development processes. Would you like to see what issues AutoExplore finds from your application? Contact us for a demo to learn more.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9a6ec0a46215" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Measuring AI Agent Coverage]]></title>
            <link>https://autoexplore.medium.com/measuring-ai-agent-coverage-d02ec36c3927?source=rss-24cd8d14e27b------2</link>
            <guid isPermaLink="false">https://medium.com/p/d02ec36c3927</guid>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[testing]]></category>
            <category><![CDATA[coverage]]></category>
            <dc:creator><![CDATA[AutoExplore]]></dc:creator>
            <pubDate>Thu, 17 Apr 2025 05:56:36 GMT</pubDate>
            <atom:updated>2025-04-17T05:56:36.927Z</atom:updated>
            <content:encoded><![CDATA[<p>Using an autonomous testing Agent introduces a new challenge, understanding what it has tested and what not. This information is needed for analyzing the effectiveness of the agent and identifying which areas of the target software are covered.</p><h3>Traditional test coverage metrics</h3><p>Typically test coverage is measured by analyzing the code, requirements or test cases.</p><ul><li><strong>Code coverage</strong> is typically calculated by analyzing the code and identifying which lines were executed during test runs. Tools instrument the code and keep track of code execution. Common code coverage metrics include branch coverage, statement coverage, function coverage, and line coverage.</li><li><strong>Test case coverage</strong> refers to how well test cases cover the system features. It is usually measured by mapping test cases to specific user stories using tracking tools.</li><li><strong>Requirement coverage</strong> measures which requirements are covered by test cases. Requirements can be functional of non-functional requirements.</li></ul><p>Autonomous software agent that tests the target software through a user interface does not know about requirements, source code or other test cases. This creates a challenge where traditional code coverage measurements are not applicable for measuring the coverage.</p><h3>UI coverage</h3><p>Since the agent interacts with the target software through a user interface by emulating keyboard and mouse events. It means the agent can only test the areas of the software that are visible in the user interface.</p><p>We used this gathered information as a basis for measuring the test coverage. All the elements detected by <strong>The Eye</strong> are presented on a screenshot from the user interface. Due to large number of elements AutoExplore coverage page now shows the elements categorized by URLs one screen at a time.</p><p>The elements are colored as follows:</p><ul><li><strong>Green</strong> The element was interacted by the agent on the current page.</li><li><strong>Yellow</strong> The element was interacted by the agent on another page.</li><li><strong>Gray</strong> The element has not been interacted by the agent on any page.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*bd9e-DrQJ64Udf8w.png" /></figure><p>Implementing visual coverage also provided us a way to verify Agent recognizes the elements correctly.</p><p>At AutoExplore, we are committed to helping R&amp;D teams implement autonomous testing as part of their development processes. Ready to transform your process? Contact us for a demo to learn more.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d02ec36c3927" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Comparing Autonomous Testing to Traditional Methods]]></title>
            <link>https://autoexplore.medium.com/comparing-autonomous-testing-to-traditional-methods-01385da5c254?source=rss-24cd8d14e27b------2</link>
            <guid isPermaLink="false">https://medium.com/p/01385da5c254</guid>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[autonomous-testing]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[AutoExplore]]></dc:creator>
            <pubDate>Thu, 27 Feb 2025 11:00:09 GMT</pubDate>
            <atom:updated>2025-02-27T11:00:09.624Z</atom:updated>
            <content:encoded><![CDATA[<p>Typical modern software development lifecycle testing includes large amounts of automated testing and some manual testing.<br>Due to recent advancements in AI and machine learning, autonomous testing is becoming more popular.<br>In this article, we will compare autonomous testing to traditional testing methods in terms of time to test, coverage, cost, effectiveness, and what challenges each has.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/896/1*iuexePfnQsMu8SsslSZ7GQ.png" /></figure><h3>Automated testing</h3><h4>Unit Testing</h4><p>Unit tests form the cornerstone of all automated software testing.<br>Software developers write unit tests to test individual components of the software.<br>Unit tests cover the smallest testable parts of the software, usually functions or methods, UI or backend.<br>Unit tests are highly effective for regression testing because they run quickly and efficiently. Additionally, when a unit test fails, it is typically easy to diagnose and resolve.</p><p>- <strong>Time to test</strong>: Moderate, Writing unit tests takes time. However, it can be lowered by using gen-AI to generate unit tests.<br>- <strong>Coverage</strong>: High, can cover all functions and methods in the software.<br>- <strong>Cost</strong>: Low, unit tests are usually easy to write and maintain.<br>- <strong>Effectiveness</strong>: High, unit tests are very effective at catching bugs early in the development process.<br>- <strong>Challenge</strong>: Writing good unit tests, requires a good understanding of the software and the ability to write testable code.</p><h4>Api Testing</h4><p>API tests are used to test the communication between different parts of the software, they typically test the backend and database.<br>API tests cover higher-level functionality than unit tests, and are still relatively easy to write and maintain.<br>However, API tests can be more difficult to reason and resolve than unit tests, as they cover more complex functionality.</p><p>- <strong>Time to test</strong>: Moderate, similar to unit-tests and it can be lowered using gen-AI to generate API tests.<br>- <strong>Coverage</strong>: Moderate, can cover all API endpoints in the software, misses the user interface.<br>- <strong>Cost</strong>: Moderate, API tests are more complex than unit tests, but still relatively easy to write and maintain.<br>- <strong>Effectiveness</strong>: High, as API tests also cover parts which are not covered by unit-tests f.e. database queries.<br>- <strong>Challenge</strong>: Covering more complex scenarios than a single endpoint requires orchestrating numerous requests which cause maintainability issues.</p><h4>Specialized Testing</h4><p>Integration, performance, and security tests are specialized tests that cover specific aspects of the software.<br>These tests are typically more complex and time-consuming to write and maintain than unit and API tests.</p><p>- <strong>Time to test</strong>: High, specialized tests usually require custom tooling, deep understanding of the software and used technology.<br>- <strong>Coverage</strong>: Low, covers only a very specific aspects of the software, such as integration, performance, and security.<br>- <strong>Cost</strong>: High, specialized tests require more effort to write and maintain.<br>- <strong>Effectiveness</strong>: Low, simulating production-like environment for tests is usually difficult.<br>- <strong>Challenge</strong>: Test environments and production environments differ by configurations, data and infrastructure. Specialized tests also require people capable doing them.</p><h4>End-to-end testing</h4><p>End-to-end tests are used to test the software as a whole, from the user interface to the backend and database.<br>These tests are typically implemented using a tool like Selenium or Cypress, which can simulate user interactions with the software.<br>End-to-end tests cover the highest level of functionality, but are also the most difficult to write and maintain.</p><p>- <strong>Time to test</strong>: High, writing these tests are slow due to the dynamic nature of applications and amount of interactions required to cover a simple process.<br>- <strong>Coverage</strong>: High, can cover all parts of the software, from the user interface to the backend and database.<br>- <strong>Cost</strong>: High, dynamic views, changing environments and evolving software cause unintentional maintenance to the tests. AI-assisted tools try to address this issue with self-healing tests with mixed results.<br>- <strong>Effectiveness</strong>: Moderate, end-to-end tests are prone to fail for unintentional reasons.<br>- <strong>Challenge</strong>: Writing and maintaining end-to-end tests is very time-consuming and requires high amount of maintenance effort especially if the software is in early development phase.</p><h3>Manual testing</h3><p>Manual testing is usually the last step in the testing process, and is used to test the software as a whole.<br>Often this step is left to the QA team, or domain experts, who are responsible for ensuring the software meets the requirements.<br>Typically manual testing phase is labeled as acceptance testing, as it is used to determine if the software is ready for release.</p><p>- <strong>Time to test</strong>: High, theoretically low, but in reality people have their schedule full of other work and tickets can wait days for testing.<br>- <strong>Coverage</strong>: High, can cover all parts of the software, together, or individually from the user interface to the backend and database.<br>- <strong>Cost</strong>: High, manual testing is very time-consuming and requires human intervention. People need training and time to learn the software and testing skills.<br>- <strong>Effectiveness</strong>: Moderate, manual testing can be effective when not done too often and people have right mindset for testing.<br>- <strong>Challenge</strong>: It depends on persons personal knowledge, it is very difficult to scale well and people get distracted easily, and yet human errors happen.</p><h3>Autonomous testing</h3><p>Autonomous testing is a new approach to software testing that uses AI and machine learning to automate the testing process.<br>Autonomous testing agents can work 24/7, and run multiple different testing in parallel.<br>Unlike other testing methods, no test cases are planned before the execution.<br>This makes the approach interesting as the agent can notice issues that were not thought at all during the development process.</p><p>- <strong>Time to test</strong>: Low, “click to run”.<br>- <strong>Coverage</strong>: Moderate, can cover the software from the user interface to the backend and database, however its ability to test complex process should be evaluated.<br>- <strong>Cost</strong>: Low, autonomous testing agents typically work without human intervention, no test cases are written or maintained.<br>- <strong>Effectiveness</strong>: High, autonomous testing agents can run multiple different tests in parallel, and learn from the past.<br>- <strong>Challenge</strong>: Autonomous testing agents needs to keep the number of false positive issues low to provide relevant feedback for the R&amp;D team.</p><p>Are you finding a high number of issues using manual testing? That might be an indication of issues earlier in the software development process. Autonomous testing can help you find these issues earlier and provide relevant feedback for the R&amp;D team.</p><p>At AutoExplore, we are committed to helping R&amp;D teams implement autonomous testing as part of their development processes. Ready to transform your process? Contact us for a demo to learn more.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=01385da5c254" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Autonomous Exploratory Testing in Agile Development]]></title>
            <link>https://autoexplore.medium.com/autonomous-exploratory-testing-in-agile-development-dadff4032689?source=rss-24cd8d14e27b------2</link>
            <guid isPermaLink="false">https://medium.com/p/dadff4032689</guid>
            <category><![CDATA[testing]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[quality-assurance]]></category>
            <category><![CDATA[agile-development]]></category>
            <category><![CDATA[autonomous-agent]]></category>
            <dc:creator><![CDATA[AutoExplore]]></dc:creator>
            <pubDate>Sun, 09 Feb 2025 12:06:16 GMT</pubDate>
            <atom:updated>2025-02-10T08:04:12.800Z</atom:updated>
            <content:encoded><![CDATA[<p>Agile development has become the standard for software teams aiming to deliver value quickly and to adapt to changing requirements. However, as the market competition is getting tougher, budgets are cut and release cycles shortened, quality assurance methods often struggle to keep up.</p><p>In this article, we will explore how autonomous testing can help agile teams to meet their goals and maintain high quality standards.</p><p>Agile methodologies prioritize iterative development, collaboration, and customer feedback. Teams work in sprints, delivering incremental updates to the product. However, this fast-paced environment often creates bottlenecks in the testing phase, where manual or scripted tests can’t keep up with the speed of development.</p><h4>Challenges</h4><ul><li>Automated tests are being skipped. This can happen due to tight schedules, lack of knowledge or simply ignorance.</li><li>Code test coverage is not the same as use case coverage. Code test coverage can be 100% while the real use cases are not fully covered.</li><li>When the whole team is not committed to ensure high quality or testing is delegated to another party, it can create a situation where defects are accepted as a norm.</li><li>If QA teams aren’t involved in software design, they may test without fully understanding how the program is meant to work.</li><li>Engineers use AI to generate code and the same AI to generate tests for the generated code. As a result, the team’s working agreement is easily fulfilled without paying attention to code quality.</li></ul><p>Usually people in R&amp;D dislike defects and aim for high quality software. Despite good will, defects still occur. In retrospect it is easy to argue that if had been more careful or had written one more test case to cover “X”, we could have prevented that specific defect. However, usually at that point the defect has already affected the client’s workflow and the damage is done. Luckily, there is something we can improve.</p><h4>What is Autonomous Exploratory Testing</h4><p>Autonomous testing leverages machine learning to automate the testing process. Unlike traditional test automation, it autonomously adapts to changes in the codebase, learns from the past, and executes tests without human intervention.</p><p>Autonomous exploratory testing can be used as an added layer to prevent defects slipping through to production. It can also be used to guide or pinpoint areas which need additional scripted tests for hardening the software. To better understand why autonomous exploratory testing is beneficial we can split defects into two categories.</p><h4>Technical defects</h4><p>Technical defects are something that can most of the time be programmatically decided if a given behavior is incorrect. Examples of these are page crashes, errors, missing security guards, broken UI layouts, infinite loops, major performance degradation or when standard or best practices are not followed.</p><h4>Substance incorrect behavior</h4><p>These defects require substance or domain knowledge to understand if the given functionality is incorrect in the given context. These types of defects could be something like a missing field, incorrect text or non-intentional user-flow. For a program to autonomously decide if any of the earlier statements is a defect it needs more information. It is possible a change was made to the software, and the behavior was intentionally changed and thus detecting these types of defects is more challenging for a computer.</p><h4>Where Autonomous Testing Shines</h4><p>Autonomous exploratory testing can help with detecting technical defects. It runs without engineers having to write test cases. It can automatically adapt to changes in the software without people spending their time writing or maintaining test cases. There are also areas where autonomous exploratory testing excels and even surpasses human capabilities. For example, how many times did YOU as a developer go through Owasp Top 10, while developing the new features or changing existing functionality? Did YOU as a full-stack engineer also assert that all the views in your web UI have the required accessibility attributes in place and keyboard control works as expected?</p><p>Autonomous testing can test these types of issues automatically and continuously throughout the whole target software. While the robot explores the system user interface or APIs it can scan all sorts of issues in the background. It is not limited to testing one type of a problem at a time. It can test your applications entry form and at the same time verify links, buttons and other UI elements are working, analyze network traffic for security vulnerabilities, assert the accessibility attributes, check for missing access controls, look for unexpected errors, test the keyboard input, validate HTML, measure the performance statistics to avoid regressions in the future and the list goes on.</p><p>This issue data can then be aggregated and prioritized for the R&amp;D team for further analysis. It can be scheduled before daily standup or provided before weekly release. It can also be used to alert the R&amp;D team in case of a major change in issue trends at any time.</p><h4>Limitations</h4><p>While it sounds great, there are also limitations. Autonomous exploratory testing is not good for regression testing. This is because as the robot continuously adapts to the latest changes, it needs to keep the number of false positive issues as low as possible to ensure high quality reports. It is not easy for a program to autonomously decide if a change in user interface is a defect or not. However, it can be used as a tool to provide input for R&amp;D team to then add traditional automated tests as needed to cover possible regression.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/721/1*2SwsxWdVcf3iQpyRDYR0rA.png" /></figure><p>At AutoExplore, we are committed to helping R&amp;D teams implement autonomous testing as part of their development processes. Ready to transform your process? Contact us at <a href="https://www.autoexplore.ai">https://www.autoexplore.ai</a> to learn more.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=dadff4032689" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>