Manuel Touriño March 2, 2018 - 6 mins read Implementing tests in CI It was never so easy Continuous integration (CI) is now becoming a standard in all software projects. With this, a pipeline is executed for each new feature or change in code that is made, and this allows you to carry out a series of steps to ensure that nothing has been “broken”. One of the main steps that needs to be undertaken in the CI is the implementation of tests, both unit tests and regression tests. The latter can be done in the nightly build that Clarive is responsible for launching on a daily basis, at the time that we pre-define within our Releases. Unit tests must be run whenever there has been any change in the code. This brings us to our first step. The unit tests must be run with each change in source code using a transfer (Continuous Integration) and the tests will be launched in the nightly builds of each new Release. This will ensure that the new version of our product will go onto the market without any bugs or problems in the features that worked well in the current versions. At the end of this post the reader should know how to: – Integrate tests into a Clarive rulebook. – Publish files in an artifact repository. – Send notifications to users. Ready to start To start this step-by-step guide you need a copy of Clarive installed on your server (you can request a 30-day trial). Overview For this post, we will use the following workflow: 1- User commit tests. 2- Clarive runs rulebook. 3- Mocha run tests. 4- Clarive post a message in Slack with the report. For the first part of the development, we will assume that the developer has already written his tests. In this example we will use a simple “Hello world” and some example tests that you can find here and which will use the library expect.js, which will be installed during the running of the rulebook. Workspace files: In this example within our git repository we have the following file structure: ├── .clarive.yml ├── package.json ├── src │ ├── add.js │ ├── cli.js │ ├── divide.js │ ├── helloWorld.js │ ├── multiply.js │ ├── sort.js │ └── subtract.js └── test ├── helloWorld.tests.js ├── test-cli.tests.js └── test.tests.js .clarive.yml: The rulebook file that Clarive runs package.json: NPM configuration file. Within this file we have defined a command to run the tests that are found in the test folder: "scripts": { "test": "mocha --reporter mochawesome --reporter-options reportDir=/clarive/,reportFilename=report,reportPageTitle=Results,inline=true" }, src: Folder where we find the source code. tests: Folder where the test files are located. Writing a rulebook The rulebook will be responsible for running the tests and generating a report to notify the user of the results of the tests. First phase: Running the tests As we can see in the file skeleton clarive.yml, there is a step named TEST that we will use to run the tests: test: do: - log: level: info msg: The app will be tested here But first, let’s define some global variables: vars: - workspace: "${project}/${repository}" - server: https://<my-clarive>.clarive.io - art_path: ${server}/artifacts/repo/test-reports We can see from the code that we are going to use node.js with mocha, chai and expectjs as libraries to run the tests. And thanks to Docker images, we can use a container with mocha and chai already installed, and this means that you only need to install expectjs using the rulebook. We can now specify the Docker image we’re going to use during this TEST phase and then install the expectjs library from our working directory and, finally, update our package.json: test: image: mocha-chai-report do: - shell: cmd: | cd ${workspace} npm install expect.js npm install Next, we just need to run the tests. As we have already defined the command to run the tests in our json package, we only need to run npm test: test: image: mocha-chai-report do: - shell: cmd: | cd ${workspace} npm install expect.js npm install npm test Second phase: Publish report When you finish running the tests, an HTML report will be generated with all the results, thanks to the mochawesome library installed in the Docker image. We will now publish this report in our artifact repository: - publish_report = publish: repository: Test reports from: 'report.html' to: "test-reports/{{ ctx.job('name') }}/" - log: level: info msg: "Report generated successfully!" Now, we are now going to complete the POST step. During this step we will inform the users that we want to complete the deployment. Third phase: Notifications We need to post the message in Slack, with a link to the report. To do this, we will have to have our WebHook configured in Slack and in Clarive: Now all that remains is to add the sending of the message to the POST step: From the Slack API any user can configure their own messages. In this case we have configured a message in which the user, on receiving the message, will be able to access the report from the same channel: - slack_post: webhook: SlackIncomingWebhook-1 text: ":loudspeaker: Job *{{ ctx.job('name') }}* finished." payload: { "attachments": [ { "text": "Choose an action to do", "color": "#3AA3E3", "attachment_type": "default", "actions": [ { "name": "report", "text": "View test report :bar_chart:", "type": "button", "style": "primary", "value": "report", "url": "${art_path}/test-reports/{{ ctx.job('name') }}/report.html" }, { "name": "open", "text": "Open Monitor in Clarive", "type": "button", "value": "open", "url": "${server}/r/job/monitor" }] } ] } Lets make continuous integration! Using Clarive, we can create a Story where we will attach all the code. If we haven’t already created a Project, we can create one using the Admin panel: Then we create a repository of artifacts (a public one in this case): Once we have carried out the previous steps we will create the Story in Clarive: We’ll now change the state to “In Progress” and Clarive will automatically create a branch in the repository: From the console we’ll clone the repository and change to the branch we’ve just created: We’ll now place all our files in this branch and push them to the repository: Clarive will automatically generate the deployment: After finished, we will received the notification on the Slack channel that we’ve selected: Finally, we can check test report in the artifact repository. Next Steps: In Clarive – After making this first contact with Clarive, our Story can be assigned to a Release (one that was previously created from the release menu) and, after changing the state to “Ready”, the developed feature will be automatically merged into the branch of therelease. In Rulebook – Well, this is a simple example. The rulebook can be as complex as the user wants it to be, for example, by adding if statements, adding elements in the different deployments. For example, if something has gone wrong, create a new Issue in Clarive automatically, only run tests if the “tests/” folder has been modified in the commit…the possibilities are limitless!. Visit our documentation to learn more about the features of Clarive. Share this:Click to print (Opens in new window)Click to share on LinkedIn (Opens in new window)Click to share on Twitter (Opens in new window)Click to share on Google+ (Opens in new window)Click to share on Facebook (Opens in new window)