<?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: Christian Dennis HINOJOSA MUCHO</title>
    <description>The latest articles on DEV Community by Christian Dennis HINOJOSA MUCHO (@christian_dennishinojosa).</description>
    <link>https://dev.to/christian_dennishinojosa</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3105565%2F4d692172-2fcd-4d3b-a285-8eb2754ceba9.jpg</url>
      <title>DEV Community: Christian Dennis HINOJOSA MUCHO</title>
      <link>https://dev.to/christian_dennishinojosa</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/christian_dennishinojosa"/>
    <language>en</language>
    <item>
      <title>🔧 Comparative Analysis of Testing Management Tools with Real CI/CD Pipelines</title>
      <dc:creator>Christian Dennis HINOJOSA MUCHO</dc:creator>
      <pubDate>Wed, 03 Dec 2025 18:16:03 +0000</pubDate>
      <link>https://dev.to/christian_dennishinojosa/-comparative-analysis-of-testing-management-tools-with-real-cicd-pipelines-59jc</link>
      <guid>https://dev.to/christian_dennishinojosa/-comparative-analysis-of-testing-management-tools-with-real-cicd-pipelines-59jc</guid>
      <description>&lt;p&gt;Automated testing has become a core practice in modern software development.&lt;br&gt;&lt;br&gt;
Today, testing doesn’t just happen on a local machine—it is integrated directly into &lt;strong&gt;Continuous Integration (CI/CD)&lt;/strong&gt; pipelines, ensuring every code change is validated before reaching production.&lt;/p&gt;

&lt;p&gt;In this article, we explore and compare three widely used testing management tools within CI/CD environments: &lt;strong&gt;GitHub Actions&lt;/strong&gt;, &lt;strong&gt;GitLab CI/CD&lt;/strong&gt;, and &lt;strong&gt;Jenkins&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Each one includes a real-world pipeline example so you can understand how test automation works in practice.&lt;/p&gt;


&lt;h2&gt;
  
  
  💡 Why Testing in CI/CD Matters
&lt;/h2&gt;

&lt;p&gt;Automated test executions help teams:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prevent bugs before merging code
&lt;/li&gt;
&lt;li&gt;Detect regressions quickly
&lt;/li&gt;
&lt;li&gt;Standardize test execution across environments
&lt;/li&gt;
&lt;li&gt;Improve software reliability and delivery speed
&lt;/li&gt;
&lt;li&gt;Reduce manual testing overhead
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Today’s development workflows expect speed and consistency—CI/CD testing delivers both.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧩 Tools Overview
&lt;/h2&gt;
&lt;h3&gt;
  
  
  🟦 GitHub Actions
&lt;/h3&gt;

&lt;p&gt;A cloud-based automation platform built into GitHub.&lt;br&gt;&lt;br&gt;
It uses YAML workflows and triggers on events like &lt;code&gt;push&lt;/code&gt;, &lt;code&gt;merge&lt;/code&gt;, or &lt;code&gt;pull_request&lt;/code&gt;.&lt;/p&gt;


&lt;h3&gt;
  
  
  🟥 GitLab CI/CD
&lt;/h3&gt;

&lt;p&gt;A complete DevOps platform where CI/CD is deeply integrated.&lt;br&gt;&lt;br&gt;
It uses “runners” to execute jobs and supports built-in testing, security scans, and deployment pipelines.&lt;/p&gt;


&lt;h3&gt;
  
  
  🟩 Jenkins
&lt;/h3&gt;

&lt;p&gt;An open-source automation server used for customizable pipelines.&lt;br&gt;&lt;br&gt;
Requires installation and configuration but offers massive flexibility.&lt;/p&gt;


&lt;h2&gt;
  
  
  🌍 Example Scenario
&lt;/h2&gt;

&lt;p&gt;To compare the tools fairly, we use the same simple case:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Run test scripts automatically after every push.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We assume the project uses a test command such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--coverage&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  🔧 Real CI/CD Pipelines
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🟦 1. GitHub Actions Pipeline
&lt;/h2&gt;

