就是這麼簡單!使用Rest-assured 測試Restful Web Services

使用 Rest-assured 測試 Restful Web Services 

轉載註明出處: http://www.cnblogs.com/wade-xu/p/4298819.html html

 

這裏向你們介紹一個測試Restful web service 的框架,叫Rest-assured.web

他提供了一系列好的功能,像DSL式的語法, XPath-Validate,  文件上傳,Specification重用, 使用代理, Spring MVC mock module測試Controllers等等,讓你在Java裏面測試Rest service 和那些動態語言Ruby, Groovy同樣靈活。json

 

目錄
       1. 前提
       2. 配置
       3. Example詳解
4. Troubleshooting 5. 參考來源

 

前提條件


  • JDK >= 1.6
  • Maven 3

 

配置Maven工程pom文件以下


<dependency>
  <groupId>com.jayway.restassured</groupId>
  <artifactId>rest-assured</artifactId>
  <version>2.3.3</version>
  <scope>test</scope>
</dependency>cookie

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.10</version>
  <scope>test</scope>
</dependency>app

 

Example


 a)  測試一個GET 請求方法,框架

請求URL : http://10.46.28.193:8080/service/v1/user/loginpost

返回JSON內容以下學習

{
    "userInfo": {
        "password": null,
        "userId": "wadexu",
        "accessSecurityCodes": "10000000000000000000",
        "firstName": "Wade",
        "lastName": "Xu",
        "status": 8,
        "officePhone": "58730",
        "email": "wadexu@test.com",
        "homePhone": "123"
    },
    "success": true,
    "error": null
}

 

測試代碼以下:測試

  @Before
    public void setUp() {
        RestAssured.baseURI= "http://10.46.28.193";
        RestAssured.port = 8080;
        RestAssured.basePath = "/service/v1";
    }

    @Test
    public void testUserLogin() {
      expect().
        statusCode(200).
        body(
          "success", equalTo(true),
          "userInfo.userId", equalTo("wadexu"),
          "userInfo.firstName", equalTo("Wade"),
          "userInfo.lastName", equalTo("Xu"),
          "error", equalTo(null)).
        when().
        get("/user/login?userName=wadexu&password=NzrmRcIfIW4=");
    }

注意我這裏請求時的參數直接塞進了URL裏, 稍後會講到如何指明參數。ui

 

b) 如何使用JSON path

仍是同上面的例子, 測試代碼以下:

@Test
    public void testUserLogin_JsonPath() {
        Response response = get("/user/login?userName=wadexu&password=NzrmRcIfIW4=");
        assertEquals(200, response.getStatusCode());
        String json = response.asString();
        JsonPath jp = new JsonPath(json);
        assertEquals("wadexu", jp.get("userInfo.userId"));
        assertEquals("Wade", jp.get("userInfo.firstName"));
        assertEquals("Xu", jp.get("userInfo.lastName"));
        assertEquals("123", jp.get("userInfo.homePhone"));
    }

 

c) 如何使用參數

Get請求是用queryParam, 若是你直接寫param,在這個case裏也能夠,Rest Assured 會自動判斷參數類型(query or form parameter), 在有些case裏, Put 或 Post 你得指明參數類型

    @Test
    public void testUserLogin_Parameter() {
        final String userName = "wadexu";
        final String password = "NzrmRcIfIW4=";

        given().
        queryParam("userName", userName).queryParam("password", password).
                expect().
                statusCode(200).
                body("success", equalTo(true), 
                      "userInfo.userId", equalTo("wadexu"), 
                      "userInfo.firstName", equalTo("Wade"), 
                      "userInfo.lastName", equalTo("Xu"), 
                      "error", equalTo(null)).when()
                .get("/user/login");
    }

 

另外,有些Post 請求URL後面是有參數的, 這時候 你能夠這樣寫

post("/reserve/{hotelId}/{roomNumber}", "My Hotel", 23);

 

或者

given().
        pathParam("hotelId", "My Hotel").
        pathParam("roomNumber", 23).
when(). 
        post("/reserve/{hotelId}/{roomNumber}").
then().
         ..

 

d) 再來看一個POST 請求, 這時候須要請求消息體body了,request body是JSON體以下:

{
"customerId": "CDICC",
"broker": "test",
"editUserId": "wadexu"
}

 

測試代碼:

    @Test
    public void testCreate() {
        final String bodyString = "{\"customerId\": \"CDICC\",\"broker\": \"test\",\"editUserId\": \"wadexu\"}";
       
        given().
        contentType("application/json").
        request().body(bodyString).
        expect().
          statusCode(200).
          body(
          "order.orderNumber", is(Number.class),
          "order.deleteDate", is(nullValue()),
          "success", equalTo(true)).
        when().
        post("/order");
    }

這時除了用到request().body 

