<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Harshad Lambate</title>
    <description>The latest articles on DEV Community by Harshad Lambate (@harshad_lambate).</description>
    <link>https://dev.to/harshad_lambate</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4166856%2Fea776e47-47f2-4c43-9613-fbaa0fa23e2d.jpg</url>
      <title>DEV Community: Harshad Lambate</title>
      <link>https://dev.to/harshad_lambate</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/harshad_lambate"/>
    <language>en</language>
    <item>
      <title>workday-autofill – fill Workday/Lever/Greenhouse job applications once, reuse your answers everywhere</title>
      <dc:creator>Harshad Lambate</dc:creator>
      <pubDate>Fri, 30 Oct 2026 04:53:37 +0000</pubDate>
      <link>https://dev.to/harshad_lambate/workday-autofill-fill-workdaylevergreenhouse-job-applications-once-reuse-your-answers-2j10</link>
      <guid>https://dev.to/harshad_lambate/workday-autofill-fill-workdaylevergreenhouse-job-applications-once-reuse-your-answers-2j10</guid>
      <description>&lt;p&gt;Every company on Workday = new account + the same 7 pages again: name, address, work experience, education, "how did you hear about us", notice period, sponsorship...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;workday-autofill&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fills Workday, Lever and Greenhouse applications from your profile&lt;/li&gt;
&lt;li&gt;asks each new question once and remembers it everywhere&lt;/li&gt;
&lt;li&gt;runs multiple applications in parallel, with a queue&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;wdautofill search&lt;/code&gt; finds recent jobs on company career sites for your city + keywords&lt;/li&gt;
&lt;li&gt;per-company cover letter from your template&lt;/li&gt;
&lt;li&gt;never clicks Submit — you review everything&lt;/li&gt;
&lt;li&gt;Runs locally, no subscription. AI optional (free Groq/Gemini or offline Ollama).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Early version — built it during my own job search. If a site doesn't fill, open an issue with the debug file and I'll fix it.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/HarshadLambate/workday-autofill" rel="noopener noreferrer"&gt;https://github.com/HarshadLambate/workday-autofill&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftdqjn027zyo3trrq2593.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftdqjn027zyo3trrq2593.png" alt="sample" width="800" height="613"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>hiring</category>
      <category>automation</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>I built a free HTML test reporter for Playwright, Jest, Vitest and Cucumber.js that automatically captures API calls, screenshots and retries</title>
      <dc:creator>Harshad Lambate</dc:creator>
      <pubDate>Mon, 19 Oct 2026 05:24:01 +0000</pubDate>
      <link>https://dev.to/harshad_lambate/i-built-a-free-html-test-reporter-for-playwright-jest-vitest-and-cucumberjs-that-automatically-228p</link>
      <guid>https://dev.to/harshad_lambate/i-built-a-free-html-test-reporter-for-playwright-jest-vitest-and-cucumberjs-that-automatically-228p</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy1kibremk46z29p882b4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy1kibremk46z29p882b4.png" alt="sample report" width="800" height="547"&gt;&lt;/a&gt;&lt;br&gt;
When a test fails in CI, I usually end up asking the same questions:&lt;/p&gt;

&lt;p&gt;What did the API actually return?&lt;br&gt;
What was on the screen when it failed?&lt;br&gt;
Did it fail on the first try, or only on the retry?&lt;br&gt;
Is this test flaky, or did something really break?&lt;/p&gt;

&lt;p&gt;The default reports show the assertion and the stack trace, so the rest means adding console.logs, rerunning locally, or digging through traces.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;Ace Reports:&lt;/strong&gt; one self-contained HTML file per run, with all of that &lt;strong&gt;captured automatically&lt;/strong&gt;. It already existed for .NET, Java and Python, and it’s now on npm for TypeScript/JavaScript.&lt;/p&gt;

