开源:用于Android的CI / CD和Avito测试基础架构

我们将Avito移至Android开源基础结构:Gradle插件,仿真器和测试库。我们的代码将有助于CI / CD的自动化,也将有助于自动测试的编写和支持。

在这篇评论文章中,我们将解释为什么我们决定开放我们的工作,涉及项目中最重要的库,并确定新问题的出路。我们将在以下材料中详细分析各个库,Gradle插件以及我们的开发方法。



我们是谁,我们做什么


我们正在Speed平台团队中致力于Android行业。我们有四个人:
Seryozha Boishtyan
高级工程师
Twitter帐户


Dima Voronin
首席工程师
Twitter帐户


Zhenya Krivobokov
高级工程师
Twitter帐户


Daniil Popov
高级工程师
Twitter帐户


我们负责将所有Avito Android应用程序中的更改更快地交付给用户。我们的责任范围包括:

  • 项目的本地工作:这样,所有组件都可以快速组装在一起,并且IDE不会变慢。
  • CI管道:测试,所有可能的检查。
  • CD:发布工程师的工具。

为什么我们需要开源


我们不仅要在Github上的开放存储库中镜像代码,而且要这样做是为了我们自己和工程社区。将项目开源的主要原因有五个:

  • 得到反馈。
  • 影响行业标准。
  • 学习新事物。
  • 影响第三方库。
  • 提升您的个人品牌。

让我们简要介绍一下。

获取反馈并使代码更易于重用


我们为Avito工程师进行调优,我们的用户需要所有解决方案才能正常工作。我们缺乏解决类似问题的开发商的观点。如果他们指出内部实施中的问题以及连接到我们项目的便利,那将很酷。

我们已经看到了如何将代码移植到Github突出了重用问题。当您了解其他公司可以使用它时,您会以不同的方式看待体系结构。重用代码本身并不是目的。但是这个外部标准在很大程度上决定了架构的质量及其灵活性。

影响行业标准


自2017年以来,我们一直在开发用于移动应用程序的基础架构,并在各种会议上定期谈论它:


除了故事之外,我们一直希望共享代码并提供重用它的机会。实际上,许多Android开发人员都面临着类似的挑战:

  • 如何编写自动测试以使他们受益。
  • 如何在请求请求中运行它们。
  • 如何便宜地维护基础设施。

对于这些任务,没有公认的既定解决方案-每个公司都以自己的方式运营。我们共享最佳实践,因此在新项目中,开发人员不必收集有关测试移动应用程序和构建CI / CD的一点一点信息。我想为常规问题提供现成的解决方案,而不是写我的自行车。而且,即使没有人使用原始形式的项目代码,开发人员也将能够窥探我们的方法并改进自己的库。

向他人解释学习


仅将代码放在开源中是不够的。实践,方法,发现问题和做出决定的方式很重要。向他们展示,我们检查了我们的想法和现成的提案如何在Avito之外发挥作用。

影响第三方库并更快地解决其问题


假设您在Android或库中遇到问题,找不到解决方法。您需要社区或代码作者的帮助。您问了一个关于Stack Overflow的问题,在Google IssueTracker中创建了一个错误,详细描述了所有内容,但问题没有重现。要求您提供一个测试用例。所有这些都需要额外的时间。

开源可帮助您更快地创建可复制的示例。我们有一个使用部分基础架构测试应用程序。他的主要任务是养狗,即尽早通过一个简单且孤立的示例验证一切正常。但是,使用同一应用程序可以更轻松地显示错误。当我们在外国图书馆中提供可复制的示例时,其作者更容易理解问题所在。这增加了他进行改进的机会。

开源项目的受欢迎程度也增加了他们关注您的可能性。在一堆繁星和用户的图书馆中指示问题会增加压力,因此很难忽略。没有开源就很难获得这样的结果-您的应用程序必须超级流行,或者您应该亲自知道。

公关和个人动机


最后但并非最不重要的是个人收益。每个人都可以从日常工作中受益。该公司因其有用的产品而吸引了人们的注意力,我们以工程师的身份塑造了个人品牌,并获得了更多的工作动力。您不再需要在晚上为自己的项目寻找时间或在第三方开放源代码库中提交内容。

开源带来了什么


我们几乎所有的Android和CI / CD测试基础设施都放入了Github存储库中为了使其他开发人员更轻松地浏览项目,所有模块均按用途分组:




我将介绍几个最重要的库。

测试选手


这是用于运行仪器测试的gradle插件。最接近的模拟是Marathon,但我们的模拟仅适用于Android。

测试跑步者:

  • 描述要运行的测试。按注解,按包,按上次启动的结果进行过滤。
  • 描述要在其上运行测试的仿真器。将它们备份到Kubernetes或连接到本地仿真器。
  • 设置重新启动测试的条件。
  • 发送带有测试结果的最终报告。

结果存储在自定义的TMS(测试管理系统)中,而不是开源的。我们正在研究连接另一个实现的可能性。



影响分析


我们大约有1600个仪器测试和10K单元测试。我们希望针对所有代码更改运行所有测试,但这是不可能的-运行将花费太多时间。

一个简单的解决方案是将测试手动分为不同的组,例如,快速,慢速和仅运行一部分的烟雾测试。但是使用这种方法,总是有机会错过一个错误,因为尚不清楚哪组测试是最佳的。理想的解决方案是了解哪组最少的测试可以验证所有更改。这称为测试影响分析

我们编写了一个Gradle插件,用于查找模块中的更改,解析测试并确定要运行的模块。



主要模块和方法在项目文档中有更详细的描述
现在她不是很好,甚至还没有全部翻译。我们希望使文档更易于理解,并且需要您的帮助。在电报聊天中,告诉我们如何完成和更正文本



我们的图书馆如何发挥作用


由于该项目包含许多组件,因此其使用取决于您的需求。如果您正在解决类似的问题,或者只是想了解技术,请随时通过俄语英语的电报聊天室给我们写信我们将告诉您我们所知道的,尝试帮助并显示相关示例。

您可以问任何问题:

  • 您如何处理不稳定的测试?
  • 为什么需要那么多代码?他没用。
  • 为什么Gradle插件中的所有代码而不是Python脚本?

如果要使用特定模块,可以在测试应用程序中尝试使用它现在,它显示了使用测试运行器的示例。

不幸的是,我们在其他项目中仍然很少有重用的例子,因此集成仍然可能揭示未知的限制。如果发生这种情况,请写信给我们,我们将看到需要确定的内容。

结论


在以下文章中,我们计划讨论:

  • 我们的测试跑步者。
  • 测试剖析-按下IDE中的“运行”按钮以获取结果会发生什么。
  • 我们如何应对测试和基础架构的不稳定。
  • 我们编写基础结构的方法。
  • 我们如何将发布时间从一个月缩短到一个星期。

关于更一般的主题有一些想法:

  • 如何开始编写测试。
  • 面向初学者的测试基础知识-有关通用方法和技术的信息。

在评论中告诉我们您将有兴趣知道的事情。因此,我们将了解首先要编写的文本。

All Articles