3 Tools to Improve Your Code Quality: GitHub Codespaces, Kubernetes, and Skyramp

dangross

Dan Gross

Posted on November 2, 2023

3 Tools to Improve Your Code Quality: GitHub Codespaces, Kubernetes, and Skyramp

In the world of developing distributed applications with microservices, code quality is paramount. It can make the difference between a well-functioning application, and one that's prone to bugs and vulnerabilities. To help you maintain and improve your code quality, we'll explore three powerful tools in this blog: GitHub Codespaces, Kubernetes, and Skyramp. You’ll be able to try this combo for yourself with an instant dev environment.

Putting the Pieces Together

In previous blog posts, we covered using GitHub Codespaces for debugging, generating tests in a Kubernetes cluster, and running Skyramp's built-in dashboard to manage test results. In this blog, we’ll bring the pieces together to show how you can use all these tools to construct and run test scenarios for your system-under-test.

A Word about Component Testing

Within the space beyond unit testing and prior to end-to-end testing, there is a critical stage known as component testing. This infodeck on Martin Fowler's website covering testing strategies for microservices describes component testing this way:

"In a microservice architecture, the components are the services themselves. By writing tests at this granularity, the contract of the API is driven through tests from the perspective of a consumer."

When you're developing a distributed application with microservices, it's essential to ensure that each component functions correctly, both in isolation as well as when integrated with other components. Component testing is the key to ensuring this, and Skyramp is here to assist you in this endeavor.

Instant Dev Environment

GitHub Codespaces can be used to provide a cloud-based, integrated development environment that makes it easier to set up and run your tests with Skyramp. You can clone your repository, create a dedicated Codespace for your microservices, and then execute tests. A straightforward testing workflow is crucial to identify and fix issues early in the development process, saving you time and reducing headaches in the long run.

Here are some benefits of using GitHub Codespaces for component testing:

  • On-Demand Environments: Easily spin up a development environment for your microservices project, reducing setup time and eliminating conflicts between dependencies.

  • Consistency: Ensure that all developers work in identical environments, reducing the "it works on my machine" problem.

  • Collaboration: Multiple developers can collaborate on the same project without worrying about where to setup and run environments.

  • Easy Test and Debug: Run tests and debug seamlessly within the Codespace environment using a familiar VSCode interface.

We've prepared a GitHub Codespace from a branch of the Skyramp sample-microservices repo on GitHub. This branch is based on the Online Boutique demo project from Google Cloud. The project is a web-based e-commerce store that consists of an 11-tier microservices application. Skyramp added support for REST, which we will use for the example in this blog.

The GitHub Codespace can be launched from the link below and then clicking "Create Codespace".

Open in GitHub Codespaces

That will setup a VSCode environment within the browser that looks like this:

Image description

Kubernetes Clusters in GitHub Codespaces

For microservices to function as a cohesive system, you need a way to test their interaction in a realistic environment. This is where Kubernetes comes into play. Kubernetes allows you to manage containerized applications in clusters, making it a perfect fit for deploying and testing microservices.

We will be using the Online Boutique application mentioned earlier for our example, which is built around Kubernetes. Skyramp can then be utilized to easily deploy and test the distributed app consisting of various microservices. We have created tests in the repo for testing 4 primary components of the application - Product Catalog, Cart, Payment, and Checkout.

Image description

Let's get started by changing the directory in the terminal of the Codespace to skyramp/rest-demo:

cd skyramp/rest-demo
Enter fullscreen mode Exit fullscreen mode

Then, we'll create a new Kubernetes cluster with the Skyramp CLI:

skyramp cluster create -l
Enter fullscreen mode Exit fullscreen mode

Expected output:

