Java后端测试实践+放心

在上一篇文章中,我分享了我在Robot Framework上的自动化经验。 现在,我们将讨论在Kotlin上测试项目API的稍微不同的方法。

利用自由选择技术堆栈的优势,并依靠尝试“战斗中”的新事物的欲望,我转向了Rest-Assured。 在没有困难的情况下,我和我的同事们进行了测试,并且由于开发了该方法,我们将其记录在此类任务的关键任务列表中。

图片

(图像用作模仿)

一切始于这样一个事实,即要求在广告技术领域的一个新项目中自动化测试API。 我们做了Campaign Manager,DMP以及与第三方系统的一些集成。 测试人员的任务非常简单:自动进行烟雾测试,以进一步集成到CI中,并持续监视此API的状态,因为第三方系统与之相关,正确的操作至关重要。 在这种情况下,不需要验证业务逻辑,因为被测试的服务本质上是代理接口。

为什么要放心?


从测试自动化的角度来看,我们设法在各个领域工作-UI,Web,移动,桌面,后端,REST API,SOAP。 上一个项目为我们提供了很多有关Robot Framework的经验,因此使用它是最合乎逻辑的。 大多数测试团队都很熟悉他,如果需要紧急更换,这将很快且几乎没有痛苦地完成。 但是做出了另一个决定。

首先,项目本身是用Kotlin编写的,并使用Gradle构建。 同时,在设计阶段,自动测试决定不分配单独的项目。 如前一篇文章的评论中所述,将Java(Kotlin)和Robot Framework结合在一起是一个很大的痛苦,因此,提到RF毫无意义。 另外,回顾使用机器人的过程,我有兴趣尝试其他方法。 此外,在这个项目中,我们可以独立选择技术堆栈-企业没有设置自己的条件。

为了寻求想法,我求助于我们的开发团队以及测试人员,CTO建议研究Rest-Assured( rest-assured.io )。 在我阅读了开源文档和样本测试之后,Rest-Assured提出的方法对我来说似乎很有吸引力。 这意味着以JSON形式从后端接收响应,我们将其反序列化为良好的旧Java对象。

此外,通过这种结构,您可以像处理普通对象一样工作。 结果,我们有了一种完全正常的面向对象的方法来验证API响应与所描述对象结构的对应关系。 另外,我们还对响应结构进行了快速的防故障测试-如果通过反序列化API响应收到的对象的字段数或名称不同,则即使在检查具有反序列化错误的数据之前,测试也将放弃。 因此,我们将了解是否需要根据新的API要求修复后端或更新测试。 在我们的案例中,这很重要,因为如上所述,许多第三方子系统都与API绑定在一起。

为了准确起见,我注意到可以在RF上获得大约相同的防故障测试,但方式略有不同。 但是,今天的故事并非如此。 就个人而言,对我而言,与具有某些字段和方法的实体一起从Rest-Assured进入是更加方便和易于理解。

羽毛测试


在开始在实际项目中使用堆栈之前,我决定在小型CRUD服务上尝试使用它。 为了不立即犯下自己的错误,我决定在该堆栈中搜索最佳实践,并迅速找到Philip Hauer的文章 ,他在REST-Assured上反映了他的自动化经验。 在研究了这篇文章之后,编写服务测试的工作版本并不困难。 他们证明简单,易于阅读和理解。

去战斗!


该项目开始了,当描述了第一个响应结构时,开始了测试文档的准备和自动测试的编写。 要了解全局,我将提供完整的自动测试堆栈:

  • 爪哇
  • JUnit4-测试脚本的执行和参数化(标准注释@Parametrize),
  • 放心-建立和执行查询,
  • AssertJ-验证接收到的值,
  • 魅力-报告大楼,
  • 摇篮-组装
  • 杰克逊-反序列化。

编写第一个测试时,适当的参数化问题变得很明显。 传达简单的数据值和预期结果似乎效率极低且难看。 在假期之前,我没有时间解决这个问题,但是在我不在的时候,我的同事们才解决了这个问题。 为了美观,易于阅读的参数化,他们决定创建一个具有添加,接收和删除对象参数功能的基类,从该基类继承其对象用于调用相应API方法的所有类。

图片

这实际上允许即时创建必要的数据并在测试参数中传输它们。

图片

Rest-Assured允许您反序列化对所需类的响应。 使用杰克逊将得到的答案分解为先前已知的结构。 反序列化的类看起来尽可能简单-描述了所有期望的字段及其类型。

图片

此外,对象的简单工作以及特定字段及其值的声明仍在继续。
我在这种方法中碰到的最困难和最不明显的事情是无法将null作为参数之一传递给Rest-Assured(结果是NullPointerException的下降)。 显然,这是一个已知的问题,但是开发人员不会纠正这种情况,建议您将该字段发送为空或完全不发送。 在项目基础准备就绪的阶段,我们已经面对了这个问题,只剩下添加测试类了。 因此,我们只是略微更正了代码。

总的来说,我喜欢这种方法。 奇怪的是,经过一段时间后,它开始应用于另一个客户的项目(尽管不是我们的供应)。 然后,将用于自动化测试API(JUnit + AssertJ + Rest-Assured)的组装堆栈放入Java / Kotlin项目的关键堆栈类别中。 在Python中,撤消它是违反直觉的,因为开发和测试能力最好重叠。

还值得注意的是,该解决方案的优点之一是其可伸缩性和对复杂逻辑的适应性。 这意味着它最适合描述大型对象,干净的代码和块体系结构,有单独的部分负责以可读形式准备,发送和接收数据以及随后的数据符合性验证的真正项目,一些条件。 在小型项目中,所有这些都是毫无意义的。

总结


在大约一个月的时间里,我们能够自动化约250项测试,并提供所需的覆盖范围。 当然,在自动化过程结束之后,将为每个人举行一次内部演示,以便员工对完成的工作有一个想法,并可以从该项目中获得的经验中学习。

文章作者:德米特里大师

PS:我们在Runet的多个站点上发表文章。 订阅我们在VKFBTelegram频道上的页面,以查找有关我们所有出版物和其他Maxilect新闻的信息。

Source: https://habr.com/ru/post/zh-CN427307/


All Articles