<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Pactflow Contract Testing Platform]]></title><description><![CDATA[Fast, easy and reliable testing for your APIs and microservices at scale]]></description><link>https://pactflow.io/</link><image><url>https://pactflow.io/favicon.png</url><title>Pactflow Contract Testing Platform</title><link>https://pactflow.io/</link></image><generator>Ghost 2.25</generator><lastBuildDate>Sat, 27 Jan 2024 22:53:37 GMT</lastBuildDate><atom:link href="https://pactflow.io/blog/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Integrate Deeper with our Developer API 🧿]]></title><description><![CDATA[Announcing the launch of PactFlow’s Developer API.]]></description><link>https://pactflow.io/blog/developer-api/</link><guid isPermaLink="false">6542bf6cfd948b00017f27f2</guid><category><![CDATA[feature]]></category><category><![CDATA[New Releases]]></category><category><![CDATA[API]]></category><category><![CDATA[oas]]></category><dc:creator><![CDATA[Matt Fellows]]></dc:creator><pubDate>Wed, 22 Nov 2023 00:36:54 GMT</pubDate><media:content url="https://s3-ap-southeast-2.amazonaws.com/content-prod-529546285894/2023/11/Screenshot-2023-11-02-at-8.22.37-am-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://s3-ap-southeast-2.amazonaws.com/content-prod-529546285894/2023/11/Screenshot-2023-11-02-at-8.22.37-am-1.png" alt="Integrate Deeper with our Developer API 🧿"><p>PactFlow’s officially supported Developer API has just landed.</p><p>As you may be aware, PactFlow is built atop the excellent <a href="https://github.com/pact-foundation/pact_broker">open-source Pact Broker</a>, extending it with various enterprise features to help our customers implement contract testing at scale.</p><p>The Pact Broker has a feature rich API, which is a <a href="https://martinfowler.com/articles/richardsonMaturityModel.html#level3">Richardson Maturity Model Level 3</a> compliant hypermedia API using the <a href="https://stateless.group/hal_specification.html">Hypertext Application Language (HAL)</a> convention for modelling relationships between resources.</p><h2 id="benefits-of-hypermedia-apis">Benefits of Hypermedia APIs</h2><p>Hypermedia APIs are "self-describing." An API client calls the root (<code>/</code>) endpoint and follows known links (called "relations") to perform various actions, such as creating applications, publishing contracts, or posting verification results. This allows resource URLs to change, and for the ecosystem to be more resilient. REST clients need little to no prior knowledge about how to interact with an app beyond a generic understanding of hypermedia.</p><!--kg-card-begin: html--><blockquote class="bg-primary-alt">
    <div class="h3 mb-2"><p>In essence, it simplifies your experience, allowing for flexible integration with your systems.</p><p></p></div>

  </blockquote><!--kg-card-end: html--><p>This model has served Pact and PactFlow very well. For example, it allows us to add additional PactFlow-specific behaviour to existing API workflows without changing or impacting open-source clients. So well, in fact, the Pact Broker API has remained backwards compatible for 9 years whilst introducing huge amounts of change and supporting a large community of open-source languages, CLIs and SDKs.</p><h2 id="an-api-with-clearer-documentation">An API with clearer documentation</h2><p>However, despite the self-documenting capabilities of HAL, our customers have told us in no-uncertain terms that it is hard to understand what capabilities exist in our API, and how to use it. This lack of visibility has made it harder to build tailored solutions on top of our API and adapt it to their ecosystem.</p><p>In August of this year, SmartBear released SwaggerHub Portal, our API documentation solution that makes it super easy to take an OpenAPI document from SwaggerHub and publish a user-friendly API Portal. Unfortunately, we did not have an OpenAPI document to describe our API. Until now.</p><h2 id="introducing-the-pactflow-developer-api">Introducing the PactFlow Developer API</h2><p>Today, we are announcing the launch of the PactFlow Developer API, released alongside some of our other products in <a href="https://smartbear.portal.swaggerhub.com/">SmartBear's API Portal</a>:</p><p>The documentation covers all of the basics you need to get started and integrate with our API:</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://s3-ap-southeast-2.amazonaws.com/content-prod-529546285894/2023/11/Screenshot-2023-11-02-at-8.22.37-am.png" class="kg-image" alt="Integrate Deeper with our Developer API 🧿"><figcaption>PactFlow API (Documentation View)</figcaption></figure><!--kg-card-end: image--><p>The API provides access to a rich collection of resources and capabilities, including but not limited to:</p><ul><li>Contract Management</li><li>User, Team, Roles and Permissions Management</li><li>Webhook creation</li><li>Matrix and `can-I-deploy` information</li><li>Audit trail</li></ul><p>...and much more.</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://s3-ap-southeast-2.amazonaws.com/content-prod-529546285894/2023/11/Screenshot-2023-11-02-at-4.15.00-pm.png" class="kg-image" alt="Integrate Deeper with our Developer API 🧿"><figcaption>PactFlow API (OpenAPI view)</figcaption></figure><!--kg-card-end: image--><h2 id="try-it-out-in-the-browser">Try it out in the browser</h2><p>One of the handy features is the ability to call PactFlow APIs from your browser using the "try it out" feature. Just pop in your tenant name and your API token, and you can start to interact with PactFlow APIs in just a few minutes:</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://s3-ap-southeast-2.amazonaws.com/content-prod-529546285894/2023/11/Screenshot-2023-11-02-at-5.21.25-pm.png" class="kg-image" alt="Integrate Deeper with our Developer API 🧿"><figcaption>Try it out feature</figcaption></figure><!--kg-card-end: image--><h2 id="use-cases">Use Cases</h2><p>We've had many customer requests for all sorts of items - here are some ideas to get you thinking:</p><ul><li>Integrating user management and permissions with your custom onboarding processes.</li><li>Creating a Maven plugin for X - "When all you have is a hammer, everything looks like a nail". Organisations that use Maven seem to need <em>everything</em> to be in Maven. Perhaps you would like to publish a provider contract (OAS) from Maven, record a deployment or delete a branch?</li><li>Create a Jenkins Plugin (️️☝ see also Maven 🤣) or integrate deeply into another CI service.</li><li>Build an SCM integration with GitHub, GitLab, Bitbucket to automatically delete old branches, report status checks or update PRs.</li><li>Integrate our metrics data into your reporting dashboard, such as Splunk or Sumologic</li></ul><h2 id="available-now">Available Now</h2><p>Our Developer API is available now to everyone on all plans. Head over to our API Portal to get started 👉 <a href="https://smartbear.portal.swaggerhub.com/pactflow/default/getting-started">https://smartbear.portal.swaggerhub.com/pactflow/default/getting-started</a>. </p><p>💡 Do you have something you'd like to build using our APIs? Connect with us in <a href="https://pact-foundation.slack.com/archives/CLS16AVEE">Slack</a> (<a href="https://slack.pact.io/">register here</a>) and we would love to chat with you.</p>]]></content:encoded></item><item><title><![CDATA[How to Contract Test with GraphQL]]></title><description><![CDATA[<p>The results from our State of Software Quality: API  2023 are in and it’s a multi-protocol world.</p><p>While REST continues to dominate, 23% of respondents claim to actively use GraphQL. This follows the multi-protocol trend we’ve observed for years now. There’s no doubt in our minds that</p>]]></description><link>https://pactflow.io/blog/contract-testing-for-graphql/</link><guid isPermaLink="false">653b0580fd948b00017f270e</guid><dc:creator><![CDATA[Jessie Eteng]]></dc:creator><pubDate>Thu, 16 Nov 2023 02:45:35 GMT</pubDate><content:encoded><![CDATA[<p>The results from our State of Software Quality: API  2023 are in and it’s a multi-protocol world.</p><p>While REST continues to dominate, 23% of respondents claim to actively use GraphQL. This follows the multi-protocol trend we’ve observed for years now. There’s no doubt in our minds that adoption for GraphQL will continue to grow YoY because of its many benefits.</p><p>If you’re new to the contract testing game, GraphQL or just need a refresher, follow along as we dive deeper into contract testing for GraphQL.</p><!--kg-card-begin: markdown--><h2 id="whatisgraphql">What is GraphQL?</h2>
<!--kg-card-end: markdown--><p><a href="https://smartbear.com/blog/what-is-graphql/" rel="noreferrer noopener">GraphQL</a> is a query language for APIs, enabling declarative data fetching from a variety of sources such as a database or another API. <a href="https://smartbear.com/blog/an-introduction-to-restful-apis-infographic/" rel="noreferrer noopener">Unlike REST APIs</a>, which requires users to stitch multiple resources together, GraphQL retrieves all required data in one request, using types and fields instead of individual endpoints with very specific data models.</p><p>GraphQL services can be implemented in any programming language, while the GraphQL schema language ensures consistency in a language-agnostic manner. Schemas define object types, each representing a fetchable object with associated fields. This offers a familiar structure for developers.</p><p>For example, the following GraphQL Schema shows how you might query to get a specific Product:</p><!--kg-card-begin: code--><pre><code class="language-graphql">type Product { 

    id: ID! 

    name: String! 

    type: String! 

    price: Int! 

} 

  

type Query { 

    product(id: ID!): Product 

}</code></pre><!--kg-card-end: code--><p><br>Each field on a type is backed by a resolver function, provided by the GraphQL server developer. When a field is executed, the corresponding resolver generates the next value. This approach streamlines back-end development by eliminating the need for writing specific responses or versioning APIs. Front-end teams benefit from requesting only the required data, enhancing both back-end and front-end performance.</p><h2 id="what-are-the-benefits-of-using-graphql">What are the benefits of using GraphQL?</h2><p>GraphQL offers several key benefits for developers and applications. One of the primary advantages is its flexibility, allowing clients to request precisely the data they need, with less over-fetching and under-fetching of information. This results in more efficient and faster data retrieval, improving the performance of applications.</p><p>Additionally, GraphQL promotes a strong type system, offering auto-generated documentation, making it easier to understand the available data and operations. Overall, GraphQL enhances the developer experience, optimizes data transfer, and enables a more streamlined and responsive approach to building modern, data-driven applications.</p><h2 id="the-case-for-contract-testing-graphql">The case for contract testing GraphQL</h2><p>Contract testing is a software testing approach that focuses on the interactions between different software components to ensure they can communicate effectively. It does so by capturing a contract, which records the specific details of their interactions – such as HTTP requests and responses – and the scenarios in which they are valid.</p><p>You may then ask what is the value of contract testing GraphQL, which itself has a form of contract already – the GraphQL Schema?</p><!--kg-card-begin: markdown--><p>Whilst this is a good point, there are several reasons to consider contract testing for GraphQL to prevent production issues:</p>
<ul>
<li>
<p>It doesn’t prevent breaking changes– the GraphQL schema can change on the server side and any clients expecting the previous behaviour will be broken.</p>
</li>
<li>
<p><a href="https://pactflow.io/blog/schemas-are-not-contracts/">Schemas are abstract</a> and insufficient to describe API semantics– which can lead to incorrect assumptions about how the API is supposed to work.</p>
</li>
<li>
<p>GraphQL’s deprecation feature is at runtime – too late to notify any users of the API!</p>
</li>
</ul>
<!--kg-card-end: markdown--><p>Contract testing with Pact resolves this, as each scenario is made explicit via the “specification by example” approach.</p><!--kg-card-begin: markdown--><p>Here are some of the benefits of using contract testing for GraphQL APIs:</p>
<ul>
<li>
<p>Gain visibility into consumers: knowing who your consumers are and what they need gives you greater freedom to evolve your API</p>
</li>
<li>
<p>Increased confidence: prevent releasing breaking changes to users, before you commit</p>
</li>
<li>
<p>Improved communication: by making scenarios explicit, you can improve communication between developers who are working on different GraphQL APIs (This is because contract tests provide a common reference point for understanding the expected behavior of the APIs)</p>
</li>
<li>
<p>GraphQL often relies on HTTP services downstream, so adding contract tests in these layers will improve confidence all of the way down the stack</p>
</li>
</ul>
<!--kg-card-end: markdown--><h2 id="how-to-test-your-graphql-using-pactflow">How to test your GraphQL using PactFlow</h2><p>It turns out <a href="https://pactflow.io/blog/contract-testing-a-graphql-api/">contract testing GraphQL</a> is not a lot different than testing other HTTP services, as GraphQL is just an abstraction over HTTP.</p><!--kg-card-begin: markdown--><h3 id="1installpactclientlanguagesdk">1. Install Pact client language SDK</h3>
<p>Pact supports over 10 languages., iIn this example, we will use Java. See <a href="https://github.com/pact-foundation/pact-jvm">https://github.com/pact-foundation/pact-jvm</a> for installation instructions.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h3 id="2writeconsumertest">2. Write consumer test</h3>
<p>The consumer and provider can be implemented in any programming language. The consumer will need to be able to send GraphQL queries and mutations, and the provider will need to be able to respond to GraphQL queries and mutations.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: code--><pre><code class="language-java">@ExtendWith(PactConsumerTestExt.class) 

@PactTestFor(providerName = "graphql-api") 

public class ProductsPactTest { 

  @Pact(consumer="graphql-consumer") 

  public RequestResponsePact getProduct(PactDslWithProvider builder) { 

    // Arrange: establish the mock and test conditions 

    PactDslJsonBody body = new PactDslJsonBody(); 

    body 

      .object("data") 

        .object("product") 

          .stringType("id", "10") 

          .stringType("name", "product name") 

          .stringType("type", "product series") 

        .closeObject() 

      .closeObject(); 

    final String query = """ 

      { 

      "query": "{ 

        product(id: 10) { 

          id 

          name 

          type 

        }} 

      "} 

      """; 

    return builder 

      .given("a product with ID 10 exists") 

      .uponReceiving("a request to get a product via GraphQL") 

        .path("/graphql") 

        .headers(Map.of("content-type", "application/json")) 

        .method("POST") 

        .body(query) 

      .willRespondWith() 

        .headers(Map.of("content-type", "application/json")) 

        .status(200) 

        .body(body) 

      .toPact(); 

  } 

  @PactTestFor(pactMethod = "getProduct") 

  @Test 

  public void testGetProduct(MockServer mockServer) throws IOException, URISyntaxException { 

    // Act: call the API client we are testing 

    Product product = new ProductClient().setUrl(mockServer.getUrl()).getProduct("10"); 

  

    // Assert: perform any other relevant unit testing checks, such as the product unmarshaling correctly 

    assertThat(product.getId(), is("10")); 

  } 

}</code></pre><!--kg-card-end: code--><!--kg-card-begin: markdown--><h3 id="3verifythegraphqlapiprovider">3. Verify the GraphQL API (Provider)</h3>
<p>Now that we have our contract file (locally), let’s validate it. To do this, we simply need to start our GraphQL API on our machine, and tell Pact:</p>
<ol>
<li>Where the API is running (here, on port 8080)</li>
<li>Where to find the pact file to validate (a local directory)</li>
</ol>
<!--kg-card-end: markdown--><!--kg-card-begin: code--><pre><code class="language-java">@ExtendWith(SpringExtension.class) 

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) 

@PactFolder("path/to/pact/directory/from/step/1") 

class ProductsPactTest { 

  @Autowired 

  ProductRepository repository; 

  @BeforeEach 

  public void setupTestTarget(PactVerificationContext context) { 

    context.setTarget(new HttpTestTarget("localhost", 8080)); 

  } 

  @TestTemplate 

  @ExtendWith(PactVerificationInvocationContextProvider.class) 

  public void pactVerificationTestTemplate(PactVerificationContext context) { 

    context.verifyInteraction(); 

  } 

  @State("a product with ID 10 exists") 

