<?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: Musfiqur Rahman Foysal</title>
    <description>The latest articles on DEV Community by Musfiqur Rahman Foysal (@foysal619).</description>
    <link>https://dev.to/foysal619</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%2F924065%2F77a341a9-4b9e-4ddb-bdc1-3e7d315a7774.png</url>
      <title>DEV Community: Musfiqur Rahman Foysal</title>
      <link>https://dev.to/foysal619</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/foysal619"/>
    <language>en</language>
    <item>
      <title>From Test Automation to Release Confidence: Building Evidence-Driven Quality Gates</title>
      <dc:creator>Musfiqur Rahman Foysal</dc:creator>
      <pubDate>Wed, 28 Oct 2026 14:16:54 +0000</pubDate>
      <link>https://dev.to/foysal619/from-test-automation-to-release-confidence-building-evidence-driven-quality-gates-5fhb</link>
      <guid>https://dev.to/foysal619/from-test-automation-to-release-confidence-building-evidence-driven-quality-gates-5fhb</guid>
      <description>&lt;p&gt;Automated tests are valuable, but a large test suite does not automatically create confidence. A pipeline can report 2,000 passing tests while a critical checkout flow is broken, an API contract has drifted, or response time has doubled. The real objective of quality engineering is not to maximize the number of tests. It is to produce enough trustworthy evidence to make a responsible release decision.&lt;/p&gt;

&lt;p&gt;That shift—from “Did the tests pass?” to “Do we have sufficient evidence to release?”—is the foundation of an evidence-driven quality gate.&lt;/p&gt;

&lt;p&gt;This article presents a practical way to design such gates for web, mobile, API, backend, and performance testing. The framework is intentionally tool-agnostic: you can implement it with Playwright, Cypress, Selenium, Appium, REST Assured, Postman/Newman, k6, JMeter, or equivalent tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why pass/fail is not enough
&lt;/h2&gt;

&lt;p&gt;A binary pipeline result hides important context. Consider two failures:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A typo is detected on a rarely visited settings page.&lt;/li&gt;
&lt;li&gt;Payment authorization returns the wrong status for valid customers.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Both may appear as one failed test, but their business impact is completely different. The same is true for passing tests. A green regression suite may provide weak evidence if it excludes the changed component, runs against unrealistic data, or contains flaky assertions that the team routinely reruns.&lt;/p&gt;

&lt;p&gt;A meaningful quality gate should therefore answer four questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What changed?&lt;/li&gt;
&lt;li&gt;What could fail because of that change?&lt;/li&gt;
&lt;li&gt;Which checks provide evidence about those risks?&lt;/li&gt;
&lt;li&gt;Is the evidence strong enough for this release?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The gate should make these answers visible rather than burying them in logs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Start with change risk
&lt;/h2&gt;

&lt;p&gt;Every release does not need the same test depth. A documentation change and a payment-service migration should not trigger identical pipelines.&lt;/p&gt;

&lt;p&gt;A simple risk score can combine three factors:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;release risk = impact × likelihood × detectability
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use a small scale, such as 1–3, for each factor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Impact:&lt;/strong&gt; How serious is failure for users or the business?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Likelihood:&lt;/strong&gt; How probable is a defect based on complexity and change history?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Detectability:&lt;/strong&gt; How difficult would it be to notice the defect before users do?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, a change to authentication token renewal might score 3 × 2 × 3 = 18. A color adjustment on an internal page might score 1 × 1 × 1 = 1. The exact mathematics is less important than using a consistent method to decide which evidence is required.&lt;/p&gt;

&lt;p&gt;Connect risk levels to pipeline depth:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Risk level&lt;/th&gt;
&lt;th&gt;Required evidence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Static checks, unit tests, targeted smoke test&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Low-risk checks plus API contract and affected-flow regression&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Medium-risk checks plus cross-browser/mobile, security, resilience, and performance evidence&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This prevents two common failures: running everything for every commit, which makes feedback slow, and running too little for a dangerous change.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Build layered gates
&lt;/h2&gt;

&lt;p&gt;One large end-to-end suite is slow and difficult to diagnose. A stronger pipeline uses layers, with fast checks rejecting bad builds early.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gate 1: Build and static integrity
&lt;/h3&gt;

