Issue API calls and verify API responses inside a Reflect test.
With Reflect’s API testing feature, you can generate API requests and validate API responses as part of a larger end-to-end regression test, all without writing code. Supported actions include inserting dynamic values into an API request, extracting values out of an API response, and asserting on various aspects of the API call, including its HTTP response code.
While there are many potential cases for API testing, what makes Reflect unique is that you can issue API calls alongside UI actions, and share state across these test steps. Below are a few common use cases where combining API and UI actions can come in handy:
In many cases, end-to-end tests depend on pre-existing data within the system-under-test. For example, in order to automate testing of a “Delete” action within your web app, you’ll first need to ensure that an entity already exists which can be deleted. These types of destructive test cases are often hard to automate, since the state of the application changes after every test run, and must somehow be reset.
One use of Reflect’s API Testing feature is to issue API calls to set up test data as part of a larger end-to-end test. When testing a destructive action like in the example above, we could issue an API call at the beginning of the test which creates a new entity, and extracts some unique identifier for that entity from the API response. We can then record the steps to search for that entity in the UI using the identifier that was extracted from the API response, and finally delete the entity using the UI.
For modern web apps, system state is often stored across a variety of disparate systems. If you’re using a microservice architecture, state will be stored across a set of services and exposed via APIs. In addition, third-party integrations such as Stripe for billing or Auth0 for user identity information often act as their own systems of record.
Using Reflect’s API testing feature, you can validate that the proper updates have been made to these first-party and third-party systems after completing an end-to-end workflow by issuing API calls and validating the API response.
For example, when testing an end-to-end test that adds a payment method, you can end the test by making API calls to
Stripe’s API to validate that a relevant Customer
and PaymentMethod
object has been created.
To add an API call to your test, start a Recording session and click the Add an API Call button:
After clicking this button, a new section will be displayed that provides options for declaring an API request and validating its response:
Dynamic values can be inserted anywhere within the request URL and request body, and can be extracted from the response body. In order to reference a dynamic value, the value must first be assigned to a Variable in an earlier test step or in an Execution Override passed at the outset of the test.
There are two ways to assign a dynamic value:
After populating the necessary fields for the API request, you can generate an API response by clicking the Send Test Request button on the top right of the screen. This will generate an API request using the values you’ve specified and will populate the response in the Validate Response section.
After saving and executing the test, Reflect will issue that same API call and validate its response against the criteria you have specified. If one or more validations fail, or if the API response times out, the test step will be marked as failed and information about the failure (including the API response that was received, if any) will be included in the test run details.
Once an API response is generated, either via the Send Test Request button or when viewing a completed test run, you can extract values from the response by clicking on the relevant fields within the Validate Response section.
When you select a property in the response, you’ll be prompted to choose from a number of options, including assigning the property value to a variable, or making an assertion on the property value. When you’ve made your selection, the property will be highlighted and an editable “selector” will be generated. For JSON responses, the selector represents an associative array or dictionary that identifies the property within the context of the JSON document. For XML responses, the selector will be provided in XPath 1.0 format.
Consider the example API response below:
|
|
Here is how Reflect’s JSON selectors can reference various properties within this API response:
["totalCount"]
- Returns 2
["users"][0]["name"]
- Returns "John Doe"
["users"][1]["isActive"]
- Returns true
In addition to supporting responses in JSON format, Reflect also supports validating API calls in XML format. Similar to JSON responses, values in an XML response can be extracted simply by clicking on the relevant attribute or element value. After selecting the extraction or assertion rule, the attribute or element value will be highlighted and an editable XPath 1.0 selector will be generated.