  public void setupProductX010000021() throws IOException { 

    System.out.println("a product with ID 10 exists"); 

    repository.save(new Product(10L, "test", "product description", "1.0.0")); 

  } 

} </code></pre><!--kg-card-end: code--><p>That’s it – we have now performed a basic GraphQL contract testing. To do it properly, you should integrate this with PactFlow and into your <a href="https://docs.pact.io/pact_nirvana" rel="noreferrer noopener">CI/CD pipeline</a>.</p><p>To learn more, try out our <a href="https://docs.pactflow.io/docs/examples/java/consumer/graphql/" rel="noreferrer noopener">GraphQL example</a> or check out <a href="https://docs.pact.io/" rel="noreferrer noopener">our documentation</a>.</p><h2 id="avoid-fomo-try-it-out-now">Avoid FOMO, try it out now</h2><p>GraphQL is a powerful and flexible API query language that offers a number of benefits for both developers and users. It is a good choice for building a wide variety of applications, from simple websites to complex enterprise systems. As microservices architecture continues to increase in demand, so will GraphQL’s popularity.</p><p>Ready to start contract testing your GraphQL? <a href="https://pactflow.io/try-for-free/" rel="noreferrer noopener">Try PactFlow for free now</a>.</p>]]></content:encoded></item><item><title><![CDATA[Farewell Candy: Levelling Up Beyond Our Team!]]></title><description><![CDATA[<p>Today, we're hitting a unique combo of emotions – a mix of joy for what lies ahead and a tinge of sadness for what's coming to an end.</p><p>Our wonderful Candy, the young and spirited software engineer who has been an integral part of our PactFlow family since 2021, is embarking</p>]]></description><link>https://pactflow.io/blog/farewell-candy-levelling-up-beyond-our-team/</link><guid isPermaLink="false">64e6a7cc85575e0001cc77b1</guid><dc:creator><![CDATA[Ilia Mogilevsky]]></dc:creator><pubDate>Fri, 25 Aug 2023 01:00:00 GMT</pubDate><media:content url="https://s3-ap-southeast-2.amazonaws.com/content-prod-529546285894/2023/08/received_617953133779172.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://s3-ap-southeast-2.amazonaws.com/content-prod-529546285894/2023/08/received_617953133779172.jpg" alt="Farewell Candy: Levelling Up Beyond Our Team!"><p>Today, we're hitting a unique combo of emotions – a mix of joy for what lies ahead and a tinge of sadness for what's coming to an end.</p><p>Our wonderful Candy, the young and spirited software engineer who has been an integral part of our PactFlow family since 2021, is embarking on a new adventure.</p><p>From turning code into digital symphonies to crafting yarn into cute masterpieces, Candy has truly been a unicorn in our midst. Her ability to debug a tricky situation is matched only by her knack for turning a ball of yarn into something truly magical.</p><p>Juggling between code syntax and crochet stitches, Candy has shown us that life isn't just about tasks; it's about finding joy in what we do.</p><p>But here's the good news – while Candy might be bidding adieu to SmartBear and PactFlow, she's not leaving our Pact community – she is still a part of the journey (once you go Pact, you never look back!)</p><p>As we wave goodbye and wish her luck, we know that Candy's adventure is far from over. It's a "To Be Continued" that promises exciting quests, challenging levels, and untold surprises. Whether she's debugging lines of code or creating intricate crochet patterns, we're certain that Candy's journey will continue to be a tapestry of achievements and plenty of successes.</p><p>Candy, as you venture forward into the great unknown, remember that you're not just leaving our small (yet mightily) team; you're stepping into a world of endless possibilities.</p><p>Keep leveling up, keep crafting magic, and remember that our virtual doors will always be open for you. You've been more than a colleague – you've been a friend, and a bundle of positive energy that's made our days better.</p><p>Here's to Candy – the coding connoisseur, the crochet queen, the gaming guru, and the vibrant spirit of our team since 2021. We'll miss you, but we're excited to see you conquer new horizons.</p><p>Until our paths cross again,</p><p>Your PactFlow Family</p>]]></content:encoded></item><item><title><![CDATA[Five Reasons Why Your Contract Testing Initiative Could Fail (And How to Avoid Them)]]></title><description><![CDATA[Set yourself up for contract testing success. Joe Joyce - Senior Solutions Engineer at SmartBear - explains the five most common reasons a contract testing initiative could fail and how to avoid them. ]]></description><link>https://pactflow.io/blog/five-reasons-why-your-contract-testing-initiative-could-fail-and-how-to-avoid-them/</link><guid isPermaLink="false">64a7e6cc28bcd20001324cba</guid><category><![CDATA[contract testing]]></category><dc:creator><![CDATA[Joe Joyce]]></dc:creator><pubDate>Fri, 07 Jul 2023 10:33:23 GMT</pubDate><media:content url="https://s3-ap-southeast-2.amazonaws.com/content-prod-529546285894/2023/07/scope.JPG" medium="image"/><content:encoded><![CDATA[<img src="https://s3-ap-southeast-2.amazonaws.com/content-prod-529546285894/2023/07/scope.JPG" alt="Five Reasons Why Your Contract Testing Initiative Could Fail (And How to Avoid Them)"><p>In April 2022, <a href="https://pactflow.io/blog/pactflow-joins-the-smartbear-family/">SmartBear acquired PactFlow</a>, adding contract testing to our API platform. This meant different things for our company, but for me it meant diving head-first into the contract testing methodology and the Pact framework. This was so I could become fluent in explaining it to software development teams whose only experience with Pact might be a blog post or hearing it mentioned in conversation. Simple, right?</p><p>Thankfully, there were plenty of workshops and articles to help me learn the ropes. Once I had a solid understanding of the fundamentals, it was time to start talking to teams interested in the technology, then help them figure out if contract testing could solve some of their software delivery challenges. With over a year’s worth of conversations, I’d seen many success stories, but I also saw plenty of teams and companies who couldn’t fully unlock the value of contract testing. In the latter scenario, it’s usually down to one or more of the following things:</p><h2 id="1-the-return-on-investment-wasn-t-clear-enough">1. The return on investment wasn’t clear enough</h2><p>When I’m supporting a team with their contract testing proof of concept (POC), the first thing I ask them to do is review their integration test suites. The primary value of contract tests comes from the fact that, in the long run, they’re cheaper to run and maintain than traditional end-to-end integration tests. Ahead of a POC, I’ll ask teams to think about how much time they currently spend on things like:</p><ul><li>Building and maintaining test environments</li><li>Writing and executing integration tests</li><li>Debugging integration tests failures</li><li>Fixing flakey integration tests</li></ul><p>This will give the team and the wider organization a clear idea of the value of contract tests, specifically how they save development and compute time while providing faster feedback. Once these metrics are well-defined and understood, it’s easier to communicate to other teams the return on investment contract testing can provide.</p><!--kg-card-begin: html--><blockquote class="bg-primary-alt">
    <div class="h3 mb-2">
      <p>Ask one of the friendly SmartBear sales team for your own PactFlow POC template – a customizable tool to help you set out your POC goals in advance to convey the return on investment. </p>
     </div>
  </blockquote><!--kg-card-end: html--><h2 id="2-the-purpose-of-contract-tests-wasn-t-defined-well-enough">2. The purpose of contract tests wasn’t defined well enough</h2><p>I’ve lost count of the number of times I’ve said it over the last year; <a href="https://docs.pact.io/consumer/contract_tests_not_functional_tests" rel="noreferrer noopener">contract tests aren’t functional tests</a>. The best analogy I’ve heard so far goes like this:  </p><p><em>Let’s say I walk up to you on the street, hand you an envelope and ask you to post it for me. A contract test would verify you understood my request, but wouldn’t verify you  post the letter, the letter reaches its destination, or that I get a reply, etc.</em></p><p>Those things (we could call them system side effects) would be better verified by using functional tests. Ideally, contract tests focus on the messages flowing between a consumer and provider and ignore other elements of the system. A misunderstanding of the purpose of contract tests can lead to frustration amongst the developers and testers who are tasked with writing and maintaining them.  </p><!--kg-card-begin: html--><blockquote class="bg-primary-alt">
    <div class="h3 mb-2">
      <p>This <a href="https://pactflow.io/blog/contract-testing-vs-integration-testing/">blog demonstrates</a> the purpose of contract testing in the context of the testing pyramid conveying the difference between unit, integration, E2E and contract tests.</p>
     </div>
  </blockquote><!--kg-card-end: html--><h2 id="3-the-scope-of-your-contract-tests-was-too-wide">3. The scope of your contract tests was too wide</h2><p>The best examples of contract tests will focus on the data access layer of the consumer and, even more specifically, the part of that layer we would consider the API client. If I’m working with a team that isn't immediately sure what part of their code this is, I ask them the following question:  </p><!--kg-card-begin: html--><blockquote class="bg-primary-alt">
    <div class="h3 mb-2">
      <p>What part of your code is responsible for translating your application’s business domain objects and data into HTTP requests getting sent to the provider?</p>
     </div>
  </blockquote><!--kg-card-end: html--><p>That’s where contract tests are going to be most effective. A good contract test shouldn’t be interested in the consumer’s business logic or the provider’s business logic - that would still be the realm of the respective teams’ functional tests. The risk here is, once again, teams get frustrated with brittle and difficult to maintain contract tests which, if you remember from earlier, are exactly what we’re trying to avoid.</p><h2 id="4-there-wasn-t-enough-communication-between-consumers-and-providers">4. There wasn’t enough communication between consumers and providers</h2><p>A less technical, but no less important, reason I see organizations fail to maximize the benefits of contract testing is due to poor communication between the teams involved. One benefit of contract testing is you can decouple teams that otherwise would depend on (and potentially be blocked by) each other’s work. However, contract testing isn’t a substitute for open and easy communication between different development teams within an organization.</p><p>For example, I’ve had conversations with provider teams who are eager to implement contract testing with Pact and PactFlow but who don’t have lines of communication open with the consumer(s) of their application. Worse, they can’t tell me who these consumers might be. It takes two to tango, and in the world of contract testing, both sides of an integration need to be sold on contract testing for it to provide value to the organization.</p><p>Having a shared understanding of the value means consumers and providers need to be able to communicate and collaborate effectively. This can also result in a lack of buy-in and integration into your organization’s engineering culture. A lot of the companies I work with see pockets of success but struggle to unlock the next level of value because contract testing isn’t truly part of their ways of working.</p><!--kg-card-begin: html--><blockquote class="bg-primary-alt">
    <div class="h3 mb-2">
      <p>Some ways to facilitate this are setting up communities of practice and internal templates/educational materials tailored to your organization’s tech stack and business domains. Without these mechanisms, you’ll struggle to embed contract testing at your company.</p>
     </div>
  </blockquote><!--kg-card-end: html--><h2 id="5-you-didn-t-know-about-the-pact-foundation-slack-workspace">5. You didn’t know about the Pact Foundation Slack workspace </h2><p>Finally, a shameless plug. PactFlow wouldn’t exist without the work of the community behind Pact. The <a href="https://docs.pactflow.io/#pact-slack">Pact Foundation Slack workspace</a> is filled with nearly 5,000 practitioners who are hands-on with the various implementations of Pact and the related technologies (such as the open-source Pact Broker and PactFlow.) The invite link to this workspace is one of the first things I’ll send to a team embarking on a contract testing POC, because it’s the best place to look to get answers to implementation-related questions from people who have done it before and seen positive results.</p><p>So, you’ve read some articles, watched some videos, talked to colleagues who’ve done it before and you’re ready to find out if contract testing could save time and money for your team. Keep these five points in mind, and you’ll be in <a href="https://docs.pact.io/pact_nirvana" rel="noreferrer noopener">Pact Nirvana</a> in no time!</p><p>Getting started:</p><ul><li>Create a <a href="https://pactflow.io/try-for-free">free PactFlow account</a> to spin up your POC in no time </li><li>Complete the <a href="https://smartbear.com/academy/pactflow/">contract testing courses in the SmartBear Academy</a> and get your contract testing certification </li></ul>]]></content:encoded></item><item><title><![CDATA[Contract Testing for gRPC and Protobuf]]></title><description><![CDATA[gRPC and Protobuf have increased in popularity, but are they safer than REST? In this article, we discuss the how and why of gRPC contract testing.]]></description><link>https://pactflow.io/blog/contract-testing-for-grpc-and-protobufs/</link><guid isPermaLink="false">646b045a899f5a0001eccff2</guid><category><![CDATA[protobufs]]></category><category><![CDATA[grpc]]></category><category><![CDATA[plugins]]></category><category><![CDATA[pact]]></category><dc:creator><![CDATA[Matt Fellows]]></dc:creator><pubDate>Tue, 30 May 2023 00:17:34 GMT</pubDate><content:encoded><![CDATA[<h2 id="it-s-a-multi-protocol-world">It's a Multi-Protocol World</h2><p>In SmartBear's  <a href="https://smartbear.com/state-of-software-quality/api/tools/">State of Software Quality API (2023)</a> report, 9% of respondents reported using gRPC in their organisations, with 7% also reporting the use of Protobuf. This follows a trend we've seen over multiple editions now, where a majority of organisations operate within a multi-protocol environment (81%), and 57% have to manage 3 or more protocols.</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://s3-ap-southeast-2.amazonaws.com/content-prod-529546285894/2023/05/Screenshot-2023-05-30-at-11.01.00-am--2-.png" class="kg-image"><figcaption>From the <a href="https://smartbear.com/state-of-software-quality/api/tools/">SmartBear State of Software Quality - API (2023)</a> Report</figcaption></figure><!--kg-card-end: image--><p>In this article, we look into gRPC and Protobuf, and discuss their benefits, the types of breaking changes they are susceptible to, and finally and how Pact and PactFlow can be used to support gRPC contract testing to improve safety and reliability.</p><h2 id="what-is-grpc">What is gRPC?</h2><p>From <a href="https://grpc.io/">https://grpc.io/</a>:</p><!--kg-card-begin: html--><blockquote class="bg-primary-alt">
    <div class="h3 mb-2"><p>gRPC is a modern open source high performance Remote Procedure Call (RPC) framework that can run in any environment. It can efficiently connect services in and across data centers with pluggable support for load balancing, tracing, health checking and authentication. It is also applicable in last mile of distributed computing to connect devices, mobile applications and browsers to backend services.</p><p></p></div>

  </blockquote><!--kg-card-end: html--><p>In our experience, gRPC is often used as a replacement for <em>internal service communications</em> over the popular JSON/HTTP – or REST paradigm – where domain concepts (resources) are represented and transferred over HTTP, and HTTP verbs used as operations to act on them. </p><p>Remote Procedure Calls (or RPCs for short) by contrast, and as the name implies, are more concerned about procedures - doing things. They can be made to be entity-centric if desired; however, they need not be. For this reason, it can be simpler to implement as it doesn't require you to think about mapping your requirements onto resources and operations in the way REST does. Many RPC frameworks are also quite opinionated, further reducing the decision making and enabling rich tooling that can, for example, autogenerate client SDKs or produce documentation. </p><p>Whilst RPC style communication has existed for eons, gRPC has a particular focus and has found root in systems that require:</p><ul><li>Performance</li><li>Scale</li><li>Polyglot language support</li><li>Multiple communication styles such as bi-directional streaming, fire-and-forget messages, and server push</li></ul><p>Companies like <a href="https://tech.deliveryhero.com/our-reliability-manifesto/">Delivery Hero</a>, <a href="https://grpc.io/about/">Square, Netflix,</a> <a href="https://stackshare.io/grpc">Slack, Medium</a>, and <a href="https://armeria.dev/">Afterpay</a> all have made decisions to use gRPC on the basis of performance. Here is a rule (E-5) from the Delivery Hero Reliability Manifesto, that clearly shows why they've bet on gRPC:</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://s3-ap-southeast-2.amazonaws.com/content-prod-529546285894/2023/05/Screenshot-2023-05-29-at-3.05.09-pm.png" class="kg-image"><figcaption>The Delivery Hero Reliability Manifesto rule E-5. Source: <a href="https://tech.deliveryhero.com/our-reliability-manifesto/">https://tech.deliveryhero.com/our-reliability-manifesto/</a></figcaption></figure><!--kg-card-end: image--><p><em>Fun fact:</em> the 'g' in gRPC stands for something <a href="https://grpc.github.io/grpc/core/md_doc_g_stands_for.html">different</a> every release.</p><h2 id="what-is-protobuf">What is Protobuf?</h2><p>If gRPC is an alternative to the REST paradigm, Protocol Buffers – or Protobuf for short – replaces the most common REST payload type: JSON. </p><!--kg-card-begin: html--><blockquote class="bg-primary-alt">
    <div class="h3 mb-2"><p>Protocol buffers provide a language-neutral, platform-neutral, extensible mechanism for serializing structured data in a forward-compatible and backward-compatible way. It’s like JSON, except it's smaller and faster, and it generates native language bindings.</p><p></p></div>

  </blockquote><!--kg-card-end: html--><p>Its benefits include:</p><ol><li>Being smaller and faster than many other serialisation formats</li><li>Built-in forward- and backward-compatibility (schema evolution)</li><li>Code generation tooling to create server/client SDKs</li></ol><p>It's common for gRPC and Protobuf to be paired together, but it's important to note that they need not be used together. gRPC can work with other payload types, and Protobuf can be used with other transports and communication frameworks. </p><p>In fact, it's quite common for Protobuf to be used outside of gRPC as it turns out to be a good fit for streaming solutions such as Kafka, high-volume messaging systems, data pipelines and even as the payload for more performant HTTP systems.</p><h2 id="the-case-for-contract-testing-grpc-and-protobuf">The Case For Contract Testing gRPC and Protobuf</h2><p>We've <a href="https://pactflow.io/blog/the-case-for-contract-testing-protobufs-grpc-avro/">written</a> about the <a href="https://pactflow.io/blog/the-case-for-contract-testing-protobufs-grpc-avro/">case for contract testing gRPC and Protobuf</a> before, but to recap, the following are ways we can break a contract with our consumers:</p><ol><li>Protocol-level breaking changes</li><li>Handling changes to message semantics</li><li>Coordinating changes (forward-compatibility) and dependency management </li><li>Providing transport layer safety (less of an issue when Protobuf is paired with gRPC)</li><li>Ensuring narrow type safety (strict encodings)</li><li>Loss of visibility into real-world client usage</li><li>Optionals and defaults: a race to incomprehensible APIs</li></ol><p>Returning to our <a href="https://smartbear.com/state-of-software-quality/api/tools/">survey</a>, then, it's not surprising that 21% of respondents identified their top risk of poor-quality APIs being "loss of contract" and 34% were concerned about impacting other internal teams that rely on their APIs.</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://s3-ap-southeast-2.amazonaws.com/content-prod-529546285894/2023/05/Screenshot-2023-05-30-at-11.04.20-am.png" class="kg-image"><figcaption>From the <a href="https://smartbear.com/state-of-software-quality/api/tools/">SmartBear State of Software Quality - API (2023)</a> Report</figcaption></figure><!--kg-card-end: image--><p>So how can we address some of these problems?</p><h2 id="introducing-contract-testing-for-grpc">Introducing Contract Testing for gRPC</h2><p>gRPC contract testing is made possible with the <a href="https://docs.pact.io/blog/2022/11/11/pact-plugin-framework-launch">Pact Plugin Framework</a>. Plugins enable you to extend the capabilities of Pact in order to test novel transports or content types or, in the case of gRPC/Protobuf - both!</p><p>The steps to contract testing with gRPC and Protobuf are the same as with any regular Pact test, with the only difference that we need to install a plugin to validate the new transport and content types:</p><ol><li>Install the <a href="https://github.com/pactflow/pact-protobuf-plugin">gRPC/protobuf plugin</a> <em>(Update: More recent versions of your tooling may automatically discover and download this for you)</em></li><li>Write a consumer test</li><li>Publish the contract</li><li>Verify your provider</li></ol><p>Let's run through these in turn through a simple Java example: the Area Calculator.</p><h3 id="grpc-contract-testing-example-the-area-calculator">gRPC Contract Testing Example: The Area Calculator</h3><p>The Area Calculator gRPC example can receive a shape via gRPC call, and return its area. It uses Protobuf as the payload, so that we can try out contract testing with both at once. See the <a href="https://github.com/pact-foundation/pact-plugins/blob/main/examples/gRPC/area_calculator/proto/area_calculator.proto">proto file</a> for the full definition of the service.</p><p>The proto file has a single service method <code>calculateOne</code>, which these examples will be testing, and a few different-shaped requests/responses:</p><!--kg-card-begin: code--><figure class="kg-card kg-code-card"><pre><code class="language-protobuf">service Calculator {
  // RPC method we are testing
  rpc calculateOne (ShapeMessage) returns (AreaResponse) {}
}

// A polymorphic, Protobuf data type
message ShapeMessage {
  oneof shape {
    Square square = 1;
    Rectangle rectangle = 2;
    Circle circle = 3;
    Triangle triangle = 4;
    Parallelogram parallelogram = 5;
  }
}

// One of the polymorphic shapes we can calculate the area for
message Square {
  float edge_length = 1;
}