Creating local cluster     [##############################################################] 100 %
Successfully created local cluster.
Starting/restarting Resolver     [##############################################################] 100 %
Resolver manages DNS changes needed to access the cluster and needs sudo access.
[sudo] updating file /etc/resolv.conf
Enter fullscreen mode Exit fullscreen mode

Next, let's bring up the system using Skyramp Deployer:

skyramp deployer up rest-app
Enter fullscreen mode Exit fullscreen mode

Expected output:

email-service-745ddcd9c4-6zf8s                 ready
frontend-6f8fc574f7-w6hgb                      ready
product-catalog-service-5467566c8f-5n86m       ready
skyramp-worker-6c8bfdf587-bpf9m                ready
cart-service-56cd75c447-kshpg                  ready
currency-service-5b966cbfb8-tffff              ready
ad-service-7cb787976d-ldjm7                    ready
payment-service-5f9b47cfd4-26r9d               ready
redis-6fc54f68c4-fwg75                         ready
recommendation-service-6f8cd558b8-6cppj        ready
checkout-service-c5546db56-vdxld               ready
shipping-service-599947db74-flqhq              ready
All pods are ready.
Enter fullscreen mode Exit fullscreen mode

The system-under-test is now up and running. We have prepared several test scenarios which will be easy to run and then review the results with Skyramp.

A Complement of Tests

Quality assurance is not limited to early unit tests and final end-to-end tests. You need a comprehensive suite of tests, which include functional integration and performance tests, as well as the component tests highlighted earlier. This is where Skyramp completes the picture. Skyramp is an automated testing platform that can help you create and manage a wide range of tests for this stage of development.

Skyramp takes a modular approach to testing, as illustrated below with examples taken from the testing scenario we used for this blog.

  • Endpoints: Skyramp will use endpoint definitions for networking details of services used in tests as shown in this endpoint YAML file:
version: v1
services:
    - name: product-catalog-service
      port: 60000
      alias: product-catalog-service
      protocol: rest
endpoints:
  - name: product-catalog-service-get-products
    path: "/get-products"
    serviceName: product-catalog-service
    methods:
      - type: 'GET'
        name: get-products
Enter fullscreen mode Exit fullscreen mode
  • Scenarios: Skyramp uses scenario definitions for request behavior of service methods or chains of requests, and specific asserts within test scenarios:
version: v1
scenarios:
  - name: scenario_123
    steps:
      - requestName: listProductsRequest
      - asserts: requests.listProductsRequest.res[0].id == "OLJCESPC7Z"
      - requestName: addCartRequest
      - asserts: requests.addCartRequest.res.success == "200 OK"
      - requestName: getCartRequest
      - asserts: requests.getCartRequest.res.user_id == "abcde"
      - requestName: chargeRequest
      - asserts: requests.chargeRequest.res.transaction_id != null
      - requestName: checkoutRequest
      - asserts: requests.checkoutRequest.res.items[0].item.product_id == "OLJCESPC7Z"
Enter fullscreen mode Exit fullscreen mode
  • Tests: Skyramp uses test definitions as a starting point to execute the proper behavior of tests:
version: v1
test:
  name: "[REST] Checkout system load test testcase"
  target: rest-app
  testPattern:
    - startAt: 1s
      atOnce: 2
      scenarioName: scenario1
      duration: 10s
Enter fullscreen mode Exit fullscreen mode

Running the Test, Checking the Results

We’ve found it incredibly valuable to have a central dashboard that aggregates and visualizes the results of your tests so you can get the most out of these tools, and ensure that your code quality is continually improving. Skyramp provides just that, and it can be run in GitHub Codespaces! Let's fire up the Skyramp Dashboard and run our test scenario against the services in the cluster.

Back to the Codespaces terminal, run this command:

skyramp dashboard up &
Enter fullscreen mode Exit fullscreen mode

Image description

Click "Open in Browser" from the dialog box popup regarding port forwarding and you will see the Skyramp Dashboard interface in a new browser tab. Click on "Tests". There will be no tests yet to display, but we can change that. Back to the Codespace tab, run Skyramp Tester in the terminal to execute our full-system test:

skyramp tester start full-system -n test-rest-demo
Enter fullscreen mode Exit fullscreen mode

Now back to the Skyramp Dashboard tab in the browser and you will see the results of the test run there:

Image description

Looks like a passing grade! Notice the cells in the table can be expanded to view details of the test results.

You can explore further and even tweak the tests by checking out the YAML files in the endpoints, scenarios, and tests folders under skyramp/rest-demo. Also, visit the Skyramp Docs to learn more about all the functionality available for testing with Skyramp.

The Power of 3

By combining GitHub Codespaces, Kubernetes, and Skyramp, especially with a robust testing dashboard, you can ensure that your code quality remains high throughout the development lifecycle. As a result, your applications will be more reliable, ultimately leading to greater user satisfaction and a stronger competitive edge in the landscape of microservices-based distributed apps. As always, happy testing!

For more info, visit: Skyramp.dev & Join the Skyramp Community Discord

💖 💪 🙅 🚩
dangross
Dan Gross

Posted on November 2, 2023

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related