用Java测试REST API
最后修改:2021年1月21日
1.概述
本教程侧重于基本原理和力学使用Live Integration测试测试REST API(带有JSON有效载荷)。
主要目标是提供一个关于测试API基本正确性的介绍-我们将使用最新版本的github休息api.对于例子。
对于内部应用程序,这种测试通常会在连续集成过程中作为延迟步骤运行,在已经部署后消耗REST API。
在测试REST资源时,通常存在几个正交职责,测试应专注于:
- http.响应代码
- 其他http.头在响应中
- 这有效载荷(JSON,XML)
每个测试应该只关注单一的职责,并包含单一的断言。专注于清晰的分离总是有益处,但是在做这种黑匣子测试时更重要,因为一般倾向是在一开始就编写复杂的测试场景。
整合测试的另一个重要方面是坚持单一水平的抽象原则- 测试中的逻辑应以高电平写入。创建请求,将HTTP请求发送到服务器的详细信息,不应通过实用程序方法完成处理IO等。
进一步阅读:
2.测试状态代码
@test public void voideduserdoesnotexists_whenuserinfoisretricle_then404isreceive()抛出client procolocoxception,ioException {//给定字符串名称= randomstringutils.randomalphet(8);httpurirequest请求= new httpget(“https://api.github.com/users/”+ name);//当httpresponse httpresponse = httpclientbuilder.create()。build()。执行(请求);//然后assertthat(httpresponse.getstatuslineLine()。getstatuscode(),等于(httpstatus.sc_not_found));}
这是一个相当简单的测试 -它验证了一个基本的快乐路径正在运作,而不会给测试套件增加太多的复杂性。
如果无论出于何种原因,它会失败,那么无需查看此URL的任何其他测试,直到它是固定的。
3.测试媒体类型
@test public void todrequestwithnoacceptheader_whenrequestisexecuted_thendefaultresponseContenttypeisjson()抛出client procolocoxception,ioException {//给定String jsonmimetype =“application / json”;httpurirequest请求= new httpget(“https://api.github.com/users/eugenp”);//当httpresponse响应= httpclientbuilder.create()。build()。执行(请求);// then string mimetype = contentType.getOrdefault(response.getentity())。getMimetype();assertequals(jsonmimetype,mimetype);}
这确保了响应实际上包含了JSON数据。
正如你可能已经注意到的那样,我们关注测试的逻辑进展-首先是响应状态码(以确保请求是OK的),然后是响应的媒体类型,只有在下一个测试中我们才会查看实际的JSON负载。
4.测试JSON有效负载
@Test public void givenUserExists_whenUserInformationIsRetrieved_thenRetrievedResourceIsCorrect() throws ClientProtocolException, IOException{//给定HttpUriRequest request = new HttpGet("https://api.github.com/users/eugenp");//当httpresponse响应= httpclientbuilder.create()。build()。执行(请求);// Then GitHubUser resource = RetrieveUtil。retrieveResourceFromResponse(响应,GitHubUser.class);为了(“eugenp”,匹配器。是(resource.getLogin()));}
在这种情况下,我知道github资源的默认表示是json,但通常是
内容类型响应的标题应与接受请求头——客户端通过请求特定类型的表示接受,这是服务人员应该尊重的。
5.公用事业公司进行测试
我们将使用Jackson 2将原始JSON字符串联原体中的java实体:
public class GitHubUser {private String login;//标准的getter和setter}
我们只使用了一个简单的工具来保持测试的干净、可读性和高层次的抽象:
公共静态 t retreveresourcefromresponse(httpresponse响应,class clazz)抛出ioException {string jsonfromresponse = entityutils.tostring(response.getentity());objectMapper映射器= new objectmapper().configure(deserializationfeature.fail_on_unknown_properties,false);返回mapper.readvalue(jsonfromresponse,clazz);}
请注意,杰克逊忽略了未知的财产GitHub API正在发送我们的方式 - 这只是因为GitHub上的用户资源的表示变得非常复杂 - 我们不需要此处的任何信息。
6.依赖关系
这些工具和测试使用了以下库,这些库都可以在Maven中心中使用:
- httpclient
- 杰克逊2
- Hamcrest(可选)
7.结论
这只是完整的整合测试套件应该是什么的一部分。测试专注于确保其余API的基本正确性,不进入更复杂的情景,
例如,以下未涵盖以下内容:API的可发现性,相同资源的不同表示的消耗等。
可以找到所有这些示例和代码片段的实现在github上-这是一个基于maven的项目,所以它应该很容易导入和运行。