...

// Response body
message AreaResponse {
  repeated float value = 1;
}</code></pre><figcaption>The Area Calculator RPC definition..</figcaption></figure><!--kg-card-end: code--><p>The full project can be downloaded <a href="https://github.com/pact-foundation/pact-plugins/tree/main/examples/gRPC/area_calculator">here</a>. </p><h3 id="step-1-install-the-protobuf-plugin">Step 1: Install the Protobuf Plugin</h3><p>Once you have installed the <a href="https://docs.pact.io/implementation_guides/cli">Pact CLI tools</a>, you can install the plugin by its registered name (<code>protobuf</code>), and it will be automatically discovered and installed into the relevant location on your machine:</p><!--kg-card-begin: code--><figure class="kg-card kg-code-card"><pre><code class="language-bash">pact-plugin-cli -y install protobuf</code></pre><figcaption>Installing the protobuf Pact plugin using the CLI</figcaption></figure><!--kg-card-end: code--><h3 id="step-2-grpc-consumer-contract-test">Step 2: gRPC Consumer Contract Test</h3><p>Now that you have the plugin installed, you can write a test for your gRPC client. Just like any other Pact test, we must set up the mock with our expectations (<code>calculateRectangleArea</code> with the <code>@Pact</code> annotation), and then test our gRPC client and ensure it worked as expected (<code>calculateRectangleArea</code>  with the <code>@PactTestFor</code> annotation). </p><p>The commented JUnit test below should look familiar to experienced Pact users with some subtle differences to accommodate the use of plugins:</p><!--kg-card-begin: code--><figure class="kg-card kg-code-card"><pre><code class="language-java">/**
 * Main test class for the AreaCalculator calculate service method call.
 */
@ExtendWith(PactConsumerTestExt.class)
@PactTestFor(providerName = "area-calculator-provider", providerType = ProviderType.SYNCH_MESSAGE, pactVersion = PactSpecVersion.V4)
public class PactConsumerTest {

  /**
   * Configures the Pact interaction for the test. This will load the Protobuf plugin, which will provide all the
   * Protobuf and gRPC support to the Pact framework.
   */
  @Pact(consumer = "grpc-consumer-jvm")
  V4Pact calculateRectangleArea(PactBuilder builder) {
    return builder
      // Tell Pact we need the Protobuf plugin
      .usingPlugin("protobuf")
      // We will use a V4 synchronous message interaction for the test
      .expectsToReceive("calculate rectangle area request", "core/interaction/synchronous-message")
      // We need to pass all the details for the interaction over to the plugin
      .with(Map.of(
        // Configure the proto file, the content type and the service we expect to invoke
        "pact:proto", filePath("../proto/area_calculator.proto"),
        "pact:content-type", "application/grpc",
        "pact:proto-service", "Calculator/calculateOne",

        // Details on the request message (ShapeMessage) we will send
        "request", Map.of(
          "rectangle", Map.of(
              "length", "matching(number, 3)",
              "width", "matching(number, 4)"
          )),

        // Details on the response message we expect to get back (AreaResponse)
        "response", List.of(
            Map.of(
              "value", "matching(number, 12)"
            )
          )
      ))
      .toPact();
  }

  /**
   * Main test method. This method will receive a gRPC mock server and example request message, which we will use the
   * generated stub classes to send to the mock server. The mock server will return the AreaResponse message configured
   * from the values in the setup method above.
   */
  @Test
  @PactTestFor(pactMethod = "calculateRectangleArea")
  @MockServerConfig(implementation = MockServerImplementation.Plugin, registryEntry = "protobuf/transport/grpc")
  void calculateRectangleArea(MockServer mockServer, V4Interaction.SynchronousMessages interaction) throws InvalidProtocolBufferException {
    ManagedChannel channel = ManagedChannelBuilder.forTarget("127.0.0.1:" + mockServer.getPort())
      .usePlaintext()
      .build();
    CalculatorGrpc.CalculatorBlockingStub stub = newBlockingStub(channel);

    // Correct request
    AreaCalculator.ShapeMessage shapeMessage = AreaCalculator.ShapeMessage.parseFrom(interaction.getRequest().getContents().getValue());
    AreaCalculator.AreaResponse response = stub.calculateOne(shapeMessage);
    assertThat(response.getValue(0), equalTo(12.0F));
  }
}</code></pre><figcaption>gRPC Contract Testing - Java Consumer Example</figcaption></figure><!--kg-card-end: code--><p>This should produce a pact file in the project's build directory, if successful.</p><h3 id="step-3-publish-grpc-contract">Step 3: Publish gRPC Contract</h3><p>Publishing your contract is the same as any other Pact test, and we always recommend using our <a href="https://docs.pact.io/implementation_guides/cli">CLI</a> for this job:</p><!--kg-card-begin: code--><figure class="kg-card kg-code-card"><pre><code class="language-bash">pact-broker publish 
  --consumer-app-version 1.0.0
  ../consumer-jvm/build/pacts/protobuf-consumer-area-calculator-provider.json</code></pre><figcaption>Pact Publishing CLI Command</figcaption></figure><!--kg-card-end: code--><p><em>NOTE: You will need to ensure the relevant <code>PACT_BROKER_*</code> credentials are present in your terminal.</em></p><p>Publishing your contract to PactFlow, you can see the integration and contract details, as you would with any other:</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://s3-ap-southeast-2.amazonaws.com/content-prod-529546285894/2023/05/output.gif" class="kg-image"><figcaption>PactFlow UI view of the gRPC/Protobuf contract</figcaption></figure><!--kg-card-end: image--><h3 id="step-4-grpc-provider-contract-test">Step 4: gRPC Provider Contract Test</h3><p>Now that we have a contract that captures the consumer's needs, we need to ensure the provider satisfies them.</p><p>Depending on the language and toolchains you use and environment you're testing against, you might be able to run this natively in those tools (such as from within JUnit, Gradle, or Maven in JVM ecosystems), or you may choose to execute the tests externally using our CLI. In this example, we'll use the CLI as it can be used to test any language, framework or system so long as it's accessible to the verifier.</p><p>You first will need to start your gRPC service locally (preferred), or have it deployed to a test environment for testing (less preferable). Once the service is running, you can simply run the verifier, passing the details of the contract you wish to validate and the port to communicate to your running gRPC service:</p><!--kg-card-begin: code--><figure class="kg-card kg-code-card"><pre><code class="language-bash">gRPC/area_calculator/provider-jvm: 
❯ pact_verifier_cli -f ../consumer-jvm/build/pacts/protobuf-consumer-area-calculator-provider.json -p 37757 -l none
2022-05-02T04:29:36.636972Z  INFO main pact_verifier: Pact file requires plugins, will load those now
2022-05-02T04:29:36.638556Z  WARN tokio-runtime-worker pact_plugin_driver::metrics: 

Please note:
We are tracking this plugin load anonymously to gather important usage statistics.
To disable tracking, set the 'pact_do_not_track' environment variable to 'true'.


2022-05-02T04:29:36.873435Z  INFO                 main pact_verifier: Running provider verification for 'calculate rectangle area request'

Verifying a pact between protobuf-consumer and area-calculator-provider

  calculate rectangle area request

  Test Name: io.pact.example.grpc.consumer.PactConsumerTest.calculateRectangleArea(MockServer, SynchronousMessages)

  Given a Calculator/calculate request
      with an input .area_calculator.ShapeMessage message
      will return an output .area_calculator.AreaResponse message [OK]</code></pre><figcaption>gRPC Contract Testing - Java Provider Example</figcaption></figure><!--kg-card-end: code--><p>👏 And there we have it. We have confirmed that our gRPC client is able to call the calculator with a <code>Rectangle</code> shape, and that it can receive, parse and understand the <code>AreaResponse</code> message. </p><p>If the provider later decided to remove the <code>Square</code> from the list of supported shapes, this would be a safe operation to do. If it decided to accept string-encoded numbers (for example, to encode higher-precision values), this would cause a failure as the types are incorrect.</p><h3 id="grpc-contract-testing-guarantees">gRPC Contract Testing Guarantees</h3><p>By using contract testing, we were able to address 6 out of the 7 problems that gRPC and Protobuf introduce:</p><ol><li>✅ Protocol-level breaking changes – Relevant protocol mismatches will be caught during the contract test, because the plugin will not be able to either parse or verify the expected consumer types.</li><li>✅ Handling changes to message semantics – The contract test captures the representative examples and resolves ambiguous possibilities.</li><li>✅ Coordinating changes (forward-compatibility) and dependency management – Through the use of the Pact Broker and versioning, Pact can allow teams to ship safely into production with the comfort that they are compatible with their consumers.</li><li>✅ Providing transport layer safety (less of an issue for gRPC) – We haven't shown this here, but if Protobuf was used over HTTP, it would gain the same level of confidence as other Pact HTTP tests, which would be covered.</li><li>✅ Ensuring narrow type-safety (strict encodings) – With matchers and expressions, we can narrow the allowed sets of values during validation.</li><li>✅ Loss of visibility into real-world client usage – With Pact, we get fidelity to the field type of each consumer's needs.</li><li>❓ Optionals and defaults: a race to incomprehensible APIs – The "specification by example" approach Pact has improves the comprehensibility, but is currently not capable of fully resolving the dilemma.</li></ol><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://s3-ap-southeast-2.amazonaws.com/content-prod-529546285894/2023/06/image-1.png" class="kg-image"></figure><!--kg-card-end: image--><h2 id="summary">Summary</h2><p>gRPC and Protobuf are a powerful combination, allowing organisations to create large-scale, high-volume and high-performance communication systems. However, the technology opens up several possibilities for introducing breaking changes that could spell disaster for teams operating those platforms. With the introduction of the Pact Plugin Framework and the gRPC/Protobuf Plugin, Pact enables teams to apply contract testing to prevent such problems and safely evolve their system.</p><p>So, what are you waiting for? Get started with your 👉 <a href="https://github.com/pactflow/pact-protobuf-plugin">gRPC contract testing</a> journey, or watch the video below 👇 to see the example in this post in action.</p><!--kg-card-begin: embed--><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/aScmqj3v-6w?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen title="PactFlow gRPC contract testing demo"></iframe></figure><!--kg-card-end: embed-->]]></content:encoded></item><item><title><![CDATA[Resilient Builds With Can-I-Deploy]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p><a href="https://hub.docker.com/r/pactfoundation/pact-cli">The pact CLI tool</a>, which is used to interact with PactFlow via the CLI, has a command named <code>can-i-deploy</code>. This command is used as part of application deployment to check if there has been a successful verification. This successful verification happens between existing application versions and the application version you’</p>]]></description><link>https://pactflow.io/blog/resilient-builds-with-can-i-deploy-2/</link><guid isPermaLink="false">64630de788089d0001c51a5c</guid><category><![CDATA[can-i-deploy]]></category><dc:creator><![CDATA[Candy Goodison]]></dc:creator><pubDate>Tue, 16 May 2023 05:32:15 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p><a href="https://hub.docker.com/r/pactfoundation/pact-cli">The pact CLI tool</a>, which is used to interact with PactFlow via the CLI, has a command named <code>can-i-deploy</code>. This command is used as part of application deployment to check if there has been a successful verification. This successful verification happens between existing application versions and the application version you’re about to deploy. A successful <code>can-i-deploy</code> check indicates that the application being deployed is compatible with the applications it integrates with, making it safe to deploy.</p>
<p>The <code>can-i-deploy</code> command may also indicate that the verification results are unknown at the time the check is performed. This indicates the verification process is still executing. Since the verification result is not yet available, we cannot tell if it's safe to deploy and the build, meaning the deployment process could fail.</p>
<h4 id="whyaretheresultsunknown">Why Are The Results Unknown?</h4>
<p>When performing consumer driven contract testing, a typical flow would include a webhook that kicks off a new provider application build when a consumer application publishes an updated pact file. This provider application build will verify the pact, which generates the result <code>can-i-deploy</code> needs to check. If the provider build has not finished verifying the pact when the check is performed the result is <code>unknown</code>.</p>
<p>Bi-directional contract testing makes the <code>can-i-deploy</code> step less dependent on the provider application build, as PactFlow can compare the updated consumer pact file with an already published OAS file. However, complex OAS and pact files take time to compare, and the results can also be unknown the first time the <code>can-i-deploy</code> check is called due to the speed of the automated testing pipeline. In either case, the build can be blocked.</p>
<h4 id="whatcanidotomakemycicdpipelineresilient">What Can I Do To Make My CI/CD Pipeline Resilient?</h4>
<ol>
<li>Polling</li>
</ol>
<p>The <code>can-i-deploy</code> command can be configured to poll for results. This allows the command to wait a short time and retry so that it can get the complete results rather than failing. This command works for standard contract testing AND bi-directional contract testing. By using the <code>retry-while-unknown</code> and <code>retry-interval</code> flags you can configure the number of retries to attempt and the number of seconds before each retry to suit your needs.</p>
<p>Factors to consider when configuring these flags:</p>
<ul>
<li>
<p>How long does your provider build take to perform the verification step for consumer driven contract testing?</p>
</li>
<li>
<p>How large and complex is your OAS file for bi-birectional contract testing?</p>
</li>
<li>
<p>How long are you willing to have your pipelines run before failing?</p>
</li>
</ul>
<pre><code>
pact-broker can-i-deploy --pacticipant Foo \ 
                         --version 617c76e8bf05e1a480aed86a0946357c042c533c \ 
                         --to-environment production \
                         --retry-while-unknown 5 \
                         --retry-interval 3 
</code></pre>
<ol start="2">
<li>Branches and Environments</li>
</ol>
<p>Bi-directional contract testing is not dependent on running a separate provider build to complete pact verification. Instead, PactFlow generates comparisons with the OAS files from integrated applications to verify compatibility with each version of each integrated application.</p>
<p>PactFlow uses <a href="https://docs.pact.io/pact_broker/branches">branches of applications</a> and <a href="https://docs.PactFlow.io/docs/bi-directional-contract-testing/deploying#environments">deployed environments</a> to determine which verification results are most likely to be required in future <code>can-i-deploy</code> checks. These specific verification results are then pre-generated whenever a new pact is published, allowing the <code>can-i-deploy</code> command to quickly access the pre-generated results in most cases.</p>
<p>Utilizing both strategies will improve the resilience of your CI/CD pipeline and prevent unnecessary build failure so that you can always deploy with confidence. For a more detailed breakdown on how to use the <code>can-i-deploy</code> CLI tool in CI/CD check out the PactFlow docs on the subject <a href="https://docs.PactFlow.io/docs/bi-directional-contract-testing/deploying">here</a>.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Pact Specification 4.0 + Plugin Support]]></title><description><![CDATA[The Pact V4 specification introduced several major innovations, including support for extending Pact with Plugins, new interaction types and a number of matches. ]]></description><link>https://pactflow.io/blog/pact-v4-and-plugins/</link><guid isPermaLink="false">647467053828180001397d7b</guid><category><![CDATA[pact]]></category><category><![CDATA[plugins]]></category><category><![CDATA[feature]]></category><category><![CDATA[New Releases]]></category><dc:creator><![CDATA[Matt Fellows]]></dc:creator><pubDate>Mon, 27 Feb 2023 07:49:00 GMT</pubDate><content:encoded><![CDATA[<p>On Jan 20, 2022 version 4 of the Pact Specification was <a href="https://github.com/pact-foundation/pact-specification/issues/71#issuecomment-1008547350">ratified</a>. The Pact Specification is a document that governs the structure of the actual generated pact files to allow for interoperability between languages (consider, for example, a JavaScript consumer connecting to a Scala JVM-based provider), using versioning to indicate breaking changes between them. </p><p>Each language implementation of Pact needs to implement the rules of this specification, and advertise which version(s) are supported, corresponding closely to which features are available.</p><p>With the V4 spec, there were several major new features added:</p><ul><li>Support for <a href="https://github.com/pact-foundation/pact-specification/issues/86">synchronous messages</a>, enabling request/response use cases outside of HTTP, to accompany existing support for asynchronous messaging</li><li>Allows HTTP and non-HTTP (aka "Message Pact") interactions in a <a href="https://github.com/pact-foundation/pact-specification/issues/79">single pact file</a></li><li>Support for user defined <a href="https://github.com/pact-foundation/pact-specification/issues/83">plugins</a>, to extend the behaviour of Pact</li></ul><p>...among a number of other quality of life improvements and matchers.</p><h2 id="pactflow-ui-support">PactFlow UI Support</h2><p>It's imperative that PactFlow customers receive the highest level of support for their contract testing experience, and so today we're pleased to announce that V4 pacts - including rendering markdown associated with user-defined plugins - are now supported in several languages, and contracts generated from them can be properly displayed in the PactFlow UI. </p><p>Here is a <a href="https://github.com/pact-foundation/pact-plugins/tree/main/examples/gRPC/area_calculator">gRPC example</a> that shows a verified contract</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://s3-ap-southeast-2.amazonaws.com/content-prod-529546285894/2023/05/output-1.gif" class="kg-image"><figcaption>Example plugin-based (V4) pact showing a gRPC contract test</figcaption></figure><!--kg-card-end: image--><p>Notice how at the top of the contract, we can see a user-defined view of the contract:</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://s3-ap-southeast-2.amazonaws.com/content-prod-529546285894/2023/05/Screenshot-2023-05-29-at-11.15.50-pm.png" class="kg-image"></figure><!--kg-card-end: image--><p>Whilst we actually support a reasonably reach subset of Markdown, in this case, it's just a rendered protobuf using the familiar <code>```language</code> code gates syntax. </p><h2 id="available-now">Available Now</h2><p>Plugins interactions and any other pact files created using version 4 of the spec are now available on all plans.</p>]]></content:encoded></item><item><title><![CDATA[Unveiling of the SwaggerHub + PactFlow Integration]]></title><description><![CDATA[API designers and developers can harness the power the contract testing at scale to deploy with confidence, knowing updates to their API specification will not result in a breaking change.]]></description><link>https://pactflow.io/blog/swaggerhub-pactflow-integration/</link><guid isPermaLink="false">63c4f4c3e038e20001457946</guid><category><![CDATA[feature]]></category><category><![CDATA[features]]></category><category><![CDATA[integrations]]></category><category><![CDATA[New Releases]]></category><dc:creator><![CDATA[Alicia Foreman]]></dc:creator><pubDate>Tue, 17 Jan 2023 03:42:46 GMT</pubDate><media:content url="https://s3-ap-southeast-2.amazonaws.com/content-prod-529546285894/2023/01/swaggerhub-compatible.png" medium="image"/><content:encoded><![CDATA[<h3 id="we-are-excited-to-announce-that-pactflow-now-integrates-directly-with-swaggerhub-">We are excited to announce that PactFlow now integrates directly with SwaggerHub.</h3><img src="https://s3-ap-southeast-2.amazonaws.com/content-prod-529546285894/2023/01/swaggerhub-compatible.png" alt="Unveiling of the SwaggerHub + PactFlow Integration"><p>As a <a href="https://swagger.io/tools/swaggerhub/">SwaggerHub</a> API designer or developer, if you’re concerned that changes to your API will impact how the API is used by the consumer you need not worry any longer.</p><p>API designers and developers can harness the power the contract testing at scale to deploy with confidence, knowing updates to their API specification will not result in a breaking change.</p><p>The integration seeks to answer the question “will my API behave the way we agreed it should?” by providing an instant, PactFlow-powered ‘compatibility check’ directly in the SwaggerHub Editor. As a new API specification is created, or changes are made to an existing specification, the developer will get instant feedback on how the consumers of the API will respond– whether result in a break or not.</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://s3-ap-southeast-2.amazonaws.com/content-prod-529546285894/2023/01/swaggerhub-launch-promo-happy-path-1440x798.gif" class="kg-image" alt="Unveiling of the SwaggerHub + PactFlow Integration"></figure><!--kg-card-end: image--><p>Without this information, API designers must rely on other downstream teams and processes to catch breaking changes, and needlessly guard against backwards-incompatible changes in the API, leading to bloated APIs, excessive versioning and technical debt.</p><h2 id="how-it-works">How it works</h2><p>The integration is powered by PactFlow’s <a href="https://docs.pactflow.io/docs/bi-directional-contract-testing">bi-directional contract testing </a>feature. The API specification created in SwaggerHub is repurposed as a source of truth for the API provider allowing a compatibility check to be completed against the consumer contract tests written in PactFlow. Watch the <a href="https://smartbear.wistia.com/medias/w1syonr4xj">demo</a>.</p><h2 id="getting-started">Getting started</h2><p>Read <a href="https://docs.pactflow.io/docs/integrations/swaggerhub">the docs</a> to learn how to get started. </p><p>You'll need both aPactFlow and SwaggerHub account to try this integration out. Sign up here:</p><p>&gt;  <a href="https://pactflow.io/try-for-free/" rel="noreferrer noopener">Create a free PactFlow starter plan</a></p><p>&gt; <a href="https://smartbear.com/blog/api-contract-testing-for-a-design-first-world/" rel="noreferrer noopener">Create a SwaggerHub trial plan</a>  </p><h2 id="the-future-of-api-development-and-testing">The future of API development and testing </h2><p>The concept of ‘<a href="https://smartbear.com/blog/api-contract-testing-for-a-design-first-world/" rel="noreferrer noopener">design-first API contract testing</a>’ is something we wrote about late 2022 in anticipation of this release. This integration is innovative move for SmartBear’s leading API development platform which combines the best of a design-first API development workflow and API contract testing, a modern approach to testing APIs.</p><p></p>]]></content:encoded></item><item><title><![CDATA[Pactflow 2022 Year in Review]]></title><description><![CDATA[It's been quite the year! The Pactflow team have celebrated many major milestones and we know it’s only going to get better from here.
From joining the SmartBear family to hiring some great new talent, launching major features for both Pactflow and Pact Open Source - here's what we've been up to!]]></description><link>https://pactflow.io/blog/pactflow-2022-year-in-review/</link><guid isPermaLink="false">6392b9334a8df20001a5efa7</guid><category><![CDATA[Pactflow POST]]></category><category><![CDATA[Pact Open Source]]></category><dc:creator><![CDATA[Matt Fellows]]></dc:creator><pubDate>Thu, 15 Dec 2022 05:48:54 GMT</pubDate><media:content url="https://s3-ap-southeast-2.amazonaws.com/content-prod-529546285894/2022/12/PACTFLOW-2022-YEAR-IN-REVIEW-1-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://s3-ap-southeast-2.amazonaws.com/content-prod-529546285894/2022/12/PACTFLOW-2022-YEAR-IN-REVIEW-1-1.png" alt="Pactflow 2022 Year in Review"><p>It's been quite the year! The Pactflow team have celebrated many major milestones and we know it’s only going to get better from here.</p><p>From joining the SmartBear family to hiring some great new talent, launching major features for both Pactflow and Pact Open Source - here's what we've been up to!</p><p></p><!--kg-card-begin: html--><style>
  .process-vertical li:not(:last-child):after {
      background: none !important;
  }
