📜  api 测试设计原则 (1)

📅  最后修改于: 2023-12-03 15:13:27.023000             🧑  作者: Mango

API 测试设计原则

API测试是一项关键的工作,可以确保API的可靠性和稳定性。这里提供一些API测试设计原则供程序员参考。

1. 自动化测试

自动化测试可以提高测试效率和准确性,降低人工测试的成本。针对不同的API,可以使用不同的自动化测试框架,比如JUnit、TestNG等框架,或者是Swagger、Rest-assured等API测试框架。

代码示例:

@Test
public void testGetUserById() {
    given()
      .pathParam("id", 1)
    .when()
      .get("/users/{id}")
    .then()
      .statusCode(200)
      .body("id", equalTo(1));
}
def test_get_user_by_id():
    response = requests.get('https://api.example.com/users/1')
    assert response.status_code == 200
    assert response.json()['id'] == 1
2. 参数化测试

API的输入参数和输出结果可能是不同的,可以通过参数化测试来确保API在不同的输入参数和输出结果下都能正常工作。

代码示例:

@Test
@Parameters({"id", "username"})
public void testGetUserByIdAndUsername(int id, String username) {
    given()
      .pathParam("id", id)
      .queryParam("username", username)
    .when()
      .get("/users/{id}")
    .then()
      .statusCode(200)
      .body("username", equalTo(username));
}
@pytest.mark.parametrize("input,output", [
    ({"id": 1, "username": "admin"}, {"id": 1, "username": "admin"}),
    ({"id": 2, "username": "user"}, {"id": 2, "username": "user"}),
])
def test_get_user_by_id_and_username(input, output):
    response = requests.get('https://api.example.com/users/{id}'.format(**input),
                            params={'username': input['username']})
    assert response.status_code == 200
    assert response.json() == output
3. 接口覆盖率

要考虑API的测试覆盖率,尽可能地覆盖API的各种输入和输出情况,以保证API的质量和稳定性。可以使用测试覆盖率工具,如Jacoco、Coverage.py等来进行测试覆盖率的度量。

4. 上游依赖模拟

API往往依赖于其他服务或数据,为了在API测试时避免这些依赖,可以使用模拟器来模拟上游服务或数据。

代码示例:

@Test
public void testGetUserByIdAndOrderWithMock() {
    stubFor(get(urlEqualTo("/orders?userId=1"))
            .willReturn(aResponse().withBody("[{\"id\": 1, \"amount\": 100.0}]")));
    given()
      .pathParam("id", 1)
    .when()
      .get("/users/{id}/orders")
    .then()
      .statusCode(200)
      .body("id", equalTo(1))
      .body("orders[0].id", equalTo(1))
      .body("orders[0].amount", equalTo(100.0F));
}
@responses.activate
def test_get_user_by_id_and_order_with_mock():
    responses.add(responses.GET, 'https://api.example.com/orders',
                  json=[{"id": 1, "amount": 100.0}], match_querystring=True)
    response = requests.get('https://api.example.com/users/1/orders')
    assert response.status_code == 200
    assert response.json() == {"id": 1, "orders": [{"id": 1, "amount": 100.0}]}
}
5. 异常情况测试

除了正常情况的测试,还要考虑各种异常情况,比如无效的输入参数、服务不可用等。这些测试可以帮助避免API的潜在问题。

代码示例:

@Test
public void testCreateUserWithInvalidInput() {
    given()
      .contentType(ContentType.JSON)
      .body("{\"name\": \"\", \"email\": \"example.com\"}")
    .when()
      .post("/users")
    .then()
      .statusCode(400)
      .body("message", equalTo("Invalid input"));
}
def test_create_user_with_invalid_input():
    response = requests.post('https://api.example.com/users',
                             json={"name": "", "email": "example.com"})
    assert response.status_code == 400
    assert response.json() == {"message": "Invalid input"}
}