&lt;p&gt;Live demo report: &lt;a href="https://harshadlambate.github.io/AceReportsWebsite/demo.html" rel="noopener noreferrer"&gt;https://harshadlambate.github.io/AceReportsWebsite/demo.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What it captures, without changing your tests&lt;br&gt;
&lt;strong&gt;Every API call:&lt;/strong&gt; method, URL, request and response bodies, status and duration. It hooks Node’s http/https and the global fetch, so it covers axios, fetch, got, supertest, node-fetch, ky and Playwright’s request fixture. It also covers calls made through your own API client wrappers and vendor SDKs, with nothing to wrap. Authorization and cookie headers are redacted.&lt;br&gt;
&lt;strong&gt;A screenshot on failure&lt;/strong&gt;, taken before teardown closes the browser. It finds the page by itself: Playwright’s page fixture, a Vitest test.extend page, a Cucumber World’s this.page, or the jest-playwright global.&lt;br&gt;
&lt;strong&gt;Retries and flaky tests&lt;/strong&gt;: every attempt is its own tab with its own logs, error, API calls and screenshots. A test that passes after a failed attempt is marked flaky instead of quietly showing green.&lt;br&gt;
Logs:&lt;br&gt;
Playwright test.step, actions and expects.&lt;br&gt;
&lt;strong&gt;Cucumber Given/When/Then steps&lt;/strong&gt;, with doc strings and data tables.&lt;br&gt;
console.log output, placed under the test that wrote it.&lt;br&gt;
Search, filters and categories: filter by status or tag, search by name, and click a category bar to narrow the table.&lt;br&gt;
&lt;strong&gt;One HTML file, no server&lt;/strong&gt;: attach it to a ticket, email it, or keep it as a CI artifact.&lt;br&gt;
How to use it&lt;/p&gt;

&lt;p&gt;Playwright Test: one line.&lt;/p&gt;

&lt;p&gt;ts&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// playwright.config.ts&lt;/span&gt;
&lt;span class="nx"&gt;reporter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;list&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@acereports/playwright&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jest: two lines.&lt;/p&gt;

&lt;p&gt;js&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// jest.config.js&lt;/span&gt;
&lt;span class="nx"&gt;reporters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;default&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@acereports/jest&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="nx"&gt;setupFilesAfterEnv&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@acereports/jest/setup&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vitest: two lines.&lt;/p&gt;

&lt;p&gt;ts&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// vitest.config.ts&lt;/span&gt;
&lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;reporters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;default&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@acereports/vitest&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="nx"&gt;setupFiles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@acereports/vitest/setup&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cucumber.js: two lines.&lt;/p&gt;

&lt;p&gt;js&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// cucumber.js&lt;/span&gt;
&lt;span class="nx"&gt;plugin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@acereports/cucumber&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="nx"&gt;requireModule&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@acereports/cucumber/support&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install with npm i -D @acereports/playwright (or /jest, /vitest, /cucumber). Run your tests as usual, and the report is written to TestResults/AceReport_.html.&lt;/p&gt;

&lt;p&gt;To add your own lines or screenshots:&lt;/p&gt;

&lt;p&gt;ts&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ace&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@acereports/playwright&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;ace&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Submitting payment&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;ace&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;takeScreenshot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;After login&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Retries come from what you already use: Playwright retries, jest.retryTimes, Vitest retry, or cucumber-js --retry. Parallel workers end up in one report.&lt;/p&gt;

&lt;p&gt;Limitations&lt;br&gt;
It doesn’t see HTTP/2 calls made with the http2 module, or gRPC.&lt;br&gt;
Vitest is supported in Node mode only, not browser mode.&lt;br&gt;
Requires Node 18+, Playwright 1.40+, Jest 29+, Vitest 3+ and Cucumber.js 10+.&lt;/p&gt;

&lt;p&gt;It’s free to use, including at work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://harshadlambate.github.io/AceReportsWebsite/" rel="noopener noreferrer"&gt;https://harshadlambate.github.io/AceReportsWebsite/&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;npm:&lt;/strong&gt; &lt;a href="https://www.npmjs.com/package/@acereports/playwright" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@acereports/playwright&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’d really like feedback: what’s missing from your current test reports, and which HTTP client or framework should I support next?&lt;/p&gt;

</description>
      <category>automation</category>
      <category>javascript</category>
      <category>playwright</category>
      <category>testing</category>
    </item>
    <item>
      <title>Your test passed on retry. Your report should say so.</title>
      <dc:creator>Harshad Lambate</dc:creator>
      <pubDate>Thu, 15 Oct 2026 15:28:16 +0000</pubDate>
      <link>https://dev.to/harshad_lambate/your-test-passed-on-retry-your-report-should-say-so-19b8</link>
      <guid>https://dev.to/harshad_lambate/your-test-passed-on-retry-your-report-should-say-so-19b8</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F68zexpc1xp4zit2xxl0w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F68zexpc1xp4zit2xxl0w.png" alt="Sample Report" width="800" height="547"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most Java test suites have a retry somewhere: an IRetryAnalyzer in TestNG, @RetryingTest from JUnit Pioneer, or Surefire’s rerunFailingTestsCount. Retries keep pipelines green. They also hide information.&lt;/p&gt;