</style>
<div class="row">
        <div class="col d-flex flex-column align-items-center">
          <ol class="process-vertical">
            <li class="pb-3">
              <div class="process-circle bg-primary"></div>
              <div>
                <span class="text-small text-muted">January 2022</span>
                <h5 class="mb-0">New team member</h5>
                  <p> Welcomed <a href="https://www.linkedin.com/in/johnathanpestano/">Johnathan Pestano</a> to the team</p> 
               
              </div>
            </li>
            <li class="pb-3">
              <div class="process-circle bg-primary"></div>
              <div>
                <span class="text-small text-muted">Feburary 2022</span>
                <h5 class="mb-0">Customer success story</h5>
                <p>Worked with consulting partner <a href="https://www.sngular.com">Sngular</a>, to present success of <a href="https://www.sngular.com/sngular-pactflow-reducing-the-cost-of-testing-in-app-modernization/">US bank's roll out of contract testing</a> </p> 
                <h5 class="mb-0">Pact Open</h5>
                <p><a href="https://www.linkedin.com/in/davidvc/">David Van Couvering</a> gamified the <a href="https://docs.pact.io/pact_nirvana">path to Pact Nirvana</a></p> 
              </div>
            </li>
            <li class="pb-3">
              <div class="process-circle bg-primary"></div>
              <div>
                <span class="text-small text-muted">March 2022</span>
                <h5 class="mb-0">Feature Launch</h5>
                <p>Our game changing <a href="https://docs.pactflow.io/docs/bi-directional-contract-testing/">bi-directional contract testing</a> feature was introduced to the world, alongside <a href="https://docs.pactflow.io/docs/bi-directional-contract-testing/tools/cypress/">several</a> quick start <a href="https://docs.pactflow.io/docs/bi-directional-contract-testing/tools/msw/">adapters</a></p>
                <h5>New team member</h5>
                <p>We welcomed <a href="https://www.linkedin.com/in/yousaf-nabi-54278b3/">Yousaf Nabi</a> - Developer Advocate &amp; Pact Community Shepherd to the team</p>
              </div>
            </li>
            <li class="pb-3">
              <div class="process-circle bg-primary"></div>
              <div>
                <span class="text-small text-muted">April 2022</span>
                <h5 class="mb-0">Relaunched the Pactflow POST</h5>
                <p>Our monthly newsletter covering all things Pact and Pactflow. Not a subscriber? Sign up 👉 <a href="https://pactflow.io/subscribe-to-the-post/">here</a></p>
              </div>
            </li>
            <li class="pb-3">
              <div class="process-circle bg-primary"></div>
              <div>
                <span class="text-small text-muted">May 2022</span>
                <h5 class="mb-0">Pact Open</h5>
                <p>Launched the <a href="https://github.com/pactflow/pact-protobuf-plugin">gRPC and Protobuf</a> plugin, with initial support for Java (beta)</p>
                <h5 class="mb-0">Pact Open</h5>
                <p>Yousaf launched the Pact OSS blog, read the <a href="https://docs.pact.io/blog/2022/05/04/pact-open-source-update-may-2022">May update</a></p>
                <h5 class="mb-0">Acquisition</h5>
                <p>Pactflow <a href="https://pactflow.io/blog/pactflow-joins-the-smartbear-family/">acquired</a> by SmartBear</p>
              </div>
            </li>
            <li class="pb-3">
              <div class="process-circle bg-primary"></div>
              <div>
                <span class="text-small text-muted">June 2022</span>
                <h5 class="mb-0">Boston Visit</h5>
                <p>Engineering team visited SmartBear HQ in Boston</p>
                <h5 class="mb-0">Feature Launch</h5>
                <p>Publishing CLI for BDCT</p>
                <h5 class="mb-0">Pact Open</h5>
                <p>Launched V4 and Plugin support for <a href="https://github.com/pact-foundation/pact-go/tree/2.x.x">Pact Go</a> (beta)</p>
                <h5 class="mb-0">Pact Open</h5>
                <p>Yousaf published <a href="https://docs.pact.io/blog/2022/06/08/pact-open-source-update-june-2022">June Update</a></p>
              </div>
            </li>
            <li class="pb-3">
              <div class="process-circle bg-primary"></div>
              <div>
                <span class="text-small text-muted">July 2022</span>
                <h5 class="mb-0">Feature launch</h5>
                <p><a href="https://pactflow.io/blog/can-i-deploy/">Can I Deploy</a> page</p>
                <h5 class="mb-0">Pact Open</h5>
                <p>Yousaf published <a href="https://docs.pact.io/blog/2022/07/26/pact-open-source-update-july-2022">July Update</a></p>
              </div>
            </li>
            <li class="pb-3">
              <div class="process-circle bg-primary"></div>
              <div>
                <span class="text-small text-muted">August 2022</span>
                <h5 class="mb-0">Podcast Interview</h5>
                <p>Yousaf featured on the <a href="https://www.pactman.co.uk/contract-testing-podcast/episode/a9eacfb6/meet-yousaf-nabi-pactflow-developer-advocate">Pactman Podcast</a></p>
                <h5 class="mb-0">Podcast Interview</h5>
                <p>Matt featured on the <a href="https://www.pactman.co.uk/contract-testing-podcast/episode/5b2bca75/meet-matt-fellows-co-founder-at-pactflow">Pactman Podcast</a></p>
                <h5 class="mb-0">Featured Content</h5>
                <p>Yousaf <a href="https://www.devprojournal.com/technology-trends/open-source/advantages-of-participating-in-open-source-projects/">blogged</a> on the Advantages of Participating in Open Source Projects for DevPro Journal</p>
                <h5 class="mb-0">Pact Open</h5>
                <p>Yousaf published <a href="https://docs.pact.io/blog/2022/08/24/pact-open-source-update-august-2022">August Update</a></p>
              </div>
            </li>
            <li class="pb-3">
              <div class="process-circle bg-primary"></div>
              <div>
                <span class="text-small text-muted">September 2022</span>
                <h5 class="mb-0">Feature Launch</h5>
                <p>Support V4 contracts in BDCT</p>
                <h5 class="mb-0">New Team Member</h5>
                <p>Welcomed <a href="https://www.linkedin.com/in/mogilevsky/?originalSubdomain=au">Ilia Mogilevski</a> - Engineering Manager - to the team</p>
                <h5 class="mb-0">Community Event</h5>
                <p>Matt Fellows speaks at <a href="https://www.youtube.com/watch?v=ICwB_H1nyW4">API Days</a> and <a href="https://skillsmatter.com/conferences/13732-yow-perth-2022">YOW! (Perth)</a> about 'Contract testing beyond REST' and how contract testing is still relevant in the age of gRPC, Kafka and GraphQL</p>                
              </div>
            </li>
            <li class="pb-3">
              <div class="process-circle bg-primary"></div>
              <div>
                <span class="text-small text-muted">October 2022</span>
                <h5 class="mb-0">Pact Open</h5>
                <p>Pact V4 + Plugin support added to Pact JS</p>
                <h5 class="mb-0">Pact Open</h5>
                <p>Yousaf publish <a href="https://docs.pact.io/blog/2022/10/25/pact-open-source-update-october-2022">October Update</a></p>
              </div>
            </li>
            <li class="pb-3">
              <div class="process-circle bg-primary"></div>
              <div>
                <span class="text-small text-muted">November 2022</span>
                <h5 class="mb-0">Pact Open</h5>
                <p>Major innovation launched: the <a href="https://docs.pact.io/blog/2022/11/11/pact-plugin-framework-launch">Pact Plugin Framework</a></p>
                <h5 class="mb-0">Community Event</h5>
                <p>Matt Fellows speaks at <a href="https://portal.gitnation.org/contents/beyond-rest-contract-testing-in-the-age-of-grpc-kafka-and-graphql">TestJS Summit</a> about 'Contract testing beyond REST'</p>
                <h5 class="mb-0">Pact Open</h5>
                <p>Yousaf published <a href="https://docs.pact.io/blog/2022/11/17/pact-facts-a-history-lesson">Pact interactive history lesson</a></p>
              </div>
            </li>
            <li class="pb-3">
              <div class="process-circle bg-primary"></div>
              <div>
                <span class="text-small text-muted">December 2022</span>
                <h5 class="mb-0">Feature Launch</h5>
                <p><a href="https://pactflow.io/blog/pactflow-now-supports-scim-api/">SCIM support</a> is released</p>
                <h5 class="mb-0">Another year of worry free deployments</h5>
                <p>Celebrating 15,000 users who've published contracts 1,100,000 times and successfully deployed more than 130,000 times</p>
              </div>
            </li>
          </ol>
        </div>
      </div><!--kg-card-end: html--><p></p><h2 id="thank-you">Thank you </h2><p>On behalf of the Pactflow team, thank you to our customers and community who have supported us through 2022. We look forward to testing with you in 2023! </p><!--kg-card-begin: embed--><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/66_HNBvK60k?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen title="2022 year in review"></iframe></figure><!--kg-card-end: embed-->]]></content:encoded></item><item><title><![CDATA[Pactflow now supports SCIM API]]></title><description><![CDATA[Today we announce that Pactflow now provides support for the System for Cross-domain Identity Management (SCIM) v2.0 standard. SCIM keeps your Pactflow identities in sync with identities from your IdP.]]></description><link>https://pactflow.io/blog/pactflow-now-supports-scim-api/</link><guid isPermaLink="false">639947f5d958360001d72060</guid><category><![CDATA[feature]]></category><category><![CDATA[enterprise]]></category><category><![CDATA[New Releases]]></category><category><![CDATA[scim]]></category><dc:creator><![CDATA[Matt Fellows]]></dc:creator><pubDate>Wed, 14 Dec 2022 05:30:38 GMT</pubDate><content:encoded><![CDATA[<p>Today we announce that Pactflow now provides support for the System for Cross-domain Identity Management (SCIM) v2.0 standard. SCIM keeps your Pactflow identities in sync with identities from your IdP. This includes any provisioning, updates, and de-provisioning of users, their roles and team memberships.</p><p><strong>The need for SCIM API </strong></p><p>Pactflow is loved by organisations of all sizes – from startups to major global enterprises. While Pactflow has previously supported SAML as an SSO option, SSO provisioning is only supported on demand. Additionally, with heightened awareness around security, another important use case we heard from customers is off boarding team, members. We know that all organisations, specifically large enterprises, need to tightly control who can access IT assets - including SaaS products - in order to comply with regulation and implement acceptable security controls.</p><p><strong>Secure and automated provisioning and de-provisioning of users </strong></p><p>We are pleased to announce support for our SCIM API to complement our SAML SSO option. SCIM is an industry standard API that IDPs implement as an extension to SAML, allowing large organisations to automate the onboarding, off boarding and management of employees to third party systems.</p><ol><li>Users can be pre-provisioned into their appropriate team and with their appropriate roles</li><li>Users will be automatically de-provisioned in the event they leave their organisation or have the entitlements revoked (e.g. department change)</li><li>Any updates to the users will be reflected with the user on-demand, not during next login.</li></ol><p>That is - the Pactflow user store will be kept in sync with their IDP of choice, such as Okta or Azure AD.</p><p><strong>How to get started </strong></p><p>SCIM is now available for all customers on our <a href="https://pactflow.io/pricing/">Enterprise Plans</a> (both SaaS and on-premise). For existing Enterprise Plan customers on our SAML setup follow the <a href="https://docs.pactflow.io/docs/scim/main" rel="noreferrer noopener">SCIM guide</a> (or our <a href="https://docs.pactflow.io/docs/on-premises/scim/">on-premises <a href="http://guide/" rel="noreferrer noopener">guide</a></a>) to connect your IDP to our SCIM endpoint.</p><p>If you’re new to Pactflow or on a Starter or Team Plan, get in touch with our <a href="https://pactflow.io/demo?utm_medium=web&amp;utm_source=pactflow&amp;utm_campaign=scim-api&amp;utm_content=blog">sales team</a> to learn more.</p>]]></content:encoded></item><item><title><![CDATA[What is contract testing and why should I try it?]]></title><description><![CDATA[Learn how contract testing fits in your test automation strategy, and how you can reduce reliance on integrated and end-to-end testing to increase speed to market]]></description><link>https://pactflow.io/blog/what-is-contract-testing/</link><guid isPermaLink="false">5dc7a407876c8200014c1100</guid><category><![CDATA[contract-testing]]></category><category><![CDATA[business]]></category><dc:creator><![CDATA[Matt Fellows]]></dc:creator><pubDate>Thu, 17 Nov 2022 12:57:00 GMT</pubDate><media:content url="https://s3-ap-southeast-2.amazonaws.com/content-prod-529546285894/2019/07/screenshot-25-1-.png" medium="image"/><content:encoded><![CDATA[<img src="https://s3-ap-southeast-2.amazonaws.com/content-prod-529546285894/2019/07/screenshot-25-1-.png" alt="What is contract testing and why should I try it?"><p>Each week, we’re asked hundreds of questions on our <a href="http://slack.pact.io/"><strong>Slack channel</strong></a>, from <em>“my test is failing, please help”</em> to <em>“I need help convincing my team.”</em> Exhibit A:</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://s3-ap-southeast-2.amazonaws.com/content-prod-529546285894/2019/07/screenshot-8.png" class="kg-image" alt="What is contract testing and why should I try it?"><figcaption>Convince me!</figcaption></figure><!--kg-card-end: image--><p>We’ve already created a list of reasons to <a href="https://docs.pact.io/faq/convinceme"><strong>convince you</strong></a> that contract testing is a good idea, but today I’d like to take the opportunity to answer a question that comes up often – what <em>is </em>contract testing, and why should you consider adding it to your microservices testing approach?</p><p>In this post, we’ll cover:</p><ol><li>Integration testing and the challenges with end-to-end integrated tests</li><li>Contract testing - what it is and why it helps</li><li>Pact - how Pact works</li><li>Demo of contract testing with Pact</li></ol><p>You also can watch this as a recorded <a href="https://www.youtube.com/playlist?list=PLwy9Bnco-IpfZ72VQ7hce8GicVZs7nm0i"><strong>video series</strong></a>.</p><h2 id="integration-testing">Integration testing</h2><p>Before we talk about contract testing, we should talk about why contract testing exists. It exists to help with integration testing – the process by which we build confidence that a system works as a whole.</p><p>In a distributed system, integration testing is a process that helps us validate that the various moving parts that communicate remotely – things like microservices, web applications, and mobile applications – all work together cohesively.</p><p>There are many types of integration testing, but the most common approach is called “end-to-end integrated testing,” which involves all the components being deployed together in a real environment – one that closely resembles production – and running a battery of test scenarios against it.</p><p>While the concept of contract testing predates Pact, Pact exists because <a href="https://pactflow.io/blog/proving-e2e-tests-are-a-scam/"><strong>end-to-end integrated tests are a scam</strong></a>.</p><h2 id="the-problem-with-end-to-end-integrated-tests"><strong>The problem with end-to-end integrated tests</strong></h2><!--kg-card-begin: html--><iframe style="margin: 30px auto; display:block;" width="560" height="315" src="https://www.youtube.com/embed/U05q0zJsKsU?si=MV0kbNhQPK5PmA0H" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe><!--kg-card-end: html--><p>While tests at the top of the pyramid more closely represent what the customer would experience, they have several painful drawbacks. They:</p><ul><li>are <em>slow. </em>Because they traverse multiple systems and generally must be run serially, each test may take several seconds to several minutes, especially if prerequisite setup (such as data preparation) must be performed.</li><li>are hard to<em> maintain</em>. End-to-end tests require all systems to be in the correct state before they are run, including the correct version and data.</li><li>can be <em>unreliable or flakey</em>. Because of the complexity in orchestrating a test environment, they can often fail, causing false-positives and becoming a distraction to the team. In many cases, they fail due to a configuration issue unrelated to any code change.</li><li>are hard to <em>fix</em>. When an end-to-end test fails, debugging the issue is usually difficult because of the distributed and remote nature of the problem.</li><li><em>scale</em> badly. As more teams’ code gets tested, things get more entangled, test suites run exponentially slower, and releases get clogged in automation pipelines.</li><li> <em>find bugs too late in the process. </em>Because of the complexity of running such testing suites, in many situations these tests are only run on CI after code has been committed – in many cases, by a separate testing team days afterward. This delay in feedback is extremely costly to modern, agile delivery teams.</li></ul><p>Because of these properties, it is advised to keep end-to-end integrated tests to a minimum number to ensure key business transactions or features are covered.</p><p>See <a href="https://pactflow.io/blog/proving-e2e-tests-are-a-scam/"><strong>proving end-to-end tests are a scam</strong></a> to dive deeper into this.</p><h2 id="what-is-contract-testing">What is contract testing?</h2><!--kg-card-begin: html--><iframe style="margin: 30px auto; display: block;" width="560" height="315" src="https://www.youtube.com/embed/U05q0zJsKsU?si=7hQDlIP0yRP6rwPR" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe><!--kg-card-end: html--><p>Contract testing is a methodology for ensuring that two separate systems (such as two microservices) are compatible and can communicate with one other. It captures the interactions that are exchanged between each service, storing them in a <em>contract</em>, which then can be used to verify that both parties adhere to it. Contract testing goes beyond <a href="https://pactflow.io/blog/contract-testing-using-json-schemas-and-open-api-part-1/"><strong>schema testing</strong></a>, requiring both parties to come to a consensus on the allowed set of interactions and allowing for <em>evolution</em> over time.</p><p>What sets this form of testing apart from other approaches that aim to achieve the same thing is that each system can be tested <em>independently</em> from the other and that the contract is generated by the code itself, meaning the contract is always kept up to date.</p><p>The following diagram shows the key steps in contract testing:</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://s3-ap-southeast-2.amazonaws.com/content-prod-529546285894/2021/03/Screen-Shot-2021-03-29-at-1.04.29-pm.png" class="kg-image" alt="What is contract testing and why should I try it?"><figcaption>how contract testing works</figcaption></figure><!--kg-card-end: image--><p>There are many other important properties that flow on from this, which we’ll discuss further.</p><h4 id="how-does-pact-implement-contract-testing">How does Pact implement contract testing?</h4><p>Pact is a code-first contract testing tool, which requires access to the code on both sides of an integration point. To write Pact tests, you need to be able to write a unit test of the consumer and be able to manipulate state (usually within the context of a unit test) on the provider side.</p><h4 id="how-does-pactflow-implement-contract-testing">How does Pactflow implement contract testing?</h4><p>While Pactflow supports Pact as its primary contract testing tool, it also enables a broader range of tools to be used in the contract testing process (such as Postman, Dredd, or other service virtualization and mocking tools), providing a way to “upgrade” them into a general contract testing capability. See our blog on <a href="https://pactflow.io/blog/bi-directional-contracts/"><strong>bi-directional contract testing</strong></a> for more.</p><h4 id="what-is-consumer-driven-contract-testing">What is consumer-driven contract testing?</h4><p>The “consumer-driven” prefix simply states an additional philosophical position that advocates for better internal microservices design by putting the consumers of such APIs at the heart of the design process. Provider-driven APIs tend to be biased toward the data that is being exposed and the system that is exposing it.</p><p>Pact and Spring Cloud Contracts are examples of frameworks that default to this kind of implementation, but this isn’t a requirement to get the key benefits of contract testing and both can be used to achieve the aims of contract testing.</p><h2 id="what-are-the-benefits-of-contract-testing">What are the benefits of contract testing?</h2><!--kg-card-begin: html--><iframe style="margin:30px auto; display:block;" width="560" height="315" src="https://www.youtube.com/embed/3T8J8Pwu3I4?si=EMyCSihF47ZdnpNu" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe><!--kg-card-end: html--><p>It’s helpful first to consider where contract testing sits within the context of a broader automation testing approach. When creating a test automation strategy, a good rule of thumb in how you should expend your effort is the approach advocated in Mike Cohn’s Test Pyramid:</p><blockquote>Stick to the pyramid shape to come up with a healthy, fast and maintainable test suite: Write <em>lots</em> of small and fast <em>unit tests</em>. Write <em>some</em> more coarse-grained tests and <em>very few</em> high-level tests that test your application from end to end [3]</blockquote><!--kg-card-begin: image--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://s3-ap-southeast-2.amazonaws.com/content-prod-529546285894/2019/07/image.png" class="kg-image" alt="What is contract testing and why should I try it?"><figcaption>From the <a href="https://martinfowler.com/articles/practical-test-pyramid.html#TheTestPyramid ">Practical Test Pyramid</a></figcaption></figure><!--kg-card-end: image--><p>Contract tests fit in the Service Tests layer, as they execute quickly and don’t need to integrate to external systems to run. Their job is to give you confidence that the systems you integrate with are compatible with your code before you release.</p><p><em>NOTE: The UI Tests at the top of the pyramid here are often also referred to interchangeably with “integrated end-to-end (e2e) tests.”</em></p><p><strong>The value of contract tests</strong></p><p>Contract tests generally have the opposite properties to integrated e2e tests.</p><ul><li>They run<em> fast</em>, because they don't need to talk to multiple systems.</li><li>They are <em>easier</em> to maintain. You don’t need to understand the entire ecosystem to write your tests.</li><li>They are <em>easy to debug and fix</em>, because the problem is only ever in the component your testing – so you generally get a line number or a specific API endpoint that is failing.</li><li>They are <em>repeatable.</em></li><li>They <em>scale; </em>because each component can be independently tested, build pipelines don’t increase linearly/exponentially in time.</li><li>They <em>uncover bugs locally</em> on developer machines. Contract tests can and should run on developer machines before pushing code.</li></ul><p>From a business point of view, it is well known that the later in a project life cycle that a bug is found, the costlier it is to fix.</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://s3-ap-southeast-2.amazonaws.com/content-prod-529546285894/2019/07/screenshot-16.png" class="kg-image" alt="What is contract testing and why should I try it?"><figcaption><a href="https://www.slideshare.net/bethesque/microservices-test-smarter-not-harder-voxxed-days-2019?qid=e1be4882-f144-4897-9eca-9c89359574a4&amp;v=&amp;b=&amp;from_search=1">From</a> Beth's excellent <a href="https://www.youtube.com/watch?v=79GKBYSqMIo&amp;feature=youtu.be">talk</a> on the topic</figcaption></figure><!--kg-card-end: image--><p>By running most of your automation tests as fast unit or local integration tests, you can keep build speeds to a minimum and prevent queues building up in teams.</p><p><strong>Other benefits</strong></p><p>It turns out that contract tests also have other secondary yet positive side effects.</p><ul><li>The ability to develop the consumer (e.g., a React Web App) before the API.</li><li>The ability to drive out the requirements for your provider first, meaning you implement exactly and only what you need in the provider.</li><li>You get a set of well-documented use cases (“Given ... a request for ... will return ...”) that show exactly how a provider is being used.</li><li>The ability to see exactly which fields each consumer is interested in, allowing unused fields to be removed and new fields to be added in the provider API without impacting a consumer.</li><li>The ability to immediately see which consumers will be broken if a change is made to the provider API.</li></ul><p>I hope this brief introduction to the topic showed you how you can use contract testing to replace many (or in some cases, all) of your end-to-end integrated tests to speed up your CI pipeline and increase your teams’ velocity.</p><p>Contract testing is not a silver bullet, and no two teams are the same, so think about your test strategy, how it applies to you, and what you need to get from it.</p><h2 id="example-contract-test-with-pact-and-pactflow">Example contract test with Pact and Pactflow</h2><!--kg-card-begin: html--><iframe style="display:block; margin: 30px auto;" width="560" height="315" src="https://www.youtube.com/embed/6Qd-kq1AzZI?si=W_RTsFrhmy9rr8Zs" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe><!--kg-card-end: html--><!--kg-card-begin: html-->      <div class="container">
        <div class="row mb-5">
          <div class="col">
            <div class="card card-body border-0 o-hidden mb-0 bg-primary-2 text-light">
              <div class="position-relative d-flex flex-column flex-md-row justify-content-between align-items-center">
                <h2 class="h3 text-center mb-md-0">Next Steps</h2></div>
                <div class="d-flex flex-column flex-md-row">
                  <a class="btn btn-lg btn-white mx-1 my-1" href="https://docs.pactflow.io/docs/tutorials#getting-started-with-pactflow?utm_source=blog&utm_content=what-is-contract-testing">Try out an in-browser tutorial</a>
                  <a class="btn btn-lg btn-black mx-1 my-1" href="https://pactflow.io/try-for-free?utm_source=blog&utm_content=what-is-contract-testing">Try Pactflow for free</a>
                </div>
              </div>
            </div>
          </div>
        </div>
      
