当我初次为微服务编写测试时,该微服务的API是根据JSON-RPC协议实现的,我意识到为json元素构建质量检查比我以前想象的要困难得多。
以下是一个简单的示例。
收到来自该服务的回复:
{ "result": 12, "id": 46929734, "jsonrpc": "2.0" }
您需要检查的内容:
- 响应包含一个jsonrpc元素,其值为2.0
- 响应包含一个id元素,其值等于请求中传递的类似元素,目前,它是46929734
答案包含元素
“结果” ,其值为
12如何使用Java + TestNG + Gson进行检查:
Assert.assertTrue(response.has("result")); Assert.assertTrue(response.has("jsonrpc")); Assert.assertTrue(response.has("id")); Assert.assertTrue(response.get("result").isJsonPrimitive()); Assert.assertTrue(response.get("jsonrpc").isJsonPrimitive()); Assert.assertTrue(response.get("id").isJsonPrimitive()); Assert.assertEquals(response.get("result").getAsInt(), 12); Assert.assertEquals(response.get("jsonrpc").getAsString(), "2.0"); Assert.assertEquals(response.get("id").getAsInt(), 46929734);
这时,“为什么会有这么多的断言?”这个问题可能在脑海中浮现。 是的,实际上,在测试时,您只对最后三个断言的组感兴趣,它们检查响应中元素的json值,如果它们通过,则答案符合期望。 但是,如果测试失败了怎么办? 考虑一下这种测试失败的几种可能原因:
- 答案->
{ "result": 12, "id": 46929734, "jsonrpc": "1.0" }
来自TestNG的错误-> java.lang.AssertionError:预期为[2.0],但发现为[1.0]
他们等待“ 2.0” ,得到“ 1.0” -一切都清楚了。
- 答案->
{ "result": 12, "id": 46929734, "jsonrpc": {} }
来自TestNG的错误-> java.lang.UnsupportedOperationException:JsonObject
他们试图将元素解析为字符串,这在响应中绝对意外地被当作对象接收。
- 答案->
{ "result": 12, "id": 46929734 }
来自TestNG的错误-> java.lang.NullPointerException
我们试图将答案中没有的元素解析为字符串。
在第一个示例中,一切都很好。 该错误是可以理解的,实际值和期望值可以立即看到。 但是第二个和第三个示例不能为此夸口。 这样的下降需要测试人员花费时间来分析原因。 借记这样的表面错误很困难。 需要花费一些时间来了解测试尝试解析的特定元素,试图解析的方法以及该元素在答案中的实际外观。 您甚至可能必须在本地重新启动测试,这仅仅是因为它可能比从测试程序集的日志中收集所有必要信息更快。
如此大量的检查,需要编写它们并以最新状态提供支持,这让我非常沮丧,因此我创建了一个单独的库,在我看来,我在其中收集了json元素的所有必要检查。 使用库需要上述json的覆盖范围和详细信息的级别是三行,而不是九行。
Gassert.verifyInteger(response, "result", 12); Gassert.verifyString(response, "jsonrpc", "2.0"); Gassert.verifyInteger(response, "id", 46929734);
该库实现用于检查的方法:
- 所有原始类型的元素,包括嵌套和非嵌套,带有值检查和不带有
- JsonObject,嵌套和不嵌套,带有值检查和不带有
- JsonArray,嵌套和不嵌套,带有和不带有值检查
- JsonNull元素嵌套且没有
- 数组内的元素类型
- 预期元素数组的内容
- 阵列尺寸
- 对象尺寸
在所有级别的验证中,相对于TestNG默认提供的错误,都会实现更详细的错误。
再次考虑测试失败的可能原因:
- 答案->
{ "result": 12, "id": 46929734, "jsonrpc": "1.0" }
来自Gassert- > java.lang.AssertionError的错误:元素[jsonrpc]验证失败。 预期[2.0]但发现[1.0]
- 答案->
{ "result": 12, "id": 46929734, "jsonrpc": {} }
来自Gassert的错误-> java.lang.AssertionError:元素[jsonrpc]不是JsonPrimitive。 没想到找到[true],但发现[false]
- 答案->
{ "result": 12, "id": 46929734 }
来自Gassert的错误-> java.lang.AssertionError:Json不包含元素:[jsonrpc]。 没想到找到[true],但发现[false]
同样,大多数检查方法都使用附加的字符串参数来重载,该参数在断言的情况下将被添加到所显示错误的文本中。 例如,可以使用此功能来显示响应的完整内容或错误的请求+响应。
该库位于公共github存储库中,并且也已添加到maven存储库中。
马文GithubAPI文档