{"id":124375,"date":"2026-07-27T16:53:03","date_gmt":"2026-07-27T11:23:03","guid":{"rendered":"https:\/\/www.guvi.in\/blog\/?p=124375"},"modified":"2026-07-27T16:53:04","modified_gmt":"2026-07-27T11:23:04","slug":"testcontainers-tutorial","status":"publish","type":"post","link":"https:\/\/www.guvi.in\/blog\/testcontainers-tutorial\/","title":{"rendered":"Testcontainers Tutorial: Test Against Real Services Without the Headache"},"content":{"rendered":"\n<p>Testcontainers is an open-source library that lets you run Docker containers inside your test suite. Instead of mocking a database or faking an API response, you get a real PostgreSQL instance, a real Redis server, or a real Kafka broker running only for the duration of your test. It supports Java, Python, Node.js, Go, Rust, and more. Tests stay honest; bugs stay caught.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>TL;DR \u2014 Quick Summary&nbsp;&nbsp;<\/strong><\/h2>\n\n\n\n<ul>\n<li>Testcontainers is a testing library that spins up real Docker containers so your integration tests run against actual services \u2014 not mocks.<\/li>\n\n\n\n<li>It works with Java, Python, Node.js, Go, and more, with official SDKs for each.You can test against PostgreSQL, Redis, Kafka, and hundreds of other services using pre-built container modules.<\/li>\n\n\n\n<li>Containers start automatically before each test and shut down cleanly after \u2014 zero manual setup needed.<\/li>\n\n\n\n<li>This tutorial walks you through installation, writing your first test, and best practices for a real project.<\/li>\n<\/ul>\n\n\n\n<p>Here&#8217;s a situation most developers know too well: you write clean unit tests, everything passes, you ship to staging and then something breaks. A database constraint you didn&#8217;t account for. A Redis key that behaves differently in production. A Kafka consumer that works fine against your mock but chokes on real messages.<\/p>\n\n\n\n<p>The root cause is almost always the same: your tests weren&#8217;t testing reality.<\/p>\n\n\n\n<p>That&#8217;s exactly the gap Testcontainers was built to close. In this tutorial, you&#8217;ll learn what Testcontainers is, why it matters, and how to go from zero to a working integration test that talks to a real database container all from your local machine.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>What Is Testcontainers?<\/strong><\/h2>\n\n\n\n<p>Testcontainers is a testing library that starts Docker containers on demand during your test runs. It was originally built for the JVM ecosystem (Java, Kotlin, Groovy) but now has official SDKs for Python, Node.js, Go, Rust, .NET, and more.<\/p>\n\n\n\n<p>The core idea is simple: instead of mocking external dependencies like databases, message queues, or third-party APIs, you give your tests a real version of those services \u2014 containerized and isolated \u2014 that lives only for the duration of the test.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>Data Point&nbsp; <\/strong>Testcontainers has over 11,000 GitHub stars on its Java library alone. It is actively maintained by AtomicJar (acquired by Docker in 2023) and used by teams at Google, Netflix, and Zalando. [HUMAN EDITOR: Verify current star count and confirm acquisition details before publishing]<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Why Does Container-Based Testing Matter?<\/strong><\/h2>\n\n\n\n<p>Integration tests are the tests that check whether your code works correctly with the things it depends on databases, queues, file systems. For years, the default approach was to mock those dependencies.<\/p>\n\n\n\n<p>Mocks have their place. But they have a serious flaw: they only test the behavior you already assumed. A mock PostgreSQL will happily accept a query that real PostgreSQL would reject with a type mismatch.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>Warning:&nbsp;<\/strong>Mocking your database gives you confidence that your code calls the right methods \u2014 not that the right things actually happen in your database. That distinction has shipped a lot of bugs.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Container-based testing with Testcontainers gives you:<\/p>\n\n\n\n<ul>\n<li>Real query behavior \u2014 indexes, constraints, stored procedures, all of it<\/li>\n\n\n\n<li>Isolation \u2014 each test gets a fresh container; no shared state between runs<\/li>\n\n\n\n<li>Repeatability \u2014 the container image is pinned, so tests run the same way on every machine<\/li>\n\n\n\n<li>Speed (surprisingly) \u2014 containers start in 2\u20135 seconds for most services<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>How Does Testcontainers Work?<\/strong><\/h2>\n\n\n\n<p>Under the hood, Testcontainers uses the Docker daemon running on your machine (or in your CI environment) to pull and start container images. It then exposes the container&#8217;s ports to your test via a dynamically assigned host port \u2014 so there are no port conflicts.<\/p>\n\n\n\n<p>The lifecycle looks like this:<\/p>\n\n\n\n<ol>\n<li>Test starts \u2192 Testcontainers pulls the Docker image (if not cached)<\/li>\n\n\n\n<li>Container boots \u2192 Testcontainers waits for a readiness signal (e.g., the database accepting connections)<\/li>\n\n\n\n<li>Your test runs \u2192 It connects to the container at localhost:{dynamic-port}<\/li>\n\n\n\n<li>Test finishes \u2192 Container shuts down and is removed automatically<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong> Pro Tip&nbsp; <\/strong>Testcontainers supports &#8216;Ryuk&#8217; \u2014 an automatic cleanup sidecar container that removes leftover containers even if your test process crashes. This prevents test pollution and avoids orphaned containers piling up on your machine.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Testcontainers vs. Other Testing Approaches<\/strong><\/h2>\n\n\n\n<p>Here&#8217;s how container-based testing compares to the most common alternatives:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>Approach<\/strong><\/td><td><strong>Pros<\/strong><\/td><td><strong>Cons<\/strong><\/td><td><strong>Best For<\/strong><\/td><\/tr><tr><td>Unit tests with mocks<\/td><td>Fast, no dependencies<\/td><td>Doesn&#8217;t test real behavior<\/td><td>Pure logic testing<\/td><\/tr><tr><td>In-memory DB (H2)<\/td><td>Quick setup<\/td><td>SQL dialect differences cause false passes<\/td><td>Simple CRUD apps<\/td><\/tr><tr><td>Shared test database<\/td><td>Real DB behavior<\/td><td>Shared state causes flaky tests<\/td><td>Small teams, quick POCs<\/td><\/tr><tr><td>Testcontainers<\/td><td>Real behavior + isolation + repeatable<\/td><td>Needs Docker; slightly slower than H2<\/td><td>Integration and regression testing<\/td><\/tr><tr><td>Full staging environment<\/td><td>Most realistic<\/td><td>Slow, expensive, hard to manage<\/td><td>End-to-end smoke tests only<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Step-by-Step: Setting Up Testcontainers in Java<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Prerequisites<\/strong><\/h3>\n\n\n\n<ul>\n<li>Java 11 or later<\/li>\n\n\n\n<li>Maven or Gradle build tool<\/li>\n\n\n\n<li>Docker Desktop installed and running<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Step 1 \u2014 Add the Dependencies<\/strong><\/h3>\n\n\n\n<p>Add these to your pom.xml (Maven):<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>&lt;dependency&gt;&nbsp;&nbsp;&lt;groupId&gt;org.testcontainers&lt;\/groupId&gt;&nbsp;&nbsp;&lt;artifactId&gt;testcontainers&lt;\/artifactId&gt;&nbsp;&nbsp;&lt;version&gt;1.19.7&lt;\/version&gt;&nbsp;&nbsp;&lt;scope&gt;test&lt;\/scope&gt;&lt;\/dependency&gt;&lt;dependency&gt;&nbsp;&nbsp;&lt;groupId&gt;org.testcontainers&lt;\/groupId&gt;&nbsp;&nbsp;&lt;artifactId&gt;postgresql&lt;\/artifactId&gt;&nbsp;&nbsp;&lt;version&gt;1.19.7&lt;\/version&gt;&nbsp;&nbsp;&lt;scope&gt;test&lt;\/scope&gt;&lt;\/dependency&gt;<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>Pro Tip&nbsp; <\/strong>Always pin your Testcontainers version. The library updates frequently, and a minor version bump can change container startup behavior and break your CI pipeline unexpectedly.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Step 2 \u2014 Write Your First Testcontainers Test<\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>import org.testcontainers.containers.PostgreSQLContainer;import org.junit.jupiter.api.*;<br>@Testcontainersclass UserRepositoryTest {<br>&nbsp;&nbsp;@Container&nbsp;&nbsp;static PostgreSQLContainer&lt;?&gt; postgres =&nbsp;&nbsp;&nbsp;&nbsp;new PostgreSQLContainer&lt;&gt;(&#8220;postgres:16-alpine&#8221;);<br>&nbsp;&nbsp;@Test&nbsp;&nbsp;void shouldInsertAndFetchUser() {&nbsp;&nbsp;&nbsp;&nbsp;String jdbcUrl = postgres.getJdbcUrl();&nbsp;&nbsp;&nbsp;&nbsp;\/\/ connect to jdbcUrl, run your query, assert results&nbsp;&nbsp;}}<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>A few things to note about this code:<\/p>\n\n\n\n<ul>\n<li>@Testcontainers tells JUnit to manage the container lifecycle automatically.<\/li>\n\n\n\n<li>@Container marks the container as a managed resource \u2014 JUnit starts it before tests and stops it after.<\/li>\n\n\n\n<li>The static keyword makes the container shared across all test methods in the class, reducing startup overhead.<\/li>\n\n\n\n<li>postgres:16-alpine is a lightweight PostgreSQL image. Always use a specific tag \u2014 never latest.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Step 3 \u2014 Run Your Test<\/strong><\/h3>\n\n\n\n<p>Run your tests the same way you always do: mvn test or .\/gradlew test. Testcontainers handles everything else. You&#8217;ll see Docker pull and start the container in your test output.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>Best Practice&nbsp; <\/strong>Add @DynamicPropertySource in Spring Boot projects to inject the container&#8217;s JDBC URL into your application context automatically. This removes the need to hardcode any connection details.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Step-by-Step: Using Testcontainers with Python<\/strong><\/h2>\n\n\n\n<p>If you&#8217;re working in Python, the testcontainers-python library gives you the same power with familiar syntax.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Install the Package<\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>pip install testcontainers[postgres]<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Write a Test with pytest<\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>import pytestfrom testcontainers.postgres import PostgresContainerimport sqlalchemy<br>def test_postgres_connection():&nbsp;&nbsp;&nbsp;&nbsp;with PostgresContainer(&#8216;postgres:16-alpine&#8217;) as pg:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;engine = sqlalchemy.create_engine(pg.get_connection_url())&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;with engine.connect() as conn:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result = conn.execute(sqlalchemy.text(&#8216;SELECT 1&#8217;))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assert result.fetchone()[0] == 1<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>The with block handles the full container lifecycle \u2014 start on entry, stop on exit. Clean and Pythonic.<\/p>\n\n\n\n<p><em>If you want a structured, mentor-supported path and learn all these new tools, then HCL GUVI\u2019s IIT-M Pravartak Certified <a href=\"https:\/\/www.guvi.in\/zen-class\/full-stack-development-course\/?utm_source=blog&amp;utm_medium=hyperlink+&amp;utm_campaign=testcontainers-tutorial\" target=\"_blank\" data-type=\"link\" data-id=\"https:\/\/www.guvi.in\/zen-class\/full-stack-development-course\/?utm_source=blog&amp;utm_medium=hyperlink+&amp;utm_campaign=testcontainers-tutorial\" rel=\"noreferrer noopener\">Full Stack Developer Course<\/a> with AI Integration covers the entire journey, from HTML to deployment, with real projects, live sessions, and placement support. Over 10,000 students have used it to break into product-based companies.<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Real-World Scenario: Testing a User Registration Flow<\/strong><\/h2>\n\n\n\n<p>Let&#8217;s look at a concrete example. Say you&#8217;re building a user registration feature that hashes passwords and writes records to PostgreSQL.<\/p>\n\n\n\n<p>Without Testcontainers, you&#8217;d either mock the database call or use H2. With Testcontainers, your test flow looks like this:<\/p>\n\n\n\n<ol start=\"5\">\n<li>A fresh PostgreSQL container starts<\/li>\n\n\n\n<li>Your schema migration runs against it<\/li>\n\n\n\n<li>The test calls your real UserService.register() method<\/li>\n\n\n\n<li>It asserts that the record exists in the database with the correct hashed password<\/li>\n\n\n\n<li>The container shuts down \u2014 no cleanup needed<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>\ud83d\udca1 Pro Tip&nbsp; <\/strong>Run your real database migrations (Flyway or Liquibase) inside the test setup. This catches migration bugs before they reach production \u2014 a bug class that&#8217;s almost invisible with mocks or H2.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Best Practices for Using Testcontainers in Production Projects<\/strong><\/h2>\n\n\n\n<p>After working with Testcontainers across different codebases, a few patterns show up again and again as the ones that make the biggest difference:<\/p>\n\n\n\n<ul>\n<li>Use static containers \u2014 Annotating your container with @Container and static means one container per test class, not one per test method. This cuts your total test time significantly.<\/li>\n\n\n\n<li>Pin your Docker image tags \u2014 Never use postgres:latest in tests. Use postgres:16-alpine or whatever version matches your production environment.<\/li>\n\n\n\n<li>Use a shared network for multi-container setups \u2014 If your test needs both PostgreSQL and Redis, create a Docker Network and attach both containers to it. Testcontainers makes this straightforward.<\/li>\n\n\n\n<li>Run Testcontainers tests in CI \u2014 GitHub Actions, GitLab CI, and Jenkins all support Docker. Testcontainers works out of the box. Add TESTCONTAINERS_RYUK_DISABLED=true in environments where Ryuk causes problems.<\/li>\n\n\n\n<li>Reuse containers in local development \u2014 Enable container reuse with .withReuse(true) to skip startup on repeated test runs. This shaves seconds off your local feedback loop.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>\u2705 Best Practice&nbsp; <\/strong>Separate your Testcontainers tests into a dedicated source set or test suite (e.g., integrationTest). This lets developers run fast unit tests without starting Docker, and lets CI run integration tests on its own schedule.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Key Takeaways<\/strong><\/h2>\n\n\n\n<ul>\n<li>Testcontainers replaces mocks and in-memory databases with real containers \u2014 closing the gap between your test environment and production.<\/li>\n\n\n\n<li>It works with Java, Python, Node.js, Go, and more, with official modules for PostgreSQL, MySQL, Redis, Kafka, and dozens of other services.<\/li>\n\n\n\n<li>Container lifecycle is fully automatic \u2014 no manual setup, no teardown, no port conflicts.<\/li>\n\n\n\n<li>Static containers and container reuse keep test suites fast even as integration test coverage grows.<\/li>\n\n\n\n<li>Testcontainers integrates cleanly with JUnit 5, pytest, Jest, and most popular test frameworks.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Conclusion<\/strong><\/h2>\n\n\n\n<p>Mocks are a shortcut. Sometimes that&#8217;s the right call. But for integration tests \u2014 the ones that check whether your code actually works with your database, your queue, your cache \u2014 a mock will only ever tell you what you already believed.<\/p>\n\n\n\n<p>Testcontainers gives you the real thing. A real PostgreSQL instance. A real Kafka cluster. Real behavior, real constraints, real confidence.<\/p>\n\n\n\n<p>Getting started takes less than fifteen minutes. Pick one test. Swap the mock for a container. Run it. That experience tends to be convincing on its own.<\/p>\n\n\n\n<p>Explore the GUVI blog for more hands-on guides on Java testing, Docker, and the broader DevOps tooling ecosystem.<\/p>\n\n\n<div id=\"rank-math-faq\" class=\"rank-math-block\">\n<div class=\"rank-math-list \">\n<div id=\"faq-question-1784609734634\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \"><strong>1. What is Testcontainers used for?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Testcontainers is used to run real Docker containers during automated tests. Instead of mocking databases, message queues, or APIs, you test against the actual services your code depends on \u2014 giving you much more confidence that your code will work in production.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1784609750482\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \"><strong>2. Does Testcontainers work without Docker?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Testcontainers requires a Docker-compatible runtime. On a local machine, Docker Desktop is the easiest option. In CI, most platforms (GitHub Actions, GitLab CI, Jenkins) support Docker out of the box. If you&#8217;re on a machine without Docker, Testcontainers won&#8217;t run.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1784609766409\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \"><strong>3. How slow are Testcontainers tests compared to unit tests?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Container startup typically takes 2\u20135 seconds for most services. By using static containers (shared across test methods in a class), you pay that startup cost once per class rather than once per test. In practice, a full integration test suite with Testcontainers is usually 10\u201330 seconds slower than an equivalent mock-based suite \u2014 a worthwhile trade for the accuracy you gain.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1784609781385\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \"><strong>4. Can I use Testcontainers in GitHub Actions?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Yes. GitHub Actions supports Docker by default on its ubuntu-latest runners. No special configuration is needed. Just add your Testcontainers tests to your workflow, and they&#8217;ll run the same way they do locally.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1784609794529\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \"><strong>5. What databases and services does Testcontainers support?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Testcontainers has pre-built modules for PostgreSQL, MySQL, MariaDB, MongoDB, Redis, Kafka, RabbitMQ, Elasticsearch, MinIO, LocalStack (AWS), and many more. For any service that has a Docker image, you can also use a GenericContainer and configure it yourself.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1784609815999\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \"><strong>6. Is Testcontainers free to use?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>The Testcontainers library itself is open-source and free. Testcontainers Cloud (a hosted service from Docker that removes the need for local Docker) has a paid tier, but using the local library with your own Docker installation costs nothing.<\/p>\n\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Testcontainers is an open-source library that lets you run Docker containers inside your test suite. Instead of mocking a database or faking an API response, you get a real PostgreSQL instance, a real Redis server, or a real Kafka broker running only for the duration of your test. It supports Java, Python, Node.js, Go, Rust, [&hellip;]<\/p>\n","protected":false},"author":63,"featured_media":126919,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[294],"tags":[],"views":"16","authorinfo":{"name":"Vishalini Devarajan","url":"https:\/\/www.guvi.in\/blog\/author\/vishalini\/"},"thumbnailURL":"https:\/\/www.guvi.in\/blog\/wp-content\/uploads\/2026\/07\/Testcontainers-300x116.webp","_links":{"self":[{"href":"https:\/\/www.guvi.in\/blog\/wp-json\/wp\/v2\/posts\/124375"}],"collection":[{"href":"https:\/\/www.guvi.in\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.guvi.in\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.guvi.in\/blog\/wp-json\/wp\/v2\/users\/63"}],"replies":[{"embeddable":true,"href":"https:\/\/www.guvi.in\/blog\/wp-json\/wp\/v2\/comments?post=124375"}],"version-history":[{"count":8,"href":"https:\/\/www.guvi.in\/blog\/wp-json\/wp\/v2\/posts\/124375\/revisions"}],"predecessor-version":[{"id":127049,"href":"https:\/\/www.guvi.in\/blog\/wp-json\/wp\/v2\/posts\/124375\/revisions\/127049"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.guvi.in\/blog\/wp-json\/wp\/v2\/media\/126919"}],"wp:attachment":[{"href":"https:\/\/www.guvi.in\/blog\/wp-json\/wp\/v2\/media?parent=124375"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.guvi.in\/blog\/wp-json\/wp\/v2\/categories?post=124375"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.guvi.in\/blog\/wp-json\/wp\/v2\/tags?post=124375"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}