&lt;p&gt;Create a file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.github/workflows/ci.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add:&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="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run Automated Tests&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;main"&lt;/span&gt; &lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&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;Checkout repo&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/checkout@v3&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;Install packages&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 install&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;Run unit tests&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 test -- --coverage&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 coverage results&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;coverage&lt;/span&gt;
          &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;coverage/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🟥 2. GitLab CI/CD Pipeline
&lt;/h2&gt;

&lt;p&gt;Create:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.gitlab-ci.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add:&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="na"&gt;stages&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&lt;/span&gt;

&lt;span class="na"&gt;unit_tests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;stage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;test&lt;/span&gt;
  &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;npm install&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;npm test -- --coverage&lt;/span&gt;
  &lt;span class="na"&gt;artifacts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;coverage/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🟩 3. Jenkins Pipeline (Jenkinsfile)
&lt;/h2&gt;

&lt;p&gt;Create:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Jenkinsfile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;pipeline&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt;

    &lt;span class="n"&gt;stages&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Install'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="s1"&gt;'npm install'&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Run Tests'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="s1"&gt;'npm test -- --coverage'&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Archive Coverage'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;archiveArtifacts&lt;/span&gt; &lt;span class="nl"&gt;artifacts:&lt;/span&gt; &lt;span class="s1"&gt;'coverage/**'&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  📊 Quick Comparison
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;GitHub Actions&lt;/th&gt;
&lt;th&gt;GitLab CI/CD&lt;/th&gt;
&lt;th&gt;Jenkins&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hosting&lt;/td&gt;
&lt;td&gt;Cloud&lt;/td&gt;
&lt;td&gt;Cloud + Self-host&lt;/td&gt;
&lt;td&gt;Self-host&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Language&lt;/td&gt;
&lt;td&gt;YAML&lt;/td&gt;
&lt;td&gt;YAML&lt;/td&gt;
&lt;td&gt;Groovy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difficulty&lt;/td&gt;
&lt;td&gt;Easy&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Advanced&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Integration&lt;/td&gt;
&lt;td&gt;GitHub&lt;/td&gt;
&lt;td&gt;GitLab&lt;/td&gt;
&lt;td&gt;Universal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Test Artifacts&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scalability&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Very High&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  📁 Public Example Repository
&lt;/h1&gt;

&lt;p&gt;Example structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/src
/tests
.github/workflows/ci.yml
.gitlab-ci.yml
Jenkinsfile
README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can publish it as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://github.com/dennisdhm7/ci-testing-demo

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  🧩 Key Takeaways
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Actions&lt;/strong&gt; is the easiest for cloud-native projects.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitLab CI/CD&lt;/strong&gt; provides an all-in-one DevOps solution.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jenkins&lt;/strong&gt; offers powerful customization for enterprise environments.
&lt;/li&gt;
&lt;li&gt;All three support automated testing inside CI/CD pipelines.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Automating tests ensures consistent, reliable, and high-quality software delivery.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://youtu.be/dYCY9YJzlYU" rel="noopener noreferrer"&gt;📺 Video: Testing Management Tools Guide&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/dennisdhm7/ci-testing-demo" rel="noopener noreferrer"&gt;📦 View GitHub Repository&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ✍️ Author
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Christian Dennis Hinojosa Mucho&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Systems Engineering student — UPT&lt;/p&gt;

</description>
      <category>testing</category>
      <category>cicd</category>
      <category>devops</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Applying API Testing Frameworks with Postman: Real-World Code Examples</title>
      <dc:creator>Christian Dennis HINOJOSA MUCHO</dc:creator>
      <pubDate>Wed, 03 Dec 2025 18:15:24 +0000</pubDate>
      <link>https://dev.to/christian_dennishinojosa/applying-api-testing-frameworks-with-postman-real-world-code-examples-hj1</link>
      <guid>https://dev.to/christian_dennishinojosa/applying-api-testing-frameworks-with-postman-real-world-code-examples-hj1</guid>
      <description>&lt;h1&gt;
  
  
  🧪 API Testing with Postman and Newman
&lt;/h1&gt;

&lt;p&gt;Testing APIs has become an essential part of modern software development.&lt;br&gt;&lt;br&gt;
Before connecting the backend with the user interface, we need to make sure every endpoint behaves as expected — returning the correct data, handling errors properly, and performing under different conditions.  &lt;/p&gt;

&lt;p&gt;In this guide, we’ll explore how to apply &lt;strong&gt;Postman&lt;/strong&gt; and &lt;strong&gt;Newman&lt;/strong&gt; to automate API testing through a simple and realistic example.&lt;/p&gt;


&lt;h2&gt;
  
  
  💡 Understanding the Purpose
&lt;/h2&gt;

&lt;p&gt;APIs are like bridges between different systems.&lt;br&gt;&lt;br&gt;
When one part of an app sends a request, the API is responsible for sending the correct response back.&lt;br&gt;&lt;br&gt;
If something fails here, the entire application can break.&lt;/p&gt;

&lt;p&gt;API testing ensures that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each endpoint returns the right HTTP status code.
&lt;/li&gt;
&lt;li&gt;The JSON data structure is consistent.
&lt;/li&gt;
&lt;li&gt;Response times stay within acceptable limits.
&lt;/li&gt;
&lt;li&gt;Security tokens and authentication mechanisms work as intended.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  ⚙️ Tools Overview
&lt;/h2&gt;
&lt;h3&gt;
  
  
  🧩 Postman
&lt;/h3&gt;

&lt;p&gt;A graphical tool that lets you design, test, and document APIs easily.&lt;br&gt;&lt;br&gt;
You can manually send requests or create automated test scripts.&lt;/p&gt;
&lt;h3&gt;
  
  
  🧭 Newman
&lt;/h3&gt;

&lt;p&gt;A command-line companion for Postman.&lt;br&gt;&lt;br&gt;
It allows developers to &lt;strong&gt;run Postman collections automatically&lt;/strong&gt;, which is ideal for &lt;strong&gt;continuous integration (CI/CD)&lt;/strong&gt; pipelines.&lt;/p&gt;


&lt;h2&gt;
  
  
  🌍 Example Scenario
&lt;/h2&gt;

&lt;p&gt;Let’s work with a public REST API called &lt;strong&gt;JSONPlaceholder&lt;/strong&gt;, commonly used for learning and testing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Endpoint to test:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET https://jsonplaceholder.typicode.com/users/1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This API returns user information.&lt;br&gt;&lt;br&gt;
We’ll create tests to verify that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The request is successful.
&lt;/li&gt;
&lt;li&gt;The response contains valid user data.
&lt;/li&gt;
&lt;li&gt;The user ID matches the expected value.&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  🧪 Writing Tests in Postman
&lt;/h2&gt;

&lt;p&gt;Once you create the request in Postman, go to the &lt;strong&gt;Tests&lt;/strong&gt; tab and paste this script:&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;// Check if response is OK&lt;/span&gt;
&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Status code should be 200&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;pm&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="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&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="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Validate JSON response structure&lt;/span&gt;
&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Response contains user details&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="o"&gt;=&amp;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;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pm&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;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;pm&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;data&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;pm&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;data&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;pm&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;data&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;email&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="c1"&gt;// Check that the correct user is returned&lt;/span&gt;
&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;User ID matches expected value&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="o"&gt;=&amp;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;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pm&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;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;pm&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;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&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;After sending the request, you’ll see &lt;strong&gt;green checkmarks&lt;/strong&gt; ✅ in the test results panel, confirming that all validations passed.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧭 Running Tests Automatically with Newman
&lt;/h2&gt;

&lt;p&gt;Once your collection is ready, export it from Postman:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;File → Export → Collection → JSON file&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now open your terminal and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;newman run MyCollection.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Newman will execute every test automatically and display detailed output directly in the console:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;→ GET https://jsonplaceholder.typicode.com/users/1
  ✓ Status code should be 200
  ✓ Response contains user details
  ✓ User ID matches expected value
---------------------------------------------------
Total tests: 3 | Passed: 3 | Failed: 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This workflow helps teams include API testing in their deployment pipelines — for example with GitHub Actions, Jenkins, or Azure DevOps.&lt;/p&gt;




&lt;h2&gt;
  
  
  📈 Test Output Example
&lt;/h2&gt;

&lt;p&gt;When all tests pass successfully, you might see something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Collection run complete.
✔ 3 tests passed.
0 tests failed.
Average response time: 410ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If something goes wrong, Newman highlights the failed test and shows the expected vs actual values.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Postman&lt;/strong&gt; makes it easy to design and execute API tests visually.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Newman&lt;/strong&gt; adds automation and integration capabilities for professional workflows.
&lt;/li&gt;
&lt;li&gt;Using both together allows you to:

&lt;ul&gt;
&lt;li&gt;Detect bugs early before integration.
&lt;/li&gt;
&lt;li&gt;Maintain consistent API behavior across environments.
&lt;/li&gt;
&lt;li&gt;Automate test runs after each deployment.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;By including API testing as part of the development process, you build more reliable, stable, and maintainable systems.&lt;/p&gt;




&lt;h2&gt;
  
  
  📚 References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://learning.postman.com/docs/writing-scripts/script-references/test-examples/" rel="noopener noreferrer"&gt;Postman Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://jsonplaceholder.typicode.com/" rel="noopener noreferrer"&gt;JSONPlaceholder API&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  ✍️ Author
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Christian Dennis Hinojosa Mucho&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Research Team Work Nº 02 – API Testing Frameworks Comparative&lt;/em&gt;&lt;/p&gt;

</description>
      <category>testing</category>
      <category>tutorial</category>
      <category>automation</category>
      <category>api</category>
    </item>
    <item>
      <title>Applying API Testing Frameworks with Postman: Real-World Code Examples</title>
      <dc:creator>Christian Dennis HINOJOSA MUCHO</dc:creator>
      <pubDate>Sat, 08 Nov 2025 13:47:06 +0000</pubDate>
      <link>https://dev.to/christian_dennishinojosa/applying-api-testing-frameworks-with-postman-real-world-code-examples-j4p</link>
      <guid>https://dev.to/christian_dennishinojosa/applying-api-testing-frameworks-with-postman-real-world-code-examples-j4p</guid>
      <description>&lt;h1&gt;
  
  
  🧪 API Testing with Postman and Newman
&lt;/h1&gt;

&lt;p&gt;Testing APIs has become an essential part of modern software development.&lt;br&gt;&lt;br&gt;
Before connecting the backend with the user interface, we need to make sure every endpoint behaves as expected — returning the correct data, handling errors properly, and performing under different conditions.  &lt;/p&gt;

&lt;p&gt;In this guide, we’ll explore how to apply &lt;strong&gt;Postman&lt;/strong&gt; and &lt;strong&gt;Newman&lt;/strong&gt; to automate API testing through a simple and realistic example.&lt;/p&gt;


&lt;h2&gt;
  
  
  💡 Understanding the Purpose
&lt;/h2&gt;

&lt;p&gt;APIs are like bridges between different systems.&lt;br&gt;&lt;br&gt;
When one part of an app sends a request, the API is responsible for sending the correct response back.&lt;br&gt;&lt;br&gt;
If something fails here, the entire application can break.&lt;/p&gt;

&lt;p&gt;API testing ensures that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each endpoint returns the right HTTP status code.
&lt;/li&gt;
&lt;li&gt;The JSON data structure is consistent.
&lt;/li&gt;
&lt;li&gt;Response times stay within acceptable limits.
&lt;/li&gt;
&lt;li&gt;Security tokens and authentication mechanisms work as intended.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  ⚙️ Tools Overview
&lt;/h2&gt;
&lt;h3&gt;
  
  
  🧩 Postman
&lt;/h3&gt;

&lt;p&gt;A graphical tool that lets you design, test, and document APIs easily.&lt;br&gt;&lt;br&gt;
You can manually send requests or create automated test scripts.&lt;/p&gt;
&lt;h3&gt;
  
  
  🧭 Newman
&lt;/h3&gt;

&lt;p&gt;A command-line companion for Postman.&lt;br&gt;&lt;br&gt;
It allows developers to &lt;strong&gt;run Postman collections automatically&lt;/strong&gt;, which is ideal for &lt;strong&gt;continuous integration (CI/CD)&lt;/strong&gt; pipelines.&lt;/p&gt;


&lt;h2&gt;
  
  
  🌍 Example Scenario
&lt;/h2&gt;

&lt;p&gt;Let’s work with a public REST API called &lt;strong&gt;JSONPlaceholder&lt;/strong&gt;, commonly used for learning and testing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Endpoint to test:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET https://jsonplaceholder.typicode.com/users/1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This API returns user information.&lt;br&gt;&lt;br&gt;
We’ll create tests to verify that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The request is successful.
&lt;/li&gt;
&lt;li&gt;The response contains valid user data.
&lt;/li&gt;
&lt;li&gt;The user ID matches the expected value.&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  🧪 Writing Tests in Postman
&lt;/h2&gt;

&lt;p&gt;Once you create the request in Postman, go to the &lt;strong&gt;Tests&lt;/strong&gt; tab and paste this script:&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;// Check if response is OK&lt;/span&gt;
&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Status code should be 200&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;pm&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="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&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="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Validate JSON response structure&lt;/span&gt;
&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Response contains user details&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="o"&gt;=&amp;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;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pm&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;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;pm&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;data&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;pm&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;data&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;pm&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;data&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;email&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="c1"&gt;// Check that the correct user is returned&lt;/span&gt;
&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;User ID matches expected value&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="o"&gt;=&amp;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;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pm&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;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;pm&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;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&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;After sending the request, you’ll see &lt;strong&gt;green checkmarks&lt;/strong&gt; ✅ in the test results panel, confirming that all validations passed.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧭 Running Tests Automatically with Newman
&lt;/h2&gt;

&lt;p&gt;Once your collection is ready, export it from Postman:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;File → Export → Collection → JSON file&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now open your terminal and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;newman run MyCollection.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Newman will execute every test automatically and display detailed output directly in the console:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;→ GET https://jsonplaceholder.typicode.com/users/1
  ✓ Status code should be 200
  ✓ Response contains user details
  ✓ User ID matches expected value
---------------------------------------------------
Total tests: 3 | Passed: 3 | Failed: 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This workflow helps teams include API testing in their deployment pipelines — for example with GitHub Actions, Jenkins, or Azure DevOps.&lt;/p&gt;




&lt;h2&gt;
  
  
  📈 Test Output Example
&lt;/h2&gt;

&lt;p&gt;When all tests pass successfully, you might see something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Collection run complete.
✔ 3 tests passed.
0 tests failed.
Average response time: 410ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If something goes wrong, Newman highlights the failed test and shows the expected vs actual values.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Postman&lt;/strong&gt; makes it easy to design and execute API tests visually.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Newman&lt;/strong&gt; adds automation and integration capabilities for professional workflows.
&lt;/li&gt;
&lt;li&gt;Using both together allows you to:

&lt;ul&gt;
&lt;li&gt;Detect bugs early before integration.
&lt;/li&gt;
&lt;li&gt;Maintain consistent API behavior across environments.
&lt;/li&gt;
&lt;li&gt;Automate test runs after each deployment.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;By including API testing as part of the development process, you build more reliable, stable, and maintainable systems.&lt;/p&gt;




&lt;h2&gt;
  
  
  📚 References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://learning.postman.com/docs/writing-scripts/script-references/test-examples/" rel="noopener noreferrer"&gt;Postman Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://jsonplaceholder.typicode.com/" rel="noopener noreferrer"&gt;JSONPlaceholder API&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  ✍️ Author
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Christian Dennis Hinojosa Mucho&lt;/strong&gt;  &lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>api</category>
      <category>testing</category>
      <category>automation</category>
    </item>
    <item>
      <title># 🌐 Deploying a Remote MCP Server with Python and FastAPI</title>
      <dc:creator>Christian Dennis HINOJOSA MUCHO</dc:creator>
      <pubDate>Fri, 04 Jul 2025 17:13:22 +0000</pubDate>
      <link>https://dev.to/christian_dennishinojosa/-deploying-a-remote-mcp-server-with-python-and-fastapi-1ilo</link>
      <guid>https://dev.to/christian_dennishinojosa/-deploying-a-remote-mcp-server-with-python-and-fastapi-1ilo</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;A step-by-step guide to creating a remote MCP (Message Control Protocol) server using Python and FastAPI, and deploying it online with Render.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🚀 Introduction
&lt;/h2&gt;

&lt;p&gt;In the era of cloud-native applications, real-time data processing, and automation, message-driven architectures are increasingly essential. MCP (Message Control Protocol) servers act as intermediaries that listen for client messages, process them, and return responses in real time. &lt;/p&gt;

&lt;p&gt;In this article, you’ll learn how to build and deploy a remote &lt;strong&gt;MCP Server&lt;/strong&gt; using Python and &lt;strong&gt;FastAPI&lt;/strong&gt;. Unlike local implementations, this solution is cloud-hosted, accessible from anywhere via a public URL, and serves as a foundation for integrating smart clients, bots, or automations.&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 What is an MCP Server?
&lt;/h2&gt;

&lt;p&gt;An MCP Server is a lightweight message-processing backend that listens for structured messages—usually over HTTP—and responds based on predefined rules or logic. MCP Servers are especially useful when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want to allow remote systems or users to trigger actions or computations.&lt;/li&gt;
&lt;li&gt;You need a controlled interface for communication between components.&lt;/li&gt;
&lt;li&gt;You're building a system where message acknowledgment or feedback is important.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In Business Intelligence (BI), an MCP server could be used to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Trigger scheduled data processing from external systems.&lt;/li&gt;
&lt;li&gt;Receive natural language inputs from chatbots and pass them to AI agents.&lt;/li&gt;
&lt;li&gt;Integrate dashboards and pipelines with real-time control endpoints.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🛠️ Requirements
&lt;/h2&gt;

&lt;p&gt;Before you start, ensure you have the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.7 or newer&lt;/li&gt;
&lt;li&gt;A GitHub account (for code hosting)&lt;/li&gt;
&lt;li&gt;A Render.com (or Railway) account for deployment&lt;/li&gt;
&lt;li&gt;Basic understanding of HTTP, JSON, and API interactions&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧑‍💻 Step 1: Create the FastAPI MCP Server
&lt;/h2&gt;

&lt;p&gt;Create a file named &lt;code&gt;main.py&lt;/code&gt; with the following content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pydantic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseModel&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;

&lt;span class="nd"&gt;@app.post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/mcp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handle_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Received message: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;response&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello from the remote MCP Server!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This server:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Accepts &lt;code&gt;POST&lt;/code&gt; requests at &lt;code&gt;/mcp&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Receives a JSON body with a &lt;code&gt;"content"&lt;/code&gt; key&lt;/li&gt;
&lt;li&gt;Prints the message to the server logs&lt;/li&gt;
&lt;li&gt;Sends back a structured JSON response&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This architecture is perfect for lightweight remote commands.&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 Step 2: Add Requirements
&lt;/h2&gt;

&lt;p&gt;Create a &lt;code&gt;requirements.txt&lt;/code&gt; file with the dependencies for deployment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fastapi
uvicorn
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These packages are essential:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;FastAPI&lt;/code&gt;: for creating modern async APIs in Python.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Uvicorn&lt;/code&gt;: an ASGI server to run FastAPI apps in production or locally.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧪 Step 3: Test Locally (Optional but Recommended)
&lt;/h2&gt;

&lt;p&gt;To make sure everything works before going live:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
uvicorn main:app &lt;span class="nt"&gt;--reload&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Visit: &lt;a href="http://localhost:8000/docs" rel="noopener noreferrer"&gt;http://localhost:8000/docs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;FastAPI automatically generates interactive API docs using Swagger UI. You can test your &lt;code&gt;/mcp&lt;/code&gt; endpoint directly from there by sending a JSON like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Hello, MCP Server"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The server will return:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"response"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Hello from the remote MCP Server!"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ☁️ Step 4: Deploy to Render
&lt;/h2&gt;

&lt;p&gt;Now, let’s make your MCP Server publicly accessible.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Steps:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Push to GitHub&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Create a new repository and upload your files (&lt;code&gt;main.py&lt;/code&gt;, &lt;code&gt;requirements.txt&lt;/code&gt;, and optionally &lt;code&gt;README.md&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Log in to &lt;a href="https://render.com" rel="noopener noreferrer"&gt;Render.com&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Create a new Web Service and connect your GitHub account.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deployment Settings:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Build Command:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Start Command:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; uvicorn main:app &lt;span class="nt"&gt;--host&lt;/span&gt; 0.0.0.0 &lt;span class="nt"&gt;--port&lt;/span&gt; 10000
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Port:&lt;/strong&gt; &lt;code&gt;10000&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Click "Deploy"&lt;/strong&gt; and wait for the build to finish.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After deploying, Render will assign a public URL like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://mcp-remote-example.onrender.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can now access your Swagger docs at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://mcp-remote-example.onrender.com/docs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And test it just like you did locally—only now it works from &lt;strong&gt;anywhere&lt;/strong&gt;!&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 Why Use MCP in Business Intelligence?
&lt;/h2&gt;

&lt;p&gt;MCP Servers become highly useful in a modern BI pipeline when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want &lt;strong&gt;external clients or apps&lt;/strong&gt; to trigger data ingestion or processing remotely.&lt;/li&gt;
&lt;li&gt;You build &lt;strong&gt;automation&lt;/strong&gt; workflows that respond to user input, chatbot messages, or API events.&lt;/li&gt;
&lt;li&gt;You create a &lt;strong&gt;control endpoint&lt;/strong&gt; to update dashboards, refresh models, or notify downstream tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because MCP Servers are lightweight, stateless, and decoupled, they are ideal for microservice environments and rapid experimentation.&lt;/p&gt;




&lt;h2&gt;
  
  
  📚 References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developers.cloudflare.com/agents/guides/remote-mcp-server/" rel="noopener noreferrer"&gt;Build a Remote MCP Server – Cloudflare Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/blog/topics/developers-practitioners/build-and-deploy-a-remote-mcp-server-to-google-cloud-run-in-under-10-minutes" rel="noopener noreferrer"&gt;Build and Deploy a Remote MCP Server to Google Cloud Run – Google Cloud Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://composio.dev/blog/mcp-server-step-by-step-guide-to-building-from-scrtch" rel="noopener noreferrer"&gt;MCP Server: A Step-by-Step Guide to Building from Scratch – Composio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.leanware.co/insights/how-to-build-mcp-server" rel="noopener noreferrer"&gt;How to Build an MCP Server (Step-by-Step Guide) – Leanware&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;✍️ Written by Christian Dennis Hinojosa Mucho&lt;br&gt;&lt;br&gt;
🔗 GitHub Repository: &lt;a href="https://github.com/dennisdhm7/mcp_u3" rel="noopener noreferrer"&gt;https://github.com/dennisdhm7/mcp_u3&lt;/a&gt;&lt;/p&gt;




</description>
    </item>
    <item>
      <title>Build and Deploy an Interactive Sales Dashboard with Streamlit</title>
      <dc:creator>Christian Dennis HINOJOSA MUCHO</dc:creator>
      <pubDate>Tue, 29 Apr 2025 14:38:53 +0000</pubDate>
      <link>https://dev.to/christian_dennishinojosa/build-and-deploy-an-interactive-sales-dashboard-with-streamlit-1804</link>
      <guid>https://dev.to/christian_dennishinojosa/build-and-deploy-an-interactive-sales-dashboard-with-streamlit-1804</guid>
      <description>&lt;h2&gt;
  
  
  💡 Why Streamlit?
&lt;/h2&gt;

&lt;p&gt;Streamlit is a powerful open-source Python library that turns data scripts into shareable web apps in minutes. It is perfect for data science and machine learning projects.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Features of This Project
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Display data in table format
&lt;/li&gt;
&lt;li&gt;Create a line chart for monthly sales
&lt;/li&gt;
&lt;li&gt;Deploy the dashboard to the web with zero configuration
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧱 Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Basic knowledge of Python
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;streamlit&lt;/code&gt;, &lt;code&gt;pandas&lt;/code&gt;, and &lt;code&gt;matplotlib&lt;/code&gt; installed (&lt;code&gt;pip install streamlit pandas matplotlib&lt;/code&gt;)
&lt;/li&gt;
&lt;li&gt;A &lt;a href="https://github.com/" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; account
&lt;/li&gt;
&lt;li&gt;A &lt;a href="https://streamlit.io/cloud" rel="noopener noreferrer"&gt;Streamlit Cloud&lt;/a&gt; account
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧑‍💻 Full Code (&lt;code&gt;app.py&lt;/code&gt;)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;streamlit&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;

&lt;span class="c1"&gt;# Title
&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Sales Dashboard&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Sample Data
&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Month&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Jan&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Feb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Mar&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Apr&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;May&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Sales&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1800&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2800&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Show table
&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subheader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Sales Data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Line chart
&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subheader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Sales Line Chart&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Month&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Sales&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;marker&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;o&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Month&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Sales&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pyplot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Explanation:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;st.title&lt;/code&gt;, &lt;code&gt;st.subheader&lt;/code&gt;, and &lt;code&gt;st.dataframe&lt;/code&gt; are used to structure the page layout.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;matplotlib.pyplot&lt;/code&gt; is used to generate the line chart.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;st.pyplot&lt;/code&gt; directly displays the Matplotlib figure inside the Streamlit app.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🌎 How to Deploy to the Cloud
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Push your &lt;code&gt;app.py&lt;/code&gt; file to a GitHub repository.&lt;/li&gt;
&lt;li&gt;Create a free account on &lt;a href="https://streamlit.io/cloud" rel="noopener noreferrer"&gt;Streamlit Cloud&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Click on &lt;strong&gt;New App&lt;/strong&gt; and connect your GitHub repository.&lt;/li&gt;
&lt;li&gt;Select your branch and main file (&lt;code&gt;app.py&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Deploy&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;🚀 Your app will be instantly live and ready to share!&lt;/p&gt;




&lt;h2&gt;
  
  
  📝 Conclusion
&lt;/h2&gt;

&lt;p&gt;Streamlit makes it incredibly easy for Python developers to build beautiful, interactive dashboards and professional reports.&lt;br&gt;&lt;br&gt;
Whether you are creating a quick data visualization prototype or a full business intelligence solution, Streamlit offers the flexibility and speed to bring your ideas to life.&lt;/p&gt;

&lt;p&gt;If you are looking to transform your data into powerful web applications with minimal effort, Streamlit is definitely a tool worth exploring!&lt;/p&gt;

&lt;p&gt;The source code and the automated deployment workflow for Streamlit Cloud can be found here:&lt;br&gt;&lt;br&gt;
👉 &lt;a href="https://github.com/dennisdhm7/Streamlit.git" rel="noopener noreferrer"&gt;https://github.com/dennisdhm7/Streamlit.git&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