&lt;p&gt;When a test fails, gets retried and passes, most reports show one word: Passed. The failure that happened two minutes earlier, along with its stack trace, its API calls and the screenshot of what the browser showed, is gone. The test is flaky, and the report hides it.&lt;/p&gt;

&lt;p&gt;The second problem is quieter. To get a useful report, teams end up writing reporting code inside their tests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="n"&gt;java&lt;/span&gt;
&lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;log&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Status&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;INFO&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Calling POST /users"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;log&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Status&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;INFO&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Response: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;asString&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;span class="nc"&gt;Allure&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addAttachment&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Screenshot"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ByteArrayInputStream&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;png&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That code isn’t testing anything. People forget to add it, it drifts out of date, and it lands in every test for the rest of the project’s life.&lt;/p&gt;

&lt;p&gt;I built Ace Reports to fix both problems. Here’s what it does in Java.&lt;/p&gt;

&lt;p&gt;One dependency, no reporting code&lt;br&gt;
xml&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;`&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;io.github.acereports&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;acereports-junit5&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;  &lt;span class="c"&gt;&amp;lt;!-- or acereports-testng / acereports-cucumber --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.1.0&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;scope&amp;gt;&lt;/span&gt;test&lt;span class="nt"&gt;&amp;lt;/scope&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;`&lt;/p&gt;

&lt;p&gt;There are no listeners to register, no base class and no annotations. Run mvn test as usual, and a single self-contained HTML file appears in TestResults/.&lt;/p&gt;

&lt;p&gt;Every attempt keeps its own history&lt;/p&gt;

&lt;p&gt;A test that fails and then passes on a retry is shown as flaky, with one tab per attempt. Each attempt keeps:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;its own log lines,&lt;br&gt;
its own error and stack trace,&lt;br&gt;
its own API calls,&lt;br&gt;
its own screenshots.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So when attempt 1 timed out and attempt 2 passed, you can see exactly what was different. Pass, fail, flaky and retried counts sit at the top of the report.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;API calls are recorded automatically&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is a typical API test with no reporting code in it:&lt;/p&gt;