還多加了一個header 請求消息頭 -- ContentType

set Headers 的方法有不少, 上面是其一, 你還能夠按以下方式作:

given().header("Content-Type", "application/json")
given().headers("Accept", "application/json", "Content-Type", "application/json")
 

另外 注意到指望結果的比較沒有, 這裏用到org.hamcrest.Matchers的一些方法, 由於Order number 每次不同,沒法判斷具體是多少,因此就看是不是數字就好了,刪除日期是null value

hamcrest.Matchers 裏的各類匹配器有興趣的童鞋能夠研究下, 對測試斷言頗有幫助。

 

轉載註明出處: http://www.cnblogs.com/wade-xu/p/4298819.html 

 

e) 一樣你還能夠verify HTTP Status code

由於我這個service是須要Content-Type=application/json的, 而個人case裏並無賦值給contentType, 因此返回會報錯 415

The server refused this request because the request entity is in a format not supported by the requested resource for the requested method.

 @Test
    public void testOpenOrder_error() {
        final String orderNumber = "3017";
        final String orderVersion = "1";
        final String versionType = "";
        final String editUserId = "";
        final String customerId = "";
        final String state = "";
       
        given().
        parameters(
            "orderNumber", orderNumber,
            "orderVersion", orderVersion,
            "versionType", versionType,
            "editUserId", editUserId,
            "customerId", customerId,
            "state", state).
        expect().
          statusCode(415).
        when().
        post("/order/open");
    }

 

f) Cookies 其實都大同小異了

第一個沒有set cookie 結果拋 403

"name":"Forbidden",
"detail":"The request was a legal request, but the server is refusing to respond to it. Unlike a 401 Unauthorized response, authenticating will make no difference."

@Test
public void testCookie() {
  expect().
    statusCode(403).
  when().
  get("/access");
 
  given().
    cookie("userName", "wadexu").
  expect().
    statusCode(200).
  when().
  get("/access");
}

 

g) Authentication

若是你的service須要認證,則須要設置authentication()

不然401 -- Unauthorized

@Test
public void testAuthentication() {
  expect().
    statusCode(401).
  when().
  get("/service/user");
 
  expect().
    statusCode(200).
  when().
    with().
      authentication().basic("wadexu", "123456").
  get("/service/user");
}

 

 H) Specification reuse 規範重用

 @Test
    public void testSpecReuse() {
        
        ResponseSpecBuilder builder = new ResponseSpecBuilder();
        builder.expectStatusCode(200);
        builder.expectBody("userInfo.userId", equalTo("wadexu"));
        builder.expectBody("userInfo.firstName", equalTo("Wade"));
        builder.expectBody("userInfo.lastName", equalTo("Xu"));
        builder.expectBody("success", equalTo(true));
        ResponseSpecification responseSpec = builder.build();
        
        //use this specification for test example -- a
        expect().
          spec(responseSpec).
        when().
        get("/user/login?userName=wadexu&password=NzrmRcIfIW4=");
        
        //now re-use for another example -- c that returns similar data 
        given().
            queryParam("userName", "wadexu").
            queryParam("password", "NzrmRcIfIW4=").
        expect().
            spec(responseSpec).
        when().
        get("/user/login");
    }

若是你還有更多的測試,返回指望結果又相似 則能夠繼續使用 specification, 達到重用的目的。

 

轉載註明出處: http://www.cnblogs.com/wade-xu/p/4298819.html 

 

測試運行結果以下(不包含上面每個用例):

 

 

Troubleshooting


有些類須要Static imports

參考個人以下:

import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;

import com.jayway.restassured.RestAssured;
import com.jayway.restassured.builder.ResponseSpecBuilder;
import com.jayway.restassured.path.json.JsonPath;
import com.jayway.restassured.response.Response;
import com.jayway.restassured.specification.ResponseSpecification;

import static com.jayway.restassured.RestAssured.*;

import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.*;

 

設置好你的請求url 路徑, 默認http://localhost:8080

參考個人base path(即因此請求url 前面相同的部分) 配置以下:

@Before
    public void setUp() {
        RestAssured.baseURI= "http://10.46.28.193";
        RestAssured.port = 8080;
        RestAssured.basePath = "/service/v1";
    }

 

「WARNING: Cannot find parser for content-type: text/json — using default parser.」

– 須要註冊相關的parser: e.g. RestAssured.registerParser(「text/json」, Parser.JSON);

 

參考來源


官方文檔:https://code.google.com/p/rest-assured/

 

 


羊年第一篇文章,感謝閱讀,若是您以爲本文的內容對您的學習有所幫助,您能夠點擊右下方的推薦按鈕。您的鼓勵是我創做的動力,祝你們羊年工做生活各方面洋洋得意!

相關文章
相關標籤/搜索