使用REST Assured测验验证REST服务

18-09-14 banq
              

建立和维护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>
<p>

请注意,上述方式会包括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
    }
    
}
<p>

这里有几点需要注意。首先是语法,很容易理解,因为它更接近自然语言,可能遇到的其他语法糖包括 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
    }
    
}
<p>

现在我们已在服务器上成功创建了一些数据,断言确保数据确实成功写入。请注意,成功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));       
        
    }
    
}

<p>

这个删除请求会失败的,因为我们无法删除服务器上的数据; 因此,返回204(无内容)。但是,我们得到请求所需的时间(以纳秒为单位),当你想知道API的执行速度时,这种办法可以派上用场。

这些示例只是可以使用REST Assured执行的一些简单操作,不仅仅限制在JSON,也能为其他格式的API创建更复杂的自动化测试 。

APIs, Be REST Assured · Sweetcode.io