解决processDebugAndroidTestManifest Attribute meta-data#XXX@value requires a placeholder substitution but no value is provided.

在集成极光推送 SDK 的时候,如果把极光推送集成到一个独立的 AAR 包中,在编译的时候会发生如下报错:

如果是构建单一 APK 的情况下,可以直接在 AAR 项目里面通过 manifestPlaceholders 直接配置这些参数。

但是如果是多渠道打包的情况下,我们会在统一的地方根据不同的渠道进行配置。

这个时候直接在 AAR 项目里面配置就不合适了,此时我们观察报错信息,会发现其实真正报错的地方是执行单元测试的时候报错(processDebugAndroidTestManifest)。

其实也容易理解,执行 AndroidTest 的时候,需要生成单独测的测试 APK,这一步就必须补充完整全部的 meta-data 信息,否则无法顺利生成 APK

通过上述的分析,解决这个问题就比较简单了,我们只需要在测试用例的时候补充这些 meta-data 信息即可。

那接下来就是怎么生成 AndroidTest 的时候的配置信息,网上搜索很久,才在 Possibility to define manifestPlaceholders or BuildConfig variables just for tests 找到相关的解决方案。

参考解决方法如下:

极光推送相关的解决参考如下:

参考链接


新一代UI框架-Flutter的单元测试方法

1、Flutter是什么

Flutter是谷歌的移动UI框架,运用Dart语言,可以快速在iOS和Android上构建高质量的原生用户界面。通俗地来讲,Flutter是一款移动应用程序SDK,一份代码可以同时生成iOS和Android两个高性能、高保真的应用程序。Flutter目标是使开发人员能够交付在不同平台上都感觉自然流畅的高性能应用程序。我们兼容滚动行为、排版、图标等方面的差异。

Flutter为什么选择Dart

1、Dart 的性能更好。 js或dart都是一种声明式的写法,但js需要解释,dart是直接语言层面支持了持了node tree的书写,且对象创建成本低,可直接编译成native代码(AOT),VM效率更高,所以运行上dart效率会很多, 而且dart 是一种同时支持 JIT/AOT 编译的语言,JIT 开发模式时能快速编译生效,是Hot Reload体验的关键。速度的提升对高帧率下的视图数据计算很有帮助。

2、Native Binding。在 Android上,v8的 Native Binding可以很好地实现,但是 iOS上的JavaScriptCore不可以,所以如果使用 JavaScript,Flutter 基础框架的代码模式很难统一。而Dart的 Native Binding可以很好地通过 Dart Lib实现。

3、Dart是类型安全的语言,拥有完善的包管理和诸多特性。Google召集了如此多个编程语言界的设计专家开发出这样一门语言,旨在取代 JavaScript,所以 Fuchsia OS内置了 Dart。Dart可以作为 embedded lib嵌入应用,而不用只能随 着系统升级才能获得更新,这也是优势之一。

Flutter的优点

1、提高开发效率

同一份代码开发iOS和Android用更少的代码做更多的事情轻松迭代 在应用程序运行时更改代码并重新加载(通过热重载)修复崩溃并继续从应用程序停止的地方进行调试

2、创建美观,高度定制的用户体验

受益于使用Flutter框架提供的丰富的Material Design和Cupertino(iOS风格)的widget实现定制、美观、品牌驱动的设计,而不受原生控件的限制

2、Flutter的测试方案

根据flutter.dev介绍,Flutter测试方案可分为三种:

单元测试 测试单一功能、方法或类。例如,被测单元的外部依赖性通常被模拟出来,如package:mockito。 单元测试通常不会读取/写入磁盘、渲染到屏幕,也不会从运行测试的进程外部接收用户操作。单元测试的目标是在各种条件下验证逻辑单元的正确性。

wiget测试 在其它UI框架称为 组件测试) 测试的单个widget。测试widget涉及多个类,并且需要提供适当的widget生命周期上下文的测试环境。 例如,它应该能够接收和响应用户操作和事件,执行布局并实例化子widget。widget测试因此比单元测试更全面。 然而,就像一个单元测试一样,一个widget测试的环境被一个比完整的UI系统简单得多的实现所取代。小部件测试的目标是验证小部件的UI如预期的那样的外观和交互。

集成测试

测试一个完整的应用程序或应用程序的很大一部分。通常,集成测试可以在真实设备或OS仿真器上运行,例如iOS Simulator或Android Emulator。 被测试的应用程序通常与测试驱动程序代码隔离,以避免结果偏差。集成测试的目标是验证应用程序作为一个整体正确运行,它所组成的所有widget如预期的那样相互集成。 您还可以使用集成测试来验证应用的性能。

3、编写Flutter的单测环境与case

创建一个Flutter的单测case,主要分以下四个步骤:

  • 创建一个被测方法
  • 引入Flutter Test Library
  • 创造flutter单元测试用例
  • 注入并执行单测case

创建被测方法 如图所示,首先编写一个简单的测试方法calc

引入Flutter Test Library 接着,需要在配置文件pubspec.yaml文件中引入对应的测试library,从而保证在测试时这个dependency可以被引入

创造flutter单元测试用例 在Module的目录下,新创建一个目录,下面放我们编写的单测用例,我们将被测用例命名为test.dart

执行用例 写一个main方法作为入口,在终端键入命令flutter test运营测试,可以看到,我们的测试用例未通过,原因是expect方法预期结果与实际结果不同导致。

这样,一个完整的flutter单元测试就完成了。

4、总结

总结来说,作为一个经验法则,单元测试虽然执行速度快,依赖少,但能给项目带来的质量信心是最低的;经过充分测试的应用程序应该具有非常多的单元和widget测试,通过代码覆盖(code coverage)进行跟踪,以及覆盖所有重要使用场景的大量集成测试,才可从各阶段、各方面保证新产品的质量品质。

参考链接


新一代UI框架-Flutter的单元测试方法