&lt;p&gt;java&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`java&lt;br&gt;
class UsersApiTest {&lt;br&gt;
    private final HttpClient client = HttpClient.newHttpClient();&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Test
void createsUser() throws Exception {
    HttpResponse&amp;lt;String&amp;gt; response = client.send(
        HttpRequest.newBuilder(URI.create("https://reqres.in/api/users"))
            .header("Content-Type", "application/json")
            .POST(HttpRequest.BodyPublishers.ofString("{\"name\":\"John\"}"))
            .build(),
        HttpResponse.BodyHandlers.ofString());
    assertEquals(201, response.statusCode());
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The report’s API tab for this test shows the method, URL, request body, response body (JSON indented), status code and duration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;REST Assured calls are captured the same way, with no code.&lt;/strong&gt;&lt;br&gt;
Authorization and cookie headers are never stored.&lt;br&gt;
One limitation: a client created inside the test method itself can’t be reached automatically, so you wrap it once with AceHttpClient.wrap(...).&lt;br&gt;
Screenshots before teardown&lt;/p&gt;

&lt;p&gt;The failure screenshot is taken before @AfterEach / @AfterMethod runs, so the browser is still open. Ace Reports finds a Playwright Page or Selenium WebDriver in a field of the test class, a base class or a ThreadLocal by itself. A page that never navigated anywhere (about:blank) is skipped, so a failed API test doesn’t get an empty screenshot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cucumber: steps are the log&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With Cucumber (JUnit 5 or TestNG runner), each scenario is a row and every step is a line in the log:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;gherkin&lt;br&gt;
GIVEN  the login page is open&lt;br&gt;
WHEN   I log in as "InvalidUser" with password "admin123"&lt;br&gt;
FAIL   Step failed.  TimeoutError: Timeout 3000ms exceeded.&lt;br&gt;
SKIPPED Then the dashboard is shown&lt;br&gt;
Scenario Outline rows carry their example values.&lt;br&gt;
Tags become categories.&lt;br&gt;
Images you attach with scenario.attach(...) show up as screenshot tabs.&lt;br&gt;
Writing to the report, when you want to&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You never have to, but you can:&lt;/p&gt;

&lt;p&gt;java&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;javascript&lt;br&gt;
Ace.info("Submitting payment");&lt;br&gt;
Ace.takeScreenshot("After login");&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Each line attaches to whichever test is running on the current thread, so parallel runs keep their logs apart.&lt;/p&gt;

&lt;p&gt;Same report in .NET, Java and Python&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ace Reports started in .NET (xUnit, NUnit, MSTest, Reqnroll) and Python (pytest, pytest-bdd).&lt;/strong&gt; The Java version produces the identical report, which helps when one team works across more than one stack.&lt;/p&gt;

&lt;p&gt;Try it&lt;br&gt;
&lt;strong&gt;Live demo report: **&lt;a href="https://harshadlambate.github.io/AceReportsWebsite/demo.html" rel="noopener noreferrer"&gt;https://harshadlambate.github.io/AceReportsWebsite/demo.html&lt;/a&gt;&lt;br&gt;
**Website and docs:&lt;/strong&gt; &lt;a href="https://harshadlambate.github.io/AceReportsWebsite/" rel="noopener noreferrer"&gt;https://harshadlambate.github.io/AceReportsWebsite/&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Maven Central:&lt;/strong&gt; &lt;a href="https://central.sonatype.com/namespace/io.github.acereports" rel="noopener noreferrer"&gt;https://central.sonatype.com/namespace/io.github.acereports&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I’d like to hear how your team handles flaky tests: do you keep the history of each attempt, or only the final result?&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>java</category>
      <category>junit5</category>
      <category>testing</category>
      <category>api</category>
    </item>
    <item>
      <title>I built a .NET test reporter to solve two problems I kept seeing in test automation</title>
      <dc:creator>Harshad Lambate</dc:creator>
      <pubDate>Tue, 06 Oct 2026 16:04:00 +0000</pubDate>
      <link>https://dev.to/harshad_lambate/i-built-a-net-test-reporter-to-solve-two-problems-i-kept-seeing-in-test-automation-4mnk</link>
      <guid>https://dev.to/harshad_lambate/i-built-a-net-test-reporter-to-solve-two-problems-i-kept-seeing-in-test-automation-4mnk</guid>
      <description>&lt;p&gt;&lt;strong&gt;I built Ace Reports — a .NET test reporter with automatic API capture and flaky-test detection&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I've been working on test automation for several years, and one thing I kept finding frustrating was that a test report would tell me that a test failed, but not enough about what actually happened during the failure.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;Ace Reports&lt;/strong&gt; around two problems I wanted to solve:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Identify flaky tests and preserve their history&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If a test fails and then passes on a retry, I don't want the report to simply show the final &lt;code&gt;Passed&lt;/code&gt; result. I want to know that the test was flaky, how many attempts it took, and what happened during those attempts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Don't make testers add reporting code to their tests&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I don't want testers to have to modify their test scripts just to populate the report. Things like &lt;strong&gt;API requests/responses, retry information, execution details, and screenshots on failure should be captured automatically&lt;/strong&gt; wherever possible.&lt;/p&gt;

&lt;p&gt;The goal is that you write your tests normally, run them, and the report automatically contains the information needed to investigate failures.&lt;/p&gt;

&lt;p&gt;Ace Reports generates a self-contained HTML report, with no reporting server required. It currently has adapters for &lt;strong&gt;xUnit, NUnit, MSTest, and Reqnroll&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The project is available on NuGet and is currently at &lt;strong&gt;v1.0.1&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I'd like to get feedback from people working with .NET test automation:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What information do you wish your test reports captured automatically that they currently don't?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'm especially interested in feedback around API capture, flaky-test detection, retries, and report usability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://harshadlambate.github.io/AceReportsWebsite/" rel="noopener noreferrer"&gt;https://harshadlambate.github.io/AceReportsWebsite/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3un2lc1uqapnio6e0j7e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3un2lc1uqapnio6e0j7e.png" alt="Sample Report" width="800" height="547"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>analytics</category>
      <category>automation</category>
      <category>dotnet</category>
    </item>
  </channel>
</rss>