&lt;p&gt;This layer should finish quickly and verify fundamentals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The application builds successfully.&lt;/li&gt;
&lt;li&gt;Formatting, linting, and type checks pass.&lt;/li&gt;
&lt;li&gt;Dependency and secret scans do not find release-blocking issues.&lt;/li&gt;
&lt;li&gt;Unit tests for changed components pass.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Failures here should stop later, more expensive jobs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gate 2: API and service contracts
&lt;/h3&gt;

&lt;p&gt;API checks should validate more than status code 200. Useful evidence includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Required headers and content types&lt;/li&gt;
&lt;li&gt;Response schema and field types&lt;/li&gt;
&lt;li&gt;Authorization and role boundaries&lt;/li&gt;
&lt;li&gt;Error contracts for invalid inputs&lt;/li&gt;
&lt;li&gt;Idempotency where applicable&lt;/li&gt;
&lt;li&gt;Consumer-provider compatibility&lt;/li&gt;
&lt;li&gt;Latency against a defined service-level objective&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A compact contract assertion might look like this:&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="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;content-type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;toContain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toMatchObject&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringMatching&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;active|inactive&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&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;Avoid validating every response with enormous snapshots. Focus on behavior and fields that consumers actually depend on.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gate 3: Critical user journeys
&lt;/h3&gt;

&lt;p&gt;End-to-end tests provide the most value when they cover a small set of critical journeys rather than every UI combination. Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Account creation and authentication&lt;/li&gt;
&lt;li&gt;Search and discovery&lt;/li&gt;
&lt;li&gt;Purchase or subscription flow&lt;/li&gt;
&lt;li&gt;Core data creation and retrieval&lt;/li&gt;
&lt;li&gt;Recovery from a failed operation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each test should have a clear business reason. If nobody can explain the risk a test protects against, the test may not deserve a permanent place in the release gate.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gate 4: Non-functional thresholds
&lt;/h3&gt;

&lt;p&gt;Functional correctness is only part of release quality. Define measurable thresholds for performance, accessibility, and reliability.&lt;/p&gt;

&lt;p&gt;For a k6 performance test, the release rule might be:&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;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;thresholds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;http_req_failed&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;rate&amp;lt;0.01&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;http_req_duration&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;p(95)&amp;lt;500&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="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The numbers should come from user expectations and production objectives, not arbitrary industry averages. A threshold is useful only when the team understands why crossing it should block or warn a release.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Separate blocking failures from warnings
&lt;/h2&gt;

&lt;p&gt;If every issue blocks a release, teams eventually bypass the gate. If nothing blocks, the gate is decorative. Classify outcomes deliberately:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Block:&lt;/strong&gt; A critical journey fails, an incompatible API change is detected, a security policy is violated, or an agreed service objective is missed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Warn:&lt;/strong&gt; A non-critical visual difference, moderate performance regression, or low-severity accessibility issue needs review.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inform:&lt;/strong&gt; Coverage changes, trend data, and diagnostic observations support future decisions but do not stop the current release.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Document the owner and response for each category. A warning without an owner quickly becomes background noise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Make the evidence easy to inspect
&lt;/h2&gt;

&lt;p&gt;A pipeline should produce a compact evidence bundle, not force reviewers to search through several tools. At minimum, retain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Commit and environment identifiers&lt;/li&gt;
&lt;li&gt;Test scope and risk level&lt;/li&gt;
&lt;li&gt;Passed, failed, skipped, and retried counts&lt;/li&gt;
&lt;li&gt;Machine-readable results such as JUnit XML&lt;/li&gt;
&lt;li&gt;Human-readable HTML report&lt;/li&gt;
&lt;li&gt;Screenshots, traces, videos, or request/response logs for failures&lt;/li&gt;
&lt;li&gt;Performance and accessibility summaries&lt;/li&gt;
&lt;li&gt;Links to known defects or approved exceptions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A GitHub Actions workflow can publish evidence even when a test job fails:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run release checks&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm run test:release&lt;/span&gt;

&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Upload quality evidence&lt;/span&gt;
  &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always()&lt;/span&gt;
  &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/upload-artifact@v4&lt;/span&gt;
  &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;quality-evidence-${{ github.sha }}&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
      &lt;span class="s"&gt;test-results/&lt;/span&gt;
      &lt;span class="s"&gt;playwright-report/&lt;/span&gt;
      &lt;span class="s"&gt;performance-summary.json&lt;/span&gt;
    &lt;span class="na"&gt;retention-days&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;14&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;if: always()&lt;/code&gt; condition matters. Failure evidence is often more valuable than success evidence, and it should not disappear because the preceding command returned a non-zero exit code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Treat flaky tests as evidence defects
