建立和维护API与其他应用程序非常相似,建立它可能是最容易的部分,但是,当架构完成时,你的工作还没有完成,接下来,需要测试API以确保其按预期运行。
使用哪些工具进行测试或一系列测试?即使你没有预先设计API,也可能需要测试API,REST Assured是一个API测试框架。
REST Assured是一种特定于Java 领域的语言,它简化了在HTTP Builder之上构建的测试和验证REST服务的过程,REST Assured支持多种请求格式的验证,并且具有非常直观的语法,使其易于学习。
当公司不断通过RESTful API提供服务时,API测试在开发中变得越来越重要,但是API测试具有挑战性,又必须正确完成,API中几乎没有存在错误的余地,它们会一直处于启动状态,具有合理的响应时间,并有效地处理负载。
想象一下Google Maps API如果发生故障。我们每天使用的许多服务都会受到影响,因为它们的核心功能都需要Google地图,对于Uber,Lyft和Airbnb来说,谷歌地图至关重要。
在下面的示例中,我们将探索REST Assured并确切了解如何在API测试中使用它。
构建
有几种方法可以实现REST Assured设置,这使得在任何项目中都可以轻松使用该框架。
Gradle用户需要添加以下行:
testCompile 'io.rest-assured:rest-assured:3.1.0'
Maven用户,使用:
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<version>3.1.0</version>
<scope>test</scope>
</dependency>
请注意,上述方式会包括XmlPath和JsonPath。
在下面的示例中,我们将仅使用JSON,尽管Rest Assured也支持XML。
让我们测试一些API
设置完成后,让我们为Spotify API创建一个Java测试类,但不提供令牌。此请求会因返回401 状态代码而失败,因为Spotify API需要令牌,正如所料,REST Assured将通过使用断言比较预期结果和API实际查询的结果来验证我们的查询。
import io.restassured.RestAssured;
import io.restassured.response.Response;
import org.testng.Assert;
public class RestTest {
static String link = "https://api.spotify.com/v1/artists/1vCWHaC5f2uS3yhpwWbIA6/albums?album_type=SINGLE&offset=20&limit=1";
public static void main(String[] args) {
Response response = RestAssured.get(link);
response.then().assertThat().statusCode(200); //This fails
response.then().assertThat().statusCode(401); //This passes
}
}
这里有几点需要注意。首先是语法,很容易理解,因为它更接近自然语言,可能遇到的其他语法糖包括 given, then和 expect。
此时,我们将使用ReqRes执行POST和DELETE请求。ReqRes能模拟具有虚假数据的API,但却是真实的响应,因此,我们不必从头开始构建一个测试应用了;POST将使我们能够创建新资源,并且如名称所示,DELETE将删除资源。
// POST REQUEST
import io.restassured.RestAssured;
import io.restassured.response.Response;
import io.restassured.specification.RequestSpecification;
import org.testng.Assert;
public class RestTest {
static String json = "{place: 'earth', message: 'Hello'}";
static String link = "https://reqres.in/api/users";
public static void main(String[] args) {
RequestSpecification spec = RestAssured.given();
spec.body(json);
Response result = spec.post(link);
result.then().assertThat().statusCode(201); // Success
System.out.println(result.asString()); // Response body
}
}
现在我们已在服务器上成功创建了一些数据,断言确保数据确实成功写入。请注意,成功POST请求的相应状态代码是201,而不是200。
// DELETE REQUEST
import io.restassured.RestAssured;
import io.restassured.response.Response;
import io.restassured.specification.RequestSpecification;
import java.util.concurrent.TimeUnit;
import org.testng.Assert;
public class RestTest {
static String link = "https://reqres.in/api/users/10";
public static void main(String[] args) {
RequestSpecification spec = RestAssured.given();
Response done = spec.delete(link);
done.then().assertThat().statusCode(204);
System.out.println(done.getTimeIn(TimeUnit.NANOSECONDS));
}
}
这个删除请求会失败的,因为我们无法删除服务器上的数据; 因此,返回204(无内容)。但是,我们得到请求所需的时间(以纳秒为单位),当你想知道API的执行速度时,这种办法可以派上用场。
这些示例只是可以使用REST Assured执行的一些简单操作,不仅仅限制在JSON,也能为其他格式的API创建更复杂的自动化测试 。