Up until now, we have run our test files locally. Now, we want to integrate them in a CI/CD pipeline (like GitHub Actions or GitLab CI/CD pipelines). As Hurl is very fast, we’re going to run our tests on each commit of our project, drastically improving the project quality.
A typical web project pipeline is:
In this workflow, we’re testing the same image that will be used and deployed in production.
For the tutorial, we are skipping build and publication phases and only run integration tests on a prebuilt Docker image. To check a complete project with build, Docker upload/publish and integration tests, go to https://github.com/jcamiel/quiz
In a first step, we’re going to write a bash script that will pull our Docker image, launch it and run Hurl tests against it. Once we have checked that this script runs locally, we’ll see how to run it automatically in a CI/CD pipeline.
integration/create-quiz.hurlfrom the previous tutorial to the directory.
$ mkdir quiz-project $ cd quiz-project $ mkdir integration $ vi integration/basic.hurl # Import <a href="https://raw.githubusercontent.com/jcamiel/quiz/master/integration/basic.hurl">basic.hurl</a> here! $ vi integration/create-quiz.hurl # Import <a href="https://raw.githubusercontent.com/jcamiel/quiz/master/integration/create-quiz.hurl">create-quiz.hurl</a> here!
Next, we are going to write the first version of our integration script that will just pull the Quiz image and run it:
bin/integration.shwith the following content:
$ chmod u+x bin/integration.sh $ bin/integration.sh Starting Quiz container 5d311561828d6078e84eb4b8b87dfd5d67bde6d9614ad83860b60cf310438d2a
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c685f3887cc1 ghcr.io/jcamiel/quiz:latest "java -jar app/quiz.…" 3 seconds ago Up 3 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp quiz $ docker stop quiz quiz
Now, we have a basic script that starts our container. Before adding our integration tests, we need to ensure that our application server is ready: the container has started, but the application server can take a few seconds to be really ready to accept incoming HTTP requests.
To do so, we can test our health API. With a function
we use Hurl to check a given URL to return a
200 OK. We loop on this function
until the check succeeds with
--retry Hurl option. Once the test has succeeded, we stop the container.
bin/integration.shto wait for the application to be ready:
We have now the simplest integration test script: it pulls a Quiz image, then starts
the container and waits for a
200 OK response.
Next, we’re going to add our Hurl tests to the script.
bin/integration.shto add integration tests:
bin/integration.shto check that our application passes all tests:
$ bin/integration.sh Starting Quiz container 48cf21d193a01651fc42b80648abdb51dc626f31c3f9c8917aea899c68eb4a12 Starting Quiz instance to be ready Testing http://localhost:8080 Wait 0s Wait 1s Wait 2s Wait 3s Wait 4s Wait 5s Running Hurl tests integration/basic.hurl: Running [1/2] integration/basic.hurl: Success (4 request(s) in 18 ms) integration/create-quiz.hurl: Running [2/2] integration/create-quiz.hurl: Success (6 request(s) in 18 ms) -------------------------------------------------------------------------------- Executed files: 2 Succeeded files: 2 (100.0%) Failed files: 0 (0.0%) Duration: 48 ms Stopping Quiz instance quiz
Locally, our test suite is now fully functional. As Hurl is very fast, we can use it to ensure that new developments don’t have regression. Our next step is to run the integration tests automatically in a CI/CD pipeline. As an example, we’re going to create a [GitHub Action]. You can also see how to integrate your tests in GitLab CI/CD here.
quiz-projectdirectory and commit the projects files:
$ git init Initialized empty Git repository in /Users/jc/Documents/Dev/quiz-project/.git/ $ git add . $ git commit -m "Add integration tests." [master (root-commit) ea3e5cd] Add integration tests. 3 files changed, 146 insertions(+) create mode 100755 bin/integration.sh ... $ git branch -M main $ git remote add origin https://github.com/jcamiel/quiz-project.git $ git push -u origin main Enumerating objects: 7, done. Counting objects: 100% (7/7), done. ...
Next, we are going to add a GitHub Action to our repo. The purpose of this action will be to launch our integration script on each commit.
name: CI on: push: branches: - main jobs: build: runs-on: ubuntu-latest permissions: contents: read steps: - name: Checkout uses: actions/checkout@v2 - name: Build run: echo "Building app..." - name: Integration test run: | curl --location --remote-name https://github.com/Orange-OpenSource/hurl/releases/download/3.0.0/hurl_3.0.0_amd64.deb sudo dpkg -i hurl_3.0.0_amd64.deb bin/integration.sh
$ git add .github/workflows/ci.yml $ git commit -m "Add GitHub action." [main 077d754] Add GitHub action. 1 file changed, 19 insertions(+) ... $ git push Enumerating objects: 6, done. Counting objects: 100% (6/6), done. ...
Finally, you can check on GitHub that our action is running:
If you use GitLab CI/CD, you can check this detailed tutorial on how to continuously run your Hurl test suite.
In less than half an hour, we have added a full CI/CD pipeline to our project. Now, we can add more Hurl tests and start developing new features with confidence!