Now when we think of testing tools, we normally think of one tool in its entirety. But in the modern open-source development world and the benefit of many different software libraries to share, sometimes the best approach isn’t to focus on one tool, but rather on different libraries that can be used together to create something more effective.
And that is the case with the tools I will be talking about in this blog post. Axios, Mocha, and Chai, while each effective in their own right, are especially effective when used together as they each represent an important part of what makes an effective automation tool work. Axios handles the management of HTTP requests between the tool and different APIs, Mocha is used to shape the framework and bring basic test automation standards into play, while Chai contains an assertion library that allows for validation of the API messages.
Together, they allow teams to quickly build an effective framework that can be used to automate APIs and by making use of each different library, be left with a solid open-source set of tooling that – while not as complete as a bigger tool – is incredibly effective and can be further and easily enhanced through many other libraries that can give it additional features (like using Mochawesome for reporting).
This is all possible due to the rich JavaScript ecosystem that exists and the many developers that make use of supporting it. All you need to do is add each library into a package.json file and run a package installer and you will be able to use them together in unison quite effectively. This has led to the development of these different libraries that have each been built to solve unique problems but have now inadvertently got tied together when it comes to test automation. While working with a combination of different open-source libraries might sound risky or problematic from a security and maintenance perspective, the benefits of using them together far outweigh this. For a start, because they’re all node.JS based on themselves, they can easily be run in containers, taking up a small footprint as other tools and easily integrating into the respective development pipelines.
It’s also the simplicity of scripting that makes it a popular choice as once configured, it is relatively easy to get APIs automated in a scalable way. Additionally, as continued work happens on each library, it’s easy for teams to update and maintain these libraries accordingly. The flip side though is that it does require knowledge of a JS-based language like JavaScript or Typescript, though it is possible to pull in some other languages or syntaxes through various plug-ins. It also requires a fairly strong coding mindset to get comfortable with, something which may put off many testers, despite the speed and ease of automation it offers.
I break down the features that each library offers below:
Axios:
JavaScript library used for making HTTP requests from web browsers and Node.js. It provides a simple and consistent API for performing asynchronous HTTP requests, handling request and response data, and managing headers and query parameters.
Axios supports promises, which makes it easy to work with asynchronous code using async/await or .then() syntax.
It's commonly used in frontend applications to fetch data from APIs, send data to servers, and manage communication between the client and server.
Mocha:
Mocha is a widely used testing framework for JavaScript, often used in both frontend and backend development. It provides a flexible and extensible environment for writing and running tests.
Mocha supports various testing styles, including BDD (Behaviour-Driven Development) and TDD (Test-Driven Development). It allows you to structure your tests using describe and it blocks to create test suites and test cases.
While Mocha provides the testing structure, it doesn't include built-in assertion functions. Instead, Mocha can be paired with assertion libraries like Chai to perform assertions and expectations in tests.
Mocha's flexibility allows you to integrate with various assertion libraries, mocking tools, and test runners, making it a popular choice among developers.
Chai:
Chai is an assertion library for JavaScript that works well with testing frameworks like Mocha, Jasmine, and more. It provides a range of assertion styles, allowing developers to choose a style that aligns with their testing preferences.
Chai supports three assertion styles: should, expect, and assert, each with its own syntax for making assertions about values, behaviors, and conditions in your code.
Chai also includes a "BDD" interface that reads like natural language, making your tests more expressive and readable.
Beyond its built-in assertion functions, Chai also supports plugins and extensions that add additional assertions and behaviors.
As mentioned they may have all developed separately, but developers quickly identified how they could work together in unison to build effective test automation frameworks.
Here's a brief overview of how these libraries have been used together for API automation:
Early 2000s to Mid-2010s:
JavaScript and web development underwent significant advancements during this period, with the introduction of AJAX (Asynchronous JavaScript and XML) enabling dynamic content loading without full page refreshes.
As APIs gained prominence, developers needed a way to make HTTP requests from their applications. Libraries like jQuery's $.ajax provided this functionality, but these libraries were primarily used for frontend development and lacked the sophistication required for automated testing.
Mid-2010s:
Axios emerged as a dedicated library for making HTTP requests, initially focusing on browser-based applications and later expanding to Node.js environments.
As applications grew in complexity, the need for robust testing tools became more evident. Mocha gained popularity as a versatile testing framework, and Chai emerged as a flexible assertion library.
Late 2010s to Present:
The combination of Axios, Mocha, and Chai became a popular choice for automating API testing due to their individual strengths and compatibility.
Axios simplified making API requests, handling responses, and managing asynchronous code.
Mocha provided a testing framework that allowed developers to structure and run tests with ease.
Chai's various assertion styles and natural language interfaces contributed to more readable and expressive tests.
API-Driven Development:
As APIs became a fundamental part of modern web applications, automating API testing became crucial to ensure the reliability of these applications.
Developers adopted tools and libraries that facilitated the creation of automated tests that could interact with APIs, validate responses, and verify the behavior of API endpoints.
Integration and Ecosystem:
Developers often chose Axios to make actual API requests within their tests. Mocha provided the framework for organizing and running tests, while Chai's assertion styles allowed for clear and expressive assertions about API responses.
The flexibility of Mocha and Chai allowed developers to integrate them seamlessly into their existing projects, including API automation workflows.
Testing Best Practices:
The combination of Axios, Mocha, and Chai enabled developers to follow best practices for API automation, such as testing different HTTP methods, status codes, response payloads, and error handling.
I want to break down the pros and cons of each library too, to better help you assess the effectiveness of this strategy and tooling in your own space:
Using Axios:
Pros:
Simplicity and Consistency: Axios provides a simple and consistent API for making HTTP requests, abstracting away the complexities of dealing with different browsers' XMLHttpRequest and Node.js's http module.
Promises and Async/Await: Axios supports promises, making it easy to work with asynchronous code using async/await or .then() syntax. This leads to more readable and maintainable code.
Interceptors: Axios allows you to define request and response interceptors, which can be useful for handling global error handling, authentication, and other middleware-like functionality.
Browser and Node.js Compatibility: Axios works both in browser environments and Node.js, providing a unified way to handle HTTP requests in both client-side and server-side code.
Cons:
External Dependency: While Axios is a powerful library, using an external dependency for HTTP requests might add a layer of complexity to your project, especially for smaller applications.
Size: Axios has a sizeable footprint due to its feature set, which might impact the overall bundle size of your application, especially if you're concerned about optimizing for performance.
Using Mocha:
Pros:
Flexibility and Extensibility: Mocha is highly flexible and can be customized to suit various testing styles and needs. It's not tied to a specific assertion library or mocking tool, allowing you to choose components that work best for your project.
Test Organization: Mocha's describe and it blocks provide a clear and organized structure for writing tests. It's easy to create test suites and cases, making it suitable for projects of various sizes and complexities.
Support for Various Assertion Libraries: Mocha can be used with different assertion libraries, such as Chai, should.js, and assert, giving you the freedom to choose the assertion syntax that fits your style.
Integration with Test Runners: Mocha integrates well with test runners like Karma and Jest, allowing you to incorporate it into your existing development workflow.
Cons:
Configuration Overhead: While Mocha's flexibility is an advantage, it can also introduce configuration overhead, especially when setting up assertion libraries, mocking tools, and other plugins.
Learning Curve: The flexibility of Mocha might lead to a steeper learning curve for newcomers, as they need to understand how to structure and configure tests effectively.
Using Chai:
Pros:
Multiple Assertion Styles: Chai offers various assertion styles, allowing developers to choose a style that matches their coding and testing preferences, whether it's the expect syntax, should chaining, or assert syntax.
Readability: Chai's "BDD" interface reads like natural language, making tests more expressive and readable, which can aid in understanding the behavior being tested.
Custom Matchers: Chai supports custom matchers and plugins, allowing you to extend its functionality to suit specific testing needs.
Cons:
Integration with Testing Framework: Chai requires integration with a testing framework like Mocha or Jasmine. While this integration is generally straightforward, it adds an extra layer of complexity compared to assertion libraries that are tightly coupled with a testing framework.
Choice Paralysis: Having multiple assertion styles to choose from might lead to choice paralysis, especially for teams where consistent coding practices are important.
And in using a toolset made up of different frameworks, it’s inevitable that you will run across each different set of pros and cons which may initially make it tricky to work with. These can be quite easily overcome though with a proficient testing team and if you can, then the remaining benefits of having an automation framework that is easy to set up and fast to execute make up for it, especially in testing teams tightly integrated into the development process and looking to get automation out quickly.
When to select Axios, Mocha, and Chai as test automation tools:
When you are using a node.JS-based framework and need API testing integrated directly into the CI/CD process
When you have a highly proficient testing team with good development skills that is comfortable working with open-source libraries
When you need to prioritize the speed of scripting and execution without tying yourself to expensive tooling
In summary, using Axios, Mocha, and Chai offers various benefits for different aspects of development, such as making HTTP requests, structuring and running tests, and writing expressive assertions. However, it's essential to consider the specific needs of your project, team familiarity, and overall development goals when deciding whether to incorporate these libraries into your framework.
Comments