<!--kg-card-end: html-->]]></content:encoded></item><item><title><![CDATA[Contract Testing Vs Integration Testing]]></title><description><![CDATA[Contract testing is a technique to calm the chaos caused by sprawling, complex microservices & APIs. Here's how to use it alongside integration testing.]]></description><link>https://pactflow.io/blog/contract-testing-vs-integration-testing/</link><guid isPermaLink="false">631ad331750a68000104ba80</guid><category><![CDATA[contract-testing]]></category><category><![CDATA[consumer-driven-contract-testing]]></category><category><![CDATA[integration testing]]></category><category><![CDATA[e2e tests]]></category><dc:creator><![CDATA[Alicia Foreman]]></dc:creator><pubDate>Thu, 15 Sep 2022 08:18:36 GMT</pubDate><media:content url="https://s3-ap-southeast-2.amazonaws.com/content-prod-529546285894/2022/10/What-is-Contract-Testing-1200x628.png" medium="image"/><content:encoded><![CDATA[<img src="https://s3-ap-southeast-2.amazonaws.com/content-prod-529546285894/2022/10/What-is-Contract-Testing-1200x628.png" alt="Contract Testing Vs Integration Testing"><p>One of the most critical factors affecting the quality of your software and the experience it provides your end customers is testing. Throughout the software development lifecycle (SDLC), development teams employ numerous techniques to ensure quality outcomes.</p><p><a href="https://smartbear.com/">SmartBear</a> offers testing solutions for every phase of the SDLC and in this blog I will focus in on contract testing - which can be orchestrated with PactFlow and Pact the open source Pact framework - and how this compares to integration testing as well as unit and end-to-end (E2E) testing. </p><p>Contract testing is a technique coined well over a decade ago by <a href="https://martinfowler.com/">Martin Fowler</a> that has grown in popularity with the rise of APIs and microservices architectures and associated complexities, emerging as a simple and effective control measure to calm the chaos caused by the sprawl, reduce the reliance on more E2E integrated testing and prevent bugs in production.</p><h2 id="what-is-contract-testing-and-where-does-it-fit-into-my-test-strategy">What is contract testing and where does it fit into my test strategy?</h2><p>Contract testing is a technique coined well over a decade ago that has grown in popularity with the rise of APIs and microservices architectures and associated complexities, emerging as a simple and effective control measure to calm the chaos caused by the sprawl, reduce the reliance on more E2E integrated testing and prevent bugs in production.</p><p>The goal of contract testing is aligned with the “shift left” mindset. You want fast and reliable feedback on an independent API integration earlier in the SLDC. This makes it easier to test and debug, which reduces reliance on more complex testing later in the cycle.</p><p>Contract testing allows teams to move faster. It removes low-value bugs earlier in the SDLC so they don’t cause holdups later. The way it works is to borrow elements of both unit and integration testing. This provides valuable validation of an API integration.</p><p>Note the test pyramid. It’s a heuristic, first proposed by <a href="https://www.mountaingoatsoftware.com/blog/the-forgotten-layer-of-the-test-automation-pyramid">Mike Cohn</a>, which helps software development and testing teams guide their allocation of time and effort on various types of testing.</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://s3-ap-southeast-2.amazonaws.com/content-prod-529546285894/2022/09/Unbalanced-Test-Pyramid---Without-Contract-Testing.png" class="kg-image" alt="Contract Testing Vs Integration Testing"><figcaption><em>Figure 1: An unbalanced test pyramid, without contract testing&nbsp;</em></figcaption></figure><!--kg-card-end: image--><p>As you move up the pyramid, the different tests give more confidence, but at the price of slower feedback and higher effort (costs and time). </p><p>The test pyramid is a guide to spending more time using testing techniques at the base and less at the top. In figure 2, we see it rebalanced. Here, there is more reliance on the base and mid-level test techniques. You will note that this doesn't remove the need for E2E tests, but reduces the reliance on them, making execution faster.</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://s3-ap-southeast-2.amazonaws.com/content-prod-529546285894/2022/09/Rebalanced-Pyramid---With-Contract-Testing-compact.png" class="kg-image" alt="Contract Testing Vs Integration Testing"><figcaption><em>Figure 2: Rebalanced pyramid, including contract testing&nbsp;</em></figcaption></figure><!--kg-card-end: image--><h2 id="explanation-of-api-testing-techniques">Explanation of API testing techniques </h2><p>The following chart aims to provide more context as an aid to explain the the balance of figure 2. It covers the main API testing techniques, the scope, who completes them, the benefits/limitations, and the tools SmartBear offers to help you and your team deliver. </p><!--kg-card-begin: html--><style>
    article table td:not(:last-child) {
        white-space: unset;
    }
</style>

<table class="table table-bordered">
    <tbody>
        <tr>
            <th colspan="3">
                <h4 class="m-0 text-center">Unit Test</h4>
            </th>
        </tr>
        <tr>
            <th scope="row">
                <p>What is it?</p>
            </th>
            <td colspan="2">
                <p>A unit test is at the lowest level. It provides a foundational quality gate.</p>
                <p>It's a way of testing a piece of code that can be logically isolated in a system that works as
                    expected.</p>
                <p>What constitutes a unit is ill-defined. It often refers to the testing of a single function, but can
                    be broader than that.</p>
            </td>
        </tr>
        <tr>
            <th scope="row">
                <p>What&rsquo;s the goal of this type of test?</p>
            
            </th><td colspan="2">
                <p>The goal of unit testing is to deliver relevant information about the smallest components of your
                    software quickly and frequently, sometimes many times per day. </p>
                <p>It's a key practice in TDD (test-driven development). It&rsquo;s crucial in the ability to refactor
                    (change) code safely, and therefore supports the long-term maintenance of a system.</p>
                <p>Unit tests also provide important visibility to new contributors to a code base, because they double
                    as a form of living documentation.</p>
            </td>
        </tr>
        <tr>
            <th scope="row">
                <p>How does it work?</p>
            
            </th><td colspan="2">
                <p>With unit testing, you can isolate and test small components of code at a time.</p>
                <p>By limiting the scope of the exercised software to a portion of the system under test, you improve
                    the quality at a foundational level.</p>
                <p>Unit testing an API endpoint is normally done by mocking other components or systems, in order to
                    isolate the part of the API you are focused on testing.</p>
            </td>
        </tr>
        <tr>
            <th scope="row">
                <p>What is the scope of the test?</p>
            
            </th><td colspan="2">
                <p>A unit test focuses on a small amount of code, such as a single function.</p>
            </td>
        </tr>
        <tr>
            <th scope="row">
                <p>At what stage of the SDLC does this test occur?</p>
            
            </th><td colspan="2">
                <p>Pre-commit, during build</p>
            </td>
        </tr>
        <tr>
            <th scope="row">
                <p>Who is responsible for this type of test?</p>
            
            </th><td colspan="2">
                <p>Developers</p>
            </td>
        </tr>
        <tr>
            <th scope="row">
                <p>What are the benefits of this test?</p>
            
            </th><td colspan="2">
                <p>Unit tests are extremely fast.</p>
                <p>They detect issues earlier to avoid the costs of fixing later in the SDLC.</p>
                <p>They&rsquo;re an efficient means of testing, as it can be done at any time. There&rsquo;s no reliance
                    on others.</p>
                <p>Unit tests focus on individual functionality</p>
                <p>They understand the impact of development changes with ease</p>
                <p>They assist with code refactoring and reduce long-term maintenance costs.</p>
            </td>
        </tr>
        <tr>
            <th scope="row">
                <p>What are the limitations/challenges of this test?</p>
            
            </th><td colspan="2">
                <p>Unit testing does not do any of the following:</p>
                <p>Consider integration issues between services.</p>
                <p>Catch complex errors that arise from multiple services.</p>
                <p>Consider non-functional aspects, including usability and performance.</p>
                <p>Provide guarantees for functional operation or compliance with requirements.</p>
                <p>Additionally, unit testing of private/internal functions instead of externally visible functions can
                    lead to a higher maintenance cost. Some schools of thought encourage more &ldquo;integration
                    test&rdquo; (sociable) unit tests, which test externally visible behaviour, rather than internal
                    implementation details.</p>
                <p>Unit testing is known as a white box testing technique where are you are aware of the underlying
                    structure and code.</p>
            </td>
        </tr>
        <tr>
            <th scope="row">
                <p>What tools can be used for this test?</p>
            
            </th><td colspan="2">
                <p>There are different unit testing frameworks, depending on the type of code you're working with.</p>
            </td>
        </tr>
        <tr>
            <th colspan="3">
                <h4 class="m-0 text-center">Contract Test</h4>
            </th>
        </tr>
        <tr>
            <th scope="row">
                <p>What is it?</p>
            
            </th><td colspan="2">
                <p>A contract test is a technique for testing software application interfaces and integrations.</p>
                <p><strong>Contract testing&nbsp;is a non-functional technique that bridges the gap between unit and
                        integration tests. It takes the benefits of each and ensures two systems communicate. </strong>
                </p>
                <p>It's non-functional, because it doesn&rsquo;t consider side effects.</p>
            </td>
        </tr>
        <tr>
            <th scope="row">
                <p>What&rsquo;s the goal of this type of test?</p>
            
            </th><td colspan="2">
                <p>The goal of contract testing is to get fast feedback on systems that communicate over APIs, removing
                    unnecessary bugs.</p>
                <p>Contract testing helps remove the dependency on end-to-end integration tests and reduces the need to
                    maintain complex test environments<em>.</em></p>
            </td>
        </tr>
        <tr>
            <th scope="row">
                <p>How does it work?</p>
            
            </th><td colspan="2">
                <p>Contract testing ensures that a pair of applications will work together correctly. It checks each
                    application in isolation to ensure the messages it sends or receives conforms to a shared
                    understanding. This is documented in a &ldquo;contract.&rdquo;</p>
                <p><a href="https://pactflow.io/how-pact-works/#slide-1">See how it works.</a></p>
            </td>
        </tr>
        <tr>
            <th scope="row">
                <p>What is the scope of the test?</p>
            
            </th><td colspan="2">
                <p>Similar to a unit test, a contract test focuses on the external collaborator. This is the API client
                    interface on a consumer side, and the appropriate receiver on the provider side, such as a
                    Controller.</p>
            </td>
        </tr>
        <tr>
            <th scope="row">
                <p>At what stage of the SDLC does this test occur?</p>
            
            </th><td colspan="2">
                <p>Pre-commit, during build</p>
                <p>Can also occur post-commit.</p>
            </td>
        </tr>
        <tr>
            <th scope="row">
                <p>Who is responsible for this type of test?</p>
            
            </th><td colspan="2">
                <p>During the build: Developers/SDETs</p>
                <p>Post-commit: QA/Testers/SDETS</p>
                <p>Bi-Directional Contract Testing gives team members without access to the source code a way to
                    orchestrate contract testing, repurposing existing mocks from other commonly used tools.</p>
            </td>
        </tr>
        <tr>
            <th scope="row">
                <p>What are the benefits of this test?</p>
            
            </th><td colspan="2">
                <p>Contract tests are fast.</p>
                <p><strong>They focus</strong> on testing a single integration at a time without the need to deploy</p>
                <p>With contract tests, there&rsquo;s no need for <strong>dedicated test environments</strong></p>
                <p>They provide <strong>fast</strong>, reliable feedback, that is easier to debug..</p>
                <p>Tests scale<strong> linearly</strong> with the number of integrations, instead of exponentially.</p>
                <p>They allow you to deploy services independently. </p>
                <p>There&rsquo;s reduced communication and coordination.</p>
                <p>The provider knows <em>who</em> the consumers are and <em>how</em> the consumers use.</p>
                <p><a href="https://pactflow.io/blog/proving-e2e-tests-are-a-scam/">Read: "Proving E2E Tests are a Scam"</a></p>
            </td>
        </tr>
        <tr>
            <th scope="row">
                <p>What are the limitations/challenges of this test?</p>
            
            </th><td colspan="2">
                <p>A contract test is completed in isolation, between only one API consumer and one provider. It doesn't
                    check for side effects, or the behavior of the overall system.</p>
                <p>For example, imagine an endpoint for a collection of /orders that accepts a POST request to create a
                    new order. A contract test ensures the consumer and provider have a shared and accurate
                    understanding of the request and response required to create an order. A functional test for the
                    provider would ensure that when a given request was made, an Order with the correct attributes
                    persisted in the datastore.   Contract testing is known as a white box testing technique
                    where are you are aware of the underlying structure and code.</p>
            </td>
        </tr>
        <tr>
            <th scope="row">
                <p>What tools can be used for this test?</p>
            
            </th><td colspan="2">
                <p>PactFlow is the complete contract testing solution. It allows teams to orchestrate contract testing
                    at scale.</p>
                <p>With PactFlow, teams get fast and reliable feedback on the reliability of a single integration
                    between an API provider and consumer earlier in the software development lifecycle. This reduces the
                    reliance on complex E2E tests.  </p>
                <p><a href="https://pactflow.io/try-for-free/">Create a free PactFlow account to get started</a></p>
            </td>
        </tr>
        <tr>
            <td colspan="3">
                <h4 class="m-0 text-center">Integration Test</h4>
            </td>
        </tr>
        <tr>
            <th scope="row">
                <p>What is it?</p>
            
            </th><td colspan="2">
                <p>Integration tests look for information on how two or more systems work together.</p>
                <p>They&rsquo;re a form of functional testing that ensures all features continue to work as expected
                    after a change has been introduced.</p>
                <p>Integration testing is the most often used form of API testing, as APIs are at the centre of most
                    integrations between internal or third-party services.</p>
                <p>Integration testing catches a class of issues that unit tests can&rsquo;t pick up &ndash; bugs that
                    lurk between components.</p>
            </td>
        </tr>
        <tr>
            <th scope="row">
                <p>What&rsquo;s the goal of this type of test?</p>
            
            </th><td colspan="2">
                <p>The goal of integration testing is to consider the bigger picture and prevent regressions at a higher
                    level; how the features work together to make a product, and how that product will work with other
                    software.</p>
                <p>Unlike unit tests, which cover how an individual component works in isolation, integration tests must
                    consider multiple components working together.</p>
            </td>
        </tr>
        <tr>
            <th scope="row">
                <p>How does it work?</p>
            
            </th><td colspan="2">
                <p>An integration test usually consists of many requests or steps that simulate real user behavior. At
                    each step, <a href="https://support.smartbear.com/readyapi/docs/testing/assertions/index.html">assertions</a>
                    check that the service works as expected and returns the required response.</p>
                <p>Note that &ldquo;integration testing&rdquo; is a vague term, encompassing anything from sociable unit
                    tests that span multiple components or functions in a single code base, to real-life systems
                    interacting in a deployed environment.</p>
            </td>
        </tr>
        <tr>
            <th scope="row">
                <p>What is the scope of the test?</p>
            
            </th><td colspan="2">
                <p>Integration tests look at how two components work together independently of the system as a whole, to
                    accomplish a specific task or deliver a specific outcome.</p>
                <p>An integration test can span multiple functions, classes, components, or even systems.</p>
            </td>
        </tr>
        <tr>
            <th scope="row">
                <p>At what stage of the SDLC does this test occur?</p>
            
            </th><td colspan="2">
                <p>Pre-commit, during build, after build in deployment environment</p>
            </td>
        </tr>
        <tr>
            <th scope="row">
                <p>Who is responsible for this type of test?</p>
            
            </th><td colspan="2">
                <p>Devs and QA/Testers</p>
            </td>
        </tr>
        <tr>
            <th scope="row">
                <p>What are the benefits of this test?</p>
            
            </th><td colspan="2">
                <p>Integration tests ensure two or more modules work together and can deliver the desired outcome
                    aligned to requirements</p>
                <p>They lay the foundations for the next stage of testing.</p>
            </td>
        </tr>
        <tr>
            <th scope="row">
                <p>What are the limitations/challenges of this test?</p>
            
            </th><td colspan="2">
                <p>Integration tests can be difficult to perform compared to unit and contract testing approaches, which
                    are more black box style.</p>
                <p>It's time-consuming and resource intensive to test all connected modules of a system.</p>
                <p>Additional effort is required to create stubs and drivers, and this needs to be done accurately to
                    avoid ineffective testing.</p>
            </td>
        </tr>
        <tr>
            <th scope="row">
                <p>What tools can be used for this test?</p>
            
            </th><td colspan="2">
                <p>ReadyAPI allows teams to create, manage, and execute automated functional, security, and performance
                    tests in one centralized interface. This accelerates API quality for Agile and DevOps software
                    teams. Get started by importing API definitions like OpenAPI/Swagger or AsyncAPI, testing and
                    recording live API traffic, or virtualizing web services to remove pipeline dependencies.</p>
                <p><a href="https://smartbear.com/product/ready-api/overview/">Learn more about ReadyAPI</a></p>
            </td>
        </tr>
        <tr>
            <td colspan="3">
                <h4 class="m-0 text-center">End-to-end test</h4>
            </td>
        </tr>
        <tr>
            <th rowspan="2" scope="row">
                <p>What is it?</p>
            
            </th><td colspan="2">
                <p>End-to-end tests are a functional testing methodology. They test the entire functionality and
                    performance of an application under production-like circumstances and data to replicate live
                    settings.</p>
                <p>End-to-end tests are valuable, but are the most complicated tests to set up and maintain.</p>
                <p>There are two main types of E2E tests:</p>
            </td>
        </tr>
        <tr>
            <th scope="row">
                <p><strong><em>E2E API (backend)</em></strong></p>
            
            </th><td>
                <p><strong><em>E2E UI (frontend) / </em></strong><strong><em>UI)</em></strong></p>
            </td>
        </tr>
        <tr>
            <td>
            </td>
            <td>
                <p>E2E API tests &ndash; also called E2E tests &ndash; consider the integrity of the entire system.</p>
            </td>
            <td>
                <p>E2E UI testing extends end-to-end testing, with the addition of testing behavior through a user
                    interface such as a mobile application or web interface.</p>
                <p><strong><em>&nbsp;</em></strong></p>
            </td>
        </tr>
        <tr>
            <th scope="row">
                <p>What&rsquo;s the goal of this type of test?</p>
            
            </th><td>
                <p>The goal of end-to-end testing is to ensure the entire software application is production-ready and
                    avoid risks post-release.</p>
            </td>
            <td>
                <p>UI testing ensures the end user&rsquo;s experience is delivered as expected</p>
            </td>
        </tr>
        <tr>
            <th scope="row">
                <p>How does it work?</p>
            
            </th><td>
                <p>An API E2E testing process simulates a real user scenario.</p>
                <p>This not only validates the system under test, but ensures its sub-systems work and behave as
                    expected.</p>
                <p><strong>&nbsp;</strong></p>
                <p>End-to-end tests extend integration testing to test multiple applications at once, usually deployed
                    to a test environment.</p>
            </td>
            <td>
                <p>As with the API E2E test, a E2E UI test specifically considers the frontend user experience.</p>
            </td>
        </tr>
        <tr>
            <th scope="row">
                <p>What is the scope of the test?</p>
            
            </th><td>
                <p>The entire system (excluding the UI).</p>
            </td>
            <td>
                <p>A UI test considers all components that make up the end user&rsquo;s experience.</p>
            </td>
        </tr>
        <tr>
            <th scope="row">
                <p>At what stage of the SDLC does this test occur?</p>
            
            </th><td colspan="2">
                <p>Post-commit, after deployment into a test environment</p>
            </td>
        </tr>
        <tr>
            <th scope="row">
                <p>Who is responsible for this type of test?</p>
            
            </th><td colspan="2">
                <p>Testers/QA/ Automation Engineers</p>
                <p>All forms of E2E testing are normally conducted by testers to ensure software is production ready.
                    This avoids risks post-release.</p>
            </td>
        </tr>
        <tr>
            <th scope="row">
                <p>What are the benefits of this test?</p>
            
            </th><td colspan="2">
                <p>The main benefit of E2E testing is ensuring that the whole system and subsystems work as intended.
                    You can catch potential user experience issues from the connected systems.</p>
                <p>This confirms your application is functional at every level &ndash; from the front to back-end and on
                    multiple systems &ndash; and provides perspective on its performance across different environments.
                </p>
                <p>E2E testing also provides expanded test coverage by creating additional test cases that may have not
                    previously been considered.</p>
                <p>It detects bugs and increases application productivity.</p>
                <p><a href="https://smartbear.com/solutions/end-to-end-testing">Read more</a></p>
            </td>
        </tr>
        <tr>
            <th scope="row">
                <p>What are the limitations/challenges of this test?</p>
            
            </th><td colspan="2">
                <p>E2E tests of any form can be slow. This creates bottlenecks, especially when there are too many E2E
                    tests.</p>
                <p>They can also be fragile, due to fluctuating data, wrong versions of code, or wrong configurations.
                </p>
                <p>They can be challenging and time consuming to debug, and require complex environment and data
                    management.</p>
                <p>They can make it difficult to assess coverage.</p>
                <p>And they come with an expensive overhead &ndash; coordinating large all-in-one deployments. 
                     With E2E tests, most of the cost is in maintenance, which is why there are the least number
                    of UI tests, with a focus on covering the most crucial workflows.</p>
                <p>The impact of this:</p>
                <ul>
                    <li>Teams can be left idly waiting</li>
                    <li>Tests result in sequential flows</li>
                    <li>Testing may result in Late Go/No-Go decisions</li>
                </ul>
            </td>
        </tr>
        <tr>
            <th scope="row">
                <p>What tools can be used for this test?</p>
            
            </th><td colspan="2">
                <p>For UI E2E testing, TestComplete from SmartBear is a UI functional test automation platform for web,
                    desktop, and mobile applications. You can script your tests or use the scriptless record and replay
                    function.</p>
                <p><a href="https://smartbear.com/product/testcomplete/overview/">Learn more about TestComplete</a></p>
            </td>
        </tr>
    </tbody>
</table><!--kg-card-end: html--><h3 id="using-contract-testing-and-integration-testing-together">Using contract testing and integration testing together </h3><p>In summary, as we saw in figure 2 - the rebalanced test pyramid - there is not one single step of the testing process is more important than the other. Each step plays a critical role in delivering quality software. SmartBear proudly supports all stages.</p><p>Numerous PactFlow customers praise the addition of contract testing in their test automation strategies:</p><!--kg-card-begin: html--><blockquote class="blockquote m-0 my-4 px-5 py-0" style="font-style: italic !important;
font-family: Roboto,'Helvetica Neue',Arial,sans-serif; border-left: 2px solid #024467; border-radius: 0;">Including contract testing with PactFlow in M1 Finance's test
    automation strategy has
    meant teams can simply reveal both the provider and the consumer side of the contract and move forward with
    confidence when they see validation.
    <footer class="blockquote-footer p-0 pt-2" style="font-style: unset">Read the <a href="https://pactflow.io/case-studies/m1-finance/">M1 Finance case
            study</a>. </footer>
</blockquote>
<blockquote class="blockquote m-0 my-4 px-5 py-0" style="font-style: italic !important;
font-family: Roboto,'Helvetica Neue',Arial,sans-serif; border-left: 2px solid #024467; border-radius: 0">Contract testing with Pactflow was implemented as part of an app modernisation project
    for a major
    US-based mortgage lender resulting in a 70% reduction in manual testing costs. <footer class="blockquote-footer p-0 pt-2" style="font-style: unset">
        Watch <a href="https://www.sngular.com/sngular-pactflow-reducing-the-cost-of-testing-in-app-modernization/">the
            case
            study webinar recording</a> with our consulting partner, Sngular.</footer>
</blockquote><!--kg-card-end: html--><p>Create your <a href="https://pactflow.io/try-for-free/">free PactFlow account</a> to test it out for yourself.</p><p>The pyramid is conceptual, but can help individual development teams determine the importance and weight of specific testing techniques in their ecosystem. This adds layers of quality and assurance at the most valuable places in the SDLC.</p><p>Now we've taken you through the path to quality delivery via an efficient SDLC, how do you ensure your application stays running, even when you are asleep? Well, you can take a look at <a href="https://www.bugsnag.com/" rel="noreferrer noopener">BugSnag</a> by SmartBear.</p>]]></content:encoded></item><item><title><![CDATA[Can I Deploy?]]></title><description><![CDATA[Pactflow’s unique Can I Deploy user interface allows teams to easily digest contract testing results, giving more information on what failed and why. Fix bugs faster and deploy with confidence. Try it on any Pactflow plan today]]></description><link>https://pactflow.io/blog/can-i-deploy/</link><guid isPermaLink="false">62df55ba2863b4000116062a</guid><category><![CDATA[can-i-deploy]]></category><category><![CDATA[deploy]]></category><category><![CDATA[feature]]></category><category><![CDATA[New Releases]]></category><dc:creator><![CDATA[Administrator]]></dc:creator><pubDate>Wed, 27 Jul 2022 02:28:42 GMT</pubDate><media:content url="https://s3-ap-southeast-2.amazonaws.com/content-prod-529546285894/2022/07/Screen-Shot-2022-07-26-at-2.12.03-pm-1.png" medium="image"/><content:encoded><![CDATA[<h3 id="know-when-it-s-safe-to-deploy-with-pactflow">Know when it’s safe to deploy with Pactflow</h3><img src="https://s3-ap-southeast-2.amazonaws.com/content-prod-529546285894/2022/07/Screen-Shot-2022-07-26-at-2.12.03-pm-1.png" alt="Can I Deploy?"><p>Before you deploy a new version of an application to a production environment, you need to know whether or not the version you're about to deploy is compatible with the versions of the other apps that already exist in that environment. The old-fashioned way of managing these dependencies involved deploying sets of pre-tested applications together, creating a bottleneck, and meaning that speedy development and testing on one application may be negated by slow development and testing on another.</p><p>The <a href="https://docs.pact.io/pact_broker/can_i_deploy">Pact way</a> of managing these dependencies is to use the Pact "Matrix" and the <code>can-i-deploy</code> tool (<a href="https://docs.pact.io/pact_broker/can_i_deploy">read more</a>). The CLI gives you the power of the matrix in your automation pipelines, allowing you to ask questions like <em>"Can I deploy version <code>24</code> of the <code>Foo</code> application to <code>production</code> ?" </em>and simplifying your deployment pipelines<em>:</em></p><!--kg-card-begin: image--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://s3-ap-southeast-2.amazonaws.com/content-prod-529546285894/2022/07/Screen-Shot-2022-07-26-at-2.12.03-pm.png" class="kg-image" alt="Can I Deploy?"><figcaption>can-i-deploy CLI in action</figcaption></figure><!--kg-card-end: image--><p>The CLI is great, however when it comes to diagnosing compatibility issues, or setting up the right queries to ask <code>can-i-deploy</code> when setting up your pipelines, a more exploratory environment would be preferable.</p><h2 id="introducing-the-can-i-deploy-page">Introducing the Can I Deploy page</h2><p>Today we are releasing a new Can I Deploy user interface (UI). This UI provides a rich query interface for the Matrix to ensure you can safely deploy your application, providing additional context not readily available via the CLI.</p><p><em>Sound good? Visit our docs to <a href="https://docs.pactflow.io/docs/user-interface/can-i-deploy">learn more</a> and get started.</em></p><h2 id="why-you-ll-love-this-new-ui">Why you’ll love this new UI</h2><h3 id="accessibility-and-transparency-">Accessibility and transparency:</h3><ul><li>Brings <code>can-i-deploy</code> into the UI in an easier-to-digest format compared to CLI</li><li>Non-frequent Pactflow users can get valuable information currently only available via CLI/APIs</li></ul><h3 id="ease-of-debugging-">Ease of debugging:</h3><ul><li>Get detailed information about what failed and why</li><li>Fix bugs faster with this detailed information and with it exposed to more of your team</li></ul><h2 id="how-it-works">How it works</h2><p>The page helpfully pre-populates items such as your application and environment names to avoid common user errors:</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://s3-ap-southeast-2.amazonaws.com/content-prod-529546285894/2022/07/can-i-deploy.gif" class="kg-image" alt="Can I Deploy?"><figcaption>The new Can I Deploy page</figcaption></figure><!--kg-card-end: image--><p>The new page is the spiritual successor to the Matrix <em>page</em> in the Open Source Pact Broker (which we also made available via the <code>Use old UI</code> button), which has a crude user interface and is limited in its search criteria:</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://s3-ap-southeast-2.amazonaws.com/content-prod-529546285894/2022/07/Screen-Shot-2022-07-26-at-2.07.47-pm.png" class="kg-image" alt="Can I Deploy?"><figcaption>The open source "Matrix" page</figcaption></figure><!--kg-card-end: image--><p>The new page provides all of the options available to the <code>can-i-deploy</code> tool, but provides a lot more context to help make sense of the data. </p><h2 id="available-now-try-it-out-">Available now - try it out!</h2><p>The new Can I Deploy user interface is available to all users on any Pactflow plan. Visit our docs to <a href="https://docs.pactflow.io/docs/user-interface/can-i-deploy">learn more</a> about the new page and how it works.</p>]]></content:encoded></item><item><title><![CDATA[Pact Open Source Update—June 2022]]></title><description><![CDATA[Pact OSS Changelog: June 2022 update. This month has seen a flurry of activity across the open source space, with many new contributors helping in a multitude of ways, so we will call out some notable mentions across .Net, NestJS and more. ]]></description><link>https://pactflow.io/blog/changelog-oss-june-2022/</link><guid isPermaLink="false">629ff13d2863b400011604e8</guid><category><![CDATA[Community]]></category><category><![CDATA[OSS Changelog]]></category><dc:creator><![CDATA[Yousaf Nabi]]></dc:creator><pubDate>Wed, 08 Jun 2022 06:40:25 GMT</pubDate><content:encoded><![CDATA[<p>Welcome to the Pact Open Source June 2022 update!</p><p>This month has seen a flurry of activity across the open source space, with many new contributors helping in a multitude of ways, so we will call out some notable mentions. <br> <br>‌Thanks to all of the contributors who have made this happen, if you haven’t been mentioned here but wish to appear in a later update, feel free to reach out to me on Slack.</p><h2 id="specific-language-updates">Specific language updates </h2><h3 id="-net">.Net  </h3><p>PactNet 4.0.0 is now released and pushed, <a href="https://www.nuget.org/packages/PactNet/ ">have a look</a>. <br><br>See the <a href="https://github.com/pact-foundation/pact-net/blob/4.0.0/docs/upgrading-to-4.md ">upgrade guide</a> for details of the rewrite and how to upgrade from 3.x to 4.x <br><br>Some words from our amazing maintainer <a href="https://github.com/adamrodger" rel="noreferrer noopener">Adam Rodger</a>: </p><blockquote><em><strong>Release Announcement</strong><br>Now that we've been in beta for a good while I think we're ready for a proper release of PactNet 4.0.0. I think we've ironed out any teething issues now, so thank you to all those that have participated in the beta and raised issues for me to fix. <br>I've got the current latest beta running in production at my employer and everything appears to be working OK. Of course there will be more features and things to add in the future, but I think the core functionality is all there and the API can be considered stable. </em></blockquote><p>Adam released PactNet 4.0.0 on 6 June and is now enjoying a well-deserved holiday. Thank you, Adam. <br> <br>Chat with us in: <a href="https://pact-foundation.slack.com/archives/C9UTHV2AD" rel="noreferrer noopener"><strong>#pact-net</strong> </a></p><h3 id="nestjs-pact-3">NestJS + Pact = &lt;3 </h3><p><a href="https://github.com/omermorad" rel="noreferrer noopener">Omer Morad,</a> our friend in, Tel Aviv, Israel, is a backend-oriented developer, OOP flavored, in a distributed systems world and also a Web artisan, TypeScripter, open-source enthusiast, and guitar player. <br> <br>He recently brought in <a href="https://github.com/pact-foundation/nestjs-pact" rel="noreferrer noopener">https://github.com/pact-foundation/nestjs-pact</a> to the pact-foundation and we would love to get it featured on the <a href="https://github.com/jmcdo29/testing-nestjs/issues/1676 ">awesome-nestjs repo</a>. <br><a href="https://github.com/jmcdo29/testing-nestjs/issues/1676" rel="noreferrer noopener"> </a><br>Are you using NestJS + Pact? Want to help build out an example? Chat with us in: <a href="https://pact-foundation.slack.com/archives/C03ELGE8UMB" rel="noreferrer noopener"><strong>#pact-nestjs</strong></a></p><h2 id="pull-requests">Pull Requests</h2><p><strong>1. Pact-Reference </strong>- <a href="https://github.com/pact-foundation/pact-reference/pull/194" rel="noreferrer noopener">Allow BrokerWithDynamicConfiguration to publish results</a> by <a href="https://github.com/kageru" rel="noreferrer noopener">Kageru</a></p><p><strong>2. Pact-JVM </strong>– <a href="https://github.com/pact-foundation/pact-jvm/issues/1555" rel="noreferrer noopener">Support for providerVersionBranch option to replace providerVersionTag</a> with thanks to <a href="https://github.com/TGNThump" rel="noreferrer noopener">Ben Pilgrim</a> &amp; <a href="https://github.com/praveen-em" rel="noreferrer noopener">Praveen Erode Mohanasundaram</a></p><p><strong>3. Pact-JVM</strong> – <a href="https://github.com/pact-foundation/pact-jvm/pulls?q=is%3Apr+is%3Aclosed++author%3Arejeeshg" rel="noreferrer noopener">Rejeeshg</a> for updating builds to resolve vulnerabilities. Dependabot or similar would be great here to save the manual effort! PR’s welcome :)</p><p><strong>4. Pact-PHP / Pact-Ruby / All the things</strong> – Shout out to <a href="https://github.com/Lewiscowles1986" rel="noreferrer noopener">Lewis Cowles</a> and <a href="https://github.com/trammel" rel="noreferrer noopener">Jonathon Padfield</a>.<br><br>Lewis has been working hard on <a href="https://github.com/pact-foundation/pact-ruby-standalone/pull/73" rel="noreferrer noopener">improving alpine support,</a> <a href="https://github.com/pact-foundation/pact-php/pull/249" rel="noreferrer noopener">fixing the pact-php build</a> after a URL change and created a number of issues against the pact-php repo to help the maintainer. Lewis said: </p><blockquote><a href="https://github.com/pact-foundation/pact-php/pull/253" rel="noreferrer noopener">This one</a> introduces scheduled builds so that if a maintainer gets "life happen" then you can still as an org know if that package is failing, and get visibility before a customer comes to you. It's a thing I use if I want to show something so that I know it should always be build-able.</blockquote><p>And thanks <a href="https://github.com/trammel" rel="noreferrer noopener">Jonathon</a> for <a href="https://github.com/pact-foundation/pact-ruby-standalone/pull/75" rel="noreferrer noopener">updating pact-ruby-standalone to use travelling ruby 2.4</a>, we are testing this out now and hope to roll this out across all the libraries soon.</p><h2 id="bi-directional-adapters">Bi-Directional Adapters</h2><h3 id="wiremock-net">WireMock &amp; .Net</h3><p>Using WireMock &amp; .Net and want to benefit from Bi-Directional Contract Testing?</p><p>🔥 Now you can generate Pact 🔗 contracts from your WireMock Server, check it out <a href="https://github.com/WireMock-Net/WireMock.Net/wiki/Pact" rel="noreferrer noopener">here</a>. </p><p>Thanks <a href="https://www.linkedin.com/in/ACoAAAClHlsBdpo1lJc1LiT8eM46fN2RNMYfVVo" rel="noreferrer noopener">Stef Heyenrath</a> 😍 for the his work in the community!</p><h3 id="pact-msw-adapter">Pact-MSW Adapter</h3><p><a href="https://github.com/pactflow/pact-msw-adapter" rel="noreferrer noopener">Pact-Msw-Adapter</a> now has new features and a <a href="https://docs.pactflow.io/docs/bi-directional-contract-testing/tools/msw" rel="noreferrer noopener">quick start guide,</a> an international effort with contributors from the UK, Argentina, Spain and Canada. Shouts go out to:</p><ol><li><a href="https://github.com/kikoruiz" rel="noreferrer noopener">Kiko Ruiz Llorret</a> for <a href="https://github.com/pactflow/pact-msw-adapter/pull/46" rel="noreferrer noopener">request query support</a></li><li><a href="https://github.com/simonn01" rel="noreferrer noopener">Nicholas Simons</a> for <a href="https://github.com/pactflow/pact-msw-adapter/pull/42" rel="noreferrer noopener">post request support</a></li><li>And we cannot forget <a href="https://github.com/IJuanI" rel="noreferrer noopener">Juan Cruz</a> for being an early trailblazer and improving the developer experience vastly<br></li></ol><h3 id="create-your-own-adapters-to-use-in-bi-directional-contract-testing-">Create your own adapters to use in Bi-Directional Contract Testing! <br> </h3><p>Inspired by our list of tools, but don’t see your <a href="https://docs.pactflow.io/docs/bi-directional-contract-testing/tools">favourite</a>?  Create your own! Here's how:</p><ol><li><a href="https://docs.pactflow.io/docs/bi-directional-contract-testing/contracts/pact#converting-mocks-into-a-pact-compatible-format" rel="noreferrer noopener">Convert</a> your mock format to a supported Pact specification format - we recommend v2 at the moment - <a href="https://bitbucket.org/atlassian/pact-json-schema/src/master/schemas/v2/schema.json">see a jsonschema to test against</a></li><li>Create an example - see our <a href="https://docs.pactflow.io/#bi-directional">existing supported tools and demos</a></li><li><a href="https://github.com/pactflow/docs.pactflow.io/ ">Submit a PR to</a> to get listed </li></ol><h2 id="our-awesome-community">Our awesome community </h2><p>Developer Relations at Pact-Foundation now has a new home @ <a href="https://github.com/pact-foundation/devrel" rel="noreferrer noopener">https://github.com/pact-foundation/devrel </a><br><a href="https://github.com/pact-foundation/devrel" rel="noreferrer noopener"> </a><br>We recently hooked up <a href="https://orbit.love/" rel="noreferrer noopener">Orbit.love</a>, to give us a bit of a glance across our open source estate, and we were able to pull out well over 2k different contributions from just the top 15 in the leaderboard excluding Pactflow’s co-founders!</p><p>Particular shout-out to Timothy Jones, who has been on an epic crusade to empower those around him with words of contract testing wisdom and delightful development life-hacks. The Pact world wouldn’t be the same without you all, and we appreciate every contribution big or small.</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://s3-ap-southeast-2.amazonaws.com/content-prod-529546285894/2022/06/Pact-Orbit-June-2022.png" class="kg-image"><figcaption>Pact contributors</figcaption></figure><!--kg-card-end: image--><p>Community is everything for us. And that’s why we have big plans to dive into the various initiatives and determine how we can acknowledge and support members and the community as a whole for their time and dedication. Without each of you ❤️ Pact would not be the leading open source cross-language distributed contract testing framework! Like us, you should be so proud that you’re helping free the world from the burden of microservice spawl and deployment headaches.</p><p></p><h2 id="other-ways-to-get-involved-with-pact">Other ways to get involved with Pact</h2><p><br>The Pact ecosystem is vast, I will be sharing some posts over the upcoming months, showing the size of the estate, and looking to gain insight from you, the community, as to how we can reduce the signal-to-noise and help reduce the cognitive load required to navigate <a href="https://docs.pact.io/pact_nirvana">the path the Pact Nirvana</a> in your own organisation.<br><br>There are a multitude of ways, and you don't need to be a code wizard to start: <br></p><ul><li>📙 <a href="https://docs.pact.io/contributing/docs">Docs</a> - Our documentation is the primary way to communicate to our users, you can help out with small changes like a typo, help rewrite larger pieces, or add new content. Think of it as a open source contract testing wiki, and you are all the curators.</li><li>🚀 <a href="https://docs.pact.io/contributing">Code</a> - We have implementations across multiple languages, and not all of them are at feature parity. Sometimes you might need that feature, or you've found a bug. Every pact-foundation repository is open-source, and contains a contributing guide to help you get started. Maybe you are building your own Pact tooling, let us know, we would love to shout about it.</li><li><a href="https://docs.pact.io/roadmap">Roadmap / Feature Requests</a> - The Pact roadmap is available on Canny, where you can see some of the teams current and upcoming priorities in the OSS space. You can request new features, or browse the list and vote/comment on ones you would love to see. See one that particularly resonates? You could help work on it, reach out via <a href="https://pact-foundation.slack.com/ssb/redirect">Slack</a> and we can help guide you through your contribution.</li><li><a href="https://docs.pact.io/recipes">Recipes</a> - The community use our tools in a variety of different ways, and solve various challenges that others could benefit. Got something to share? Why not add a new recipe to the site?</li><li><a href="https://docs.pact.io/implementation_guides/workshops">Workshops</a> - We created a number of workshops, across several languages. Is there a language implementation not covered in the workshop? Maybe you've created or seen some amazing workshops out there in the wild? Add it to the list, or if you are the author, you can discuss bringing your workshop under the Pact-foundation, if you feel all Pact users could benefit</li><li><a href="https://docs.pact.io/blogs_videos_and_articles">Blogs, Videos &amp; Articles</a> - Articles about contract testing are appearing left, right and centre, I can't keep up. Make sure our reading list doesn't get dry, by adding your favourite content to the list</li><li><a href="https://docs.pact.io/events">Events</a> - Meetups, in person, it feels like a distant memory, but as the doors start opening again, and dinner is provided, people are beginning to flock outdoors. Have you got a meetup or event planned? Already had one and recorded it? You can add them to the list, and let us and the community know about it on Slack.</li><li><a href="https://docs.pact.io/help">Helping those in the community</a> - We know many of you in the community love sharing your contract testing knowledge with others, you can see the various places our users land for help, sometimes in GitHub issues, Stack overflow, or Slack. You are welcome to help them out whether you are new to Pact, or a seasoned pro, all questions, opinions and thoughts are welcome.</li><li>Pact champions - Are you like our co-founder Beth Skurrie, who decided that Pact idea was the best thing since sliced bread, and she hasn't stopped yacking on about it since. Want to share your knowledge, and build your social profile in the world of tech with a global platform? Please get in touch with me on <a href="https://pact-foundation.slack.com/ssb/redirect">Slack</a>, we want to support the amazing work you do! <br><br>If you love Pact, and want to help the world worry less about micro-service deployment, why not join us on our journey. Who knows where it might lead.</li></ul><p>That's all for now, catch you next month! </p><p>- <strong>Yousaf Nabi—</strong>Developer Advocate at Pactflow and Community Shepherd at Pact</p>]]></content:encoded></item><item><title><![CDATA[Pact Open Source Update—May 2022]]></title><description><![CDATA[Pact OSS Changelog: May 2022 update. The contributor community has been hard at work uplifting key languages to integrate our Rust shared core, enabling support for the latest features in the specification, plugins, and more.‌]]></description><link>https://pactflow.io/blog/changelog-oss-may-2022/</link><guid isPermaLink="false">6270d22a13241e00010ad491</guid><category><![CDATA[Community]]></category><category><![CDATA[OSS Changelog]]></category><dc:creator><![CDATA[Yousaf Nabi]]></dc:creator><pubDate>Wed, 04 May 2022 01:56:44 GMT</pubDate><content:encoded><![CDATA[<p>Welcome to the inaugural Pact Open Source update!</p><p>This month Pactflow officially joins the SmartBear family, and with this, the Pact OSS community will be supported by SmartBear. We're excited to join SmartBear and together, expand contract testing to more developers and testers. <a href="https://pactflow.io/blog/pactflow-joins-the-smartbear-family/">Read</a> more about what this means for you. </p><p>The contributor community has been hard at work uplifting key languages to integrate our <a href="https://github.com/pact-foundation/pact-specification/issues/83?mc_cid=0ede309bca&amp;mc_eid=UNIQID">Rust shared core</a>, enabling support for the latest features in the <a href="https://github.com/pact-foundation/pact-specification?mc_cid=0ede309bca&amp;mc_eid=UNIQID">specification</a>, <a href="https://github.com/pact-foundation/pact-specification/issues/83?mc_cid=0ede309bca&amp;mc_eid=UNIQID">plugins</a> and more.‌<br>‌‌<br>‌Thanks to all of the contributors who have made this happen.‌</p><!--kg-card-begin: html--><!--
<h2>Pact Open Source updates</h2>
‌‌‌<p>Here is a short update on major changes across the ecosystem:</p>
<style type="text/css">.tg  {border-collapse:collapse;border-color:#bbb;border-spacing:0;}
.tg td{background-color:#E0FFEB;border-color:#bbb;border-style:solid;border-width:0px;color:#594F4F;
  font-family:Arial, sans-serif;font-size:14px;overflow:hidden;padding:10px 5px;word-break:normal;}
.tg th{background-color:#9DE0AD;border-color:#bbb;border-style:solid;border-width:0px;color:#493F3F;
  font-family:Arial, sans-serif;font-size:14px;font-weight:normal;overflow:hidden;padding:10px 5px;word-break:normal;}
.tg .tg-dhdy{background-color:#00c5bb;border-color:#00c5bb;font-weight:bold;text-align:left;vertical-align:top}
.tg .tg-dtws{background-color:#00c5bb;border-color:inherit;font-weight:bold;text-align:left;vertical-align:top}
.tg .tg-gaf0{background-color:#ffffff;border-color:inherit;text-align:left;vertical-align:top}
.tg .tg-c6of{background-color:#ffffff;border-color:inherit;text-align:left;vertical-align:top}
</style>
<table class="tg">
	<thead>
		<tr>
			<th class="tg-dhdy">Language</th>
			<th class="tg-dtws">Repository</th>
			<th class="tg-dtws">Support</th>
			<th class="tg-dtws"><a href="https://github.com/pact-foundation/pact-specification/tree/version-3" target="_blank">v3 Status</a></th>
			<th class="tg-dtws"><a href="https://github.com/pact-foundation/pact-specification/tree/version-4" target="_blank">v4 Status</a></th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td class="tg-gaf0">Java</td>
			<td class="tg-gaf0"><a href="https://github.com/pact-foundation/pact-jvm" target="_blank">Pact-JVM</a></td>
			<td class="tg-gaf0">Official (PF)</td>
			<td class="tg-gaf0">Full support</td>
			<td class="tg-gaf0">Full support</td>
		</tr>
		<tr>
			<td class="tg-c6of">JavaScript</td>
			<td class="tg-c6of"><a href="https://github.com/pact-foundation/pact-js" target="_blank">Pact JS</a></td>
			<td class="tg-c6of">Official (PF)<br />
			<a href="https://pact-foundation.slack.com/archives/C9VBGLUM9" target="_blank">#pact-js</a></td>
			<td class="tg-c6of">Beta<br />
			<a href="https://github.com/pact-foundation/pact-js/releases/tag/v10.0.0-beta.59" target="_blank">v10.0.0-beta.59<br />
			Progress</a></td>
			<td class="tg-c6of">&nbsp;</td>
		</tr>
		<tr>
			<td class="tg-gaf0">Ruby</td>
			<td class="tg-gaf0"><a href="https://github.com/pact-foundation/pact-ruby" target="_blank">Pact Ruby</a></td>
			<td class="tg-gaf0">Official (PF)</td>
			<td class="tg-gaf0"></td>
			<td class="tg-gaf0">&nbsp;</td>
		</tr>
		<tr>
			<td class="tg-c6of">.NET</td>
			<td class="tg-c6of"><a href="https://github.com/pact-foundation/pact-net" target="_blank">Pact .NET</a></td>
			<td class="tg-c6of">Official (PF)<br />
			<a href="https://pact-foundation.slack.com/archives/C9UTHV2AD" target="_blank">#pact-net</a></td>
			<td class="tg-c6of">Beta<br />
			<a href="https://github.com/pact-foundation/pact-net/releases/tag/4.0.0-beta.3" target="_blank">4.0.0-beta.3<br />
			update guide</a></td>
			<td class="tg-c6of">&nbsp;</td>
		</tr>
		<tr>
			<td class="tg-gaf0">Go</td>
			<td class="tg-gaf0"><a href="https://github.com/pact-foundation/pact-go" target="_blank">PactPGo</a></td>
			<td class="tg-gaf0">Official (PF)<br />
			<a href="https://pact-foundation.slack.com/archives/C9UTHTFFB" target="_blank">#pact-go</a></td>
			<td class="tg-gaf0">Beta<br />
			<a href="https://github.com/pact-foundation/pact-go/releases/tag/v2.0.0-beta.10" target="_blank">v2.0.0-beta.10</a></td>
			<td class="tg-gaf0">&nbsp;</td>
		</tr>
		<tr>
			<td class="tg-c6of">PHP</td>
			<td class="tg-c6of"><a href="https://github.com/pact-foundation/pact-php" target="_blank">Pact PHP</a></td>
			<td class="tg-c6of">Official (PF)</td>
			<td class="tg-c6of"></td>
			<td class="tg-c6of">&nbsp;</td>
		</tr>
		<tr>
			<td class="tg-gaf0">Python</td>
			<td class="tg-gaf0"><a href="https://github.com/pact-foundation/pact-python/" target="_blank">Pact Python</a></td>
			<td class="tg-gaf0">Official (PF)<br />
			<a href="https://pact-foundation.slack.com/archives/C9VECUP6E" target="_blank">#pact-python</a></td>
			<td class="tg-gaf0"></td>
			<td class="tg-gaf0">&nbsp;</td>
		</tr>
		<tr>
			<td class="tg-c6of">Python</td>
			<td class="tg-c6of"><a href="https://github.com/reecetech/pactman" target="_blank">Pactman</a></td>
			<td class="tg-c6of">Community</td>
			<td class="tg-c6of"></td>
			<td class="tg-c6of">&nbsp;</td>
		</tr>
		<tr>
			<td class="tg-gaf0">Swift/Objective C</td>
			<td class="tg-gaf0"><a href="https://github.com/surpher/PactSwift" target="_blank">PactSwift</a></td>
			<td class="tg-gaf0">Community (PF)<br />
			<a href="https://pact-foundation.slack.com/archives/C9VBGNT4K" target="_blank">#pact-swift</a></td>
			<td class="tg-gaf0">Full support<br />
			<a href="https://github.com/jbwheatley/pact4s/releases/tag/v0.3.0" target="_blank">v.0.3.0</a></td>
			<td class="tg-gaf0">&nbsp;</td>
		</tr>
		<tr>
			<td class="tg-c6of">Swift/Objective C</td>
			<td class="tg-c6of"><a href="https://github.com/DiUS/pact-consumer-swift" target="_blank">pact-consumer-swift</a></td>
			<td class="tg-c6of">Community (PF)</td>
			<td class="tg-c6of"></td>
			<td class="tg-c6of">&nbsp;</td>
		</tr>
		<tr>
			<td class="tg-gaf0">Scala</td>
			<td class="tg-gaf0"><a href="https://github.com/ITV/scala-pact" target="_blank">Scala Pact</a></td>
			<td class="tg-gaf0">Community (PF)</td>
			<td class="tg-gaf0">No<br />
			Moving into maintenance<br />
			mode</td>
			<td class="tg-gaf0">No</td>
		</tr>
		<tr>
			<td class="tg-c6of">Scala</td>
			<td class="tg-c6of"><a href="https://github.com/jbwheatley/pact4s" target="_blank">pact4s</a></td>
			<td class="tg-c6of">Community (PF)<br />
			<a href="https://pact-foundation.slack.com/archives/C02ACMH759Q" target="_blank">#pact4s</a></td>
			<td class="tg-c6of">Full support</td>
			<td class="tg-c6of">&nbsp;</td>
		</tr>
		<tr>
			<td class="tg-gaf0">Rust</td>
			<td class="tg-gaf0"><a href="https://github.com/pact-foundation/pact-reference" target="_blank">Pact Rust</a></td>
			<td class="tg-gaf0">Community (PF)</td>
			<td class="tg-gaf0">Full support</td>
			<td class="tg-gaf0">Full support</td>
		</tr>
		<tr>
			<td class="tg-c6of">C++</td>
			<td class="tg-c6of"><a href="https://github.com/pact-foundation/pact-cplusplus" target="_blank">Pact C++</a></td>
			<td class="tg-c6of">Community (PF)</td>
			<td class="tg-c6of"></td>
			<td class="tg-c6of">&nbsp;</td>
		</tr>
	</tbody>
</table>
--><!--kg-card-end: html--><h2 id="specific-language-updates">Specific language updates <br></h2><h3 id="-net">.NET<br></h3><p><strong>Pact-net: </strong>Next major release is not far away, with the Pact specification v3 beta stabilising: <a href="https://github.com/pact-foundation/pact-net/">https://github.com/pact-foundation/pact-net/</a> (v4.0.0-beta.3).<br><br>Chat with us in: <a href="https://pact-foundation.slack.com/archives/C9UTHV2AD"><strong>#pact-net</strong></a><br></p><h3 id="golang">Golang<br></h3><p><strong>Pact-go:</strong> Next major release is not far away, with the Pact specification v3 beta stabilising: <a href="https://github.com/pact-foundation/pact-go/tree/2.x.x">https://github.com/pact-foundation/pact-go/tree/2.x.x</a> (v2.0.0-beta.10).<br><br>Chat with us in: <a href="https://pact-foundation.slack.com/archives/C9UTHTFFB"><strong>#pact-go</strong></a><br></p><h3 id="node-js">Node JS<br></h3><p><strong>Pact-JS:</strong> Pact specification V3 beta now available:<strong> </strong><a href="https://github.com/pact-foundation/pact-js/tree/feat/v3.0.0/">https://github.com/pact-foundation/pact-js/tree/feat/v3.0.0/</a> (v10.0.0-beta.59). Follow the roadmap <a href="https://github.com/pact-foundation/pact-js/projects/3">progress</a>.<br><br>Chat with us in: <a href="https://pact-foundation.slack.com/archives/C9VBGLUM9"><strong>#pact-js</strong></a><br></p><h3 id="swift">Swift<br></h3><p><strong>Pact-Swift:</strong> Pact specification V3 support and provider side verification in Swift: <a href="https://github.com/surpher/PactSwift">https://github.com/surpher/PactSwift</a>.</p><p><br>Chat with us in: <a href="https://pact-foundation.slack.com/archives/C9VBGNT4K"><strong>#pact-swift</strong></a><br></p><h3 id="scala">Scala<br></h3><p><strong>Scala-Pact</strong>: 🚧 ITV Pact is moving to maintenance mode and will only support up to <a href="https://github.com/ITV/scala-pact#latest-version-is-440">Pact specification V2</a>.<br><br><strong>pact4s: </strong>The future is <a href="https://github.com/jbwheatley/pact4s/">pact4s</a>, which is a Scala wrapper of Pact JVM and currently supports up to Pact specification V3.<br><br>Chat with us in: <a href="https://pact-foundation.slack.com/archives/C02ACMH759Q"><strong>#pact4s</strong></a><br></p><h3 id="python">Python<br></h3><p><strong>Pact-Python: </strong>Message support was added in 2021 to enable testing of asynchronous integrations such as RabbitMQ or Kafka (<a href="https://github.com/pact-foundation/pact-python/pull/194">https://github.com/pact-foundation/pact-python/pull/194</a>, <a href="https://github.com/pact-foundation/pact-python/pull/251">https://github.com/pact-foundation/pact-python/pull/251</a>).<br><br>Chat to us in: <a href="https://pact-foundation.slack.com/archives/C9VECUP6E"><strong>#pact-python</strong></a><br></p><h3 id="v4-pact-specification">V4 Pact Specification </h3><p><br>Pact specification V4 is <a href="https://github.com/pact-foundation/pact-specification/tree/version-4">here</a>! We worked hard on listening to the community, after the release of v3, 5 years ago. We consolidation many of the requests people made about things that haven't worked quite properly. One of the biggest changes is consolidation the file format to allow for HTTP and message interactions with a single file.<br></p><ul><li>📹 See an AMA from 2021 where Ron Holshausen took us through "<a href="https://www.youtube.com/watch?v=u7LzZ6Fm1Ok">What's in store for Pact specification v4.0</a>?"</li><li>📙 Read the V4 spec RFC for a full list of changes: <a href="https://github.com/pact-foundation/pact-specification/issues/71">https://github.com/pact-foundation/pact-specification/issues/71</a></li><li>🚀 Implementations in <a href="https://github.com/pact-foundation/pact-reference/blob/master/rust/README.md">Rust</a> core and <a href="https://github.com/pact-foundation/pact-jvm#supported-jdk-and-specification-versions">JVM</a> has been completed</li><li>🌍 All our Pact specifications are open-source and you can see them all <a href="https://github.com/pact-foundation/pact-specification#index">here</a><br></li></ul><h3 id="plugins-protobufs-and-grpc-oh-my-">Plugins, Protobufs and gRPC (oh my!)<br></h3><p>Back in September 2021 Matt introduced us to <a href="https://pactflow.io/blog/the-case-for-contract-testing-protobufs-grpc-avro/">The case for contract testing Protobufs, gRPC and Avro</a>. <br><br>We are pleased to announced initial support for testing gRPC interactions via <a href="https://github.com/pact-foundation/pact-specification/issues/83">plugins</a> has been added to Pact-JVM (for Junit5) and Pact-Rust including the shared core, enabling distribution to other client libraries.</p><p>We have released an official Pactflow <a href="https://github.com/pactflow/pact-protobuf-plugin">Protobuf</a> / <a href="https://github.com/pactflow/pact-protobuf-plugin">gRPC</a> <a href="https://github.com/pact-foundation/pact-plugins">plugin</a> for Pact.</p><p>Join the <a href="https://github.com/pactflow/roadmap#developer-preview-programs">Developer Preview Program</a> for updates, or chat to us in <a href="https://pact-foundation.slack.com/archives/CEQBDD5U4">#protobufs</a>.</p><h3 id="pactman">Pactman<br></h3><p>Hungry for docs, but don't want to move from your terminal? Type <code>npx pactman</code> for a treat 😲</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://lh4.googleusercontent.com/Y7mWJH9fXWXGTLZ8KKzFrXGlJwxZhbnXwn0ckAQEQDwWUJKh863KYFdAvQXpFcO8QidK3EyHM0DObLg8oGyznxXFy40RF7LT6z85jqHQwQI6nSZYfPpXw0sNUIGm82i8QxibmzQrec6rMWAWng" class="kg-image"><figcaption>🔍 pactman - search the pact docs from your terminal 👩‍💻</figcaption></figure><!--kg-card-end: image--><h3 id="get-involved-">Get involved!</h3><p><br>The Pact ecosystem is vast, I will be sharing some posts over the upcoming months, showing the size of the estate, and looking to gain insight from you, the community, as to how we can reduce the signal-to-noise and help reduce the cognitive load required to navigate <a href="https://docs.pact.io/pact_nirvana">the path the Pact Nirvana</a> in your own organisation.<br><br>There are a multitude of ways, and you don't need to be a code wizard to start: <br></p><ul><li>📙 <a href="https://docs.pact.io/contributing/docs">Docs</a> - Our documentation is the primary way to communicate to our users, you can help out with small changes like a typo, help rewrite larger pieces, or add new content. Think of it as a open source contract testing wiki, and you are all the curators.</li><li>🚀 <a href="https://docs.pact.io/contributing">Code</a> - We have implementations across multiple languages, and not all of them are at feature parity. Sometimes you might need that feature, or you've found a bug. Every pact-foundation repository is open-source, and contains a contributing guide to help you get started. Maybe you are building your own Pact tooling, let us know, we would love to shout about it.</li><li><a href="https://docs.pact.io/roadmap">Roadmap / Feature Requests</a> - The Pact roadmap is available on Canny, where you can see some of the teams current and upcoming priorities in the OSS space. You can request new features, or browse the list and vote/comment on ones you would love to see. See one that particularly resonates? You could help work on it, reach out via Slack and we can help guide you through your contribution.</li><li><a href="https://docs.pact.io/recipes">Recipes</a> - The community use our tools in a variety of different ways, and solve various challenges that others could benefit. Got something to share? Why not add a new recipe to the site?</li><li><a href="https://docs.pact.io/implementation_guides/workshops">Workshops</a> - We created a number of workshops, across several languages. Is there a language implementation not covered in the workshop? Maybe you've created or seen some amazing workshops out there in the wild? Add it to the list, or if you are the author, you can discuss bringing your workshop under the Pact-foundation, if you feel all Pact users could benefit</li><li><a href="https://docs.pact.io/blogs_videos_and_articles">Blogs, Videos &amp; Articles</a> - Articles about contract testing are appearing left, right and centre, I can't keep up. Make sure our reading list doesn't get dry, by adding your favourite content to the list</li><li><a href="https://docs.pact.io/events">Events</a> - Meetups, in person, it feels like a distant memory, but as the doors start opening again, and dinner is provided, people are beginning to flock outdoors. Have you got a meetup or event planned? Already had one and recorded it? You can add them to the list, and let us and the community know about it on Slack.</li><li><a href="https://docs.pact.io/help">Helping those in the community</a> - We know many of you in the community love sharing your contract testing knowledge with others, you can see the various places our users land for help, sometimes in GitHub issues, Stack overflow, or Slack. You are welcome to help them out whether you are new to Pact, or a seasoned pro, all questions, opinions and thoughts are welcome.</li><li>Pact champions - Are you like our co-founder Beth Skurrie, who decided that Pact idea was the best thing since sliced bread, and she hasn't stopped yacking on about it since. Want to share your knowledge, and build your social profile in the world of tech with a global platform? Please get in touch with me on <a href="https://pact-foundation.slack.com/ssb/redirect">Slack</a>, we want to support the amazing work you do! <br></li></ul><p>If you love Pact, and want to help the world worry less about micro-service deployment, why not join us on our journey. Who knows where it might lead.</p><p>That's all for now, catch you next month! </p><p>- <strong>Yousaf Nabi—</strong>Developer Advocate at Pactflow and Community Shepherd at Pact</p>]]></content:encoded></item></channel></rss>