&lt;/h2&gt;

&lt;p&gt;A flaky test does not merely waste time; it reduces trust in the gate. Rerunning until green hides uncertainty rather than resolving it.&lt;/p&gt;

&lt;p&gt;Track at least these signals per test:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First-run pass rate&lt;/li&gt;
&lt;li&gt;Retry recovery rate&lt;/li&gt;
&lt;li&gt;Failure frequency by environment&lt;/li&gt;
&lt;li&gt;Duration trend&lt;/li&gt;
&lt;li&gt;Last confirmed product defect&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quarantine may be necessary, but it should be controlled. A quarantined test needs an owner, reason, issue link, and expiry date. Critical-path tests should not silently remain outside the release gate.&lt;/p&gt;

&lt;p&gt;A practical rule is to report both the final result and the first-attempt result. A test that passes on retry should not appear equivalent to a consistently stable test.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Review the gate like production code
&lt;/h2&gt;

&lt;p&gt;Quality gates need maintenance. Review them regularly using questions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did escaped defects reveal missing coverage or a weak assertion?&lt;/li&gt;
&lt;li&gt;Which checks have never caught a meaningful problem?&lt;/li&gt;
&lt;li&gt;Are thresholds still aligned with production objectives?&lt;/li&gt;
&lt;li&gt;Are slow jobs delaying feedback without adding proportional confidence?&lt;/li&gt;
&lt;li&gt;Do retries or quarantines hide instability?&lt;/li&gt;
&lt;li&gt;Can a developer understand a failure without help from the test author?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not a permanently growing suite. It is a focused, trustworthy system that evolves with the product’s risk.&lt;/p&gt;

&lt;h2&gt;
  
  
  A release-readiness checklist
&lt;/h2&gt;

&lt;p&gt;Before treating the pipeline as a release gate, confirm that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Changed components and risk level are identified.&lt;/li&gt;
&lt;li&gt;[ ] Required test layers are selected from that risk.&lt;/li&gt;
&lt;li&gt;[ ] Critical user journeys pass on the first attempt.&lt;/li&gt;
&lt;li&gt;[ ] API schemas and consumer contracts remain compatible.&lt;/li&gt;
&lt;li&gt;[ ] Performance, accessibility, and reliability thresholds are explicit.&lt;/li&gt;
&lt;li&gt;[ ] Blocking, warning, and informational outcomes are defined.&lt;/li&gt;
&lt;li&gt;[ ] Failures include diagnostic evidence.&lt;/li&gt;
&lt;li&gt;[ ] Flaky or quarantined tests have owners and expiry dates.&lt;/li&gt;
&lt;li&gt;[ ] Exceptions are documented and time-bound.&lt;/li&gt;
&lt;li&gt;[ ] The final report is understandable to engineering and product stakeholders.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;Test automation is an implementation capability; release confidence is the outcome. Evidence-driven quality gates connect the two by combining change risk, layered verification, measurable thresholds, and transparent diagnostics.&lt;/p&gt;

&lt;p&gt;Start small. Choose one important user journey, define its risks, attach the right API, UI, and performance evidence, and make the release rule explicit. Once the team trusts that gate, expand the same model to other critical areas.&lt;/p&gt;

&lt;p&gt;A good quality gate does not promise that defects are impossible. It makes the remaining risk visible—and gives the team a defensible reason to release.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Md. Musfiqur Rahman Foysal is a Software QA Engineer at MIAKI working across web, mobile, API, performance, automation, and CI/CD quality systems. Explore his &lt;a href="https://musfiqur-rahman-foysal.netlify.app" rel="noopener noreferrer"&gt;portfolio&lt;/a&gt; and &lt;a href="https://orcid.org/0009-0008-0644-9032" rel="noopener noreferrer"&gt;ORCID record&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>testing</category>
      <category>automation</category>
      <category>devops</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Who is Musfiqur Rahman Foysal?</title>
      <dc:creator>Musfiqur Rahman Foysal</dc:creator>
      <pubDate>Sat, 10 Sep 2022 15:58:58 +0000</pubDate>
      <link>https://dev.to/foysal619/who-is-musfiqur-rahman-foysal-4da7</link>
      <guid>https://dev.to/foysal619/who-is-musfiqur-rahman-foysal-4da7</guid>
      <description></description>
    </item>
  </channel>
</rss>
