【问题标题】:Testing functions that have Android device specific side effects测试具有 Android 设备特定副作用的函数
【发布时间】:2021-05-28 14:18:52
【问题描述】:

以如下函数为例:

public static float convertPixelsToDp(float px, Context context){
    return px / ((float) context.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT);
}

在上面的函数中,pxcontext.getResources().getDisplayMetrics().densityDpiDisplayMetrics.DENSITY_DEFAULT 改变。

如果开发人员使用相同的模拟器,则可以编写跨开发人员机器运行的测试。

话虽如此,有没有办法在测试框架内配置模拟设备或显示指标的默认值,从而产生与后者相同的结果?

【问题讨论】:

  • 集成测试与单元测试有点不同,这种依赖于设备的 API 通常不适合使用 espresso 等仪器框架进行行为测试。但是,如果您希望根据平台对此类实现进行单元测试,那么您可以查看 robolectric - robolectric.org
  • 如何跨机器使用测试“不可扩展或不正确”?这对我来说似乎是可扩展性的定义。如果此答案对您不起作用,我会编辑问题以添加更多信息。
  • 如果可能的话,可以举个例子。如果它对我来说似乎很模糊,我怀疑我是唯一的一个。顺便说一句,你以 3 个代表击败了我。 GRRRR!!!

标签: android integration-testing


【解决方案1】:

首先,我承认你的问题有点超出我的想象。然而,我确实知道,该方法存在的原因,以及 DP 的存在,是为了(部分)解决可伸缩性问题。我会回答你问的问题(我认为)。如果答案对您没有意义,那是这个问题对我没有意义。我有足够的信心回答,但还不足以押注这个答案......

关于您的问题,如果您想为设备的物理属性提供默认值。您需要更改 AVD 的设备 配置文件。您可以通过 AVD 管理器界面执行此操作,但您可以通过 command line. 获得更多选项。命令行还允许您通过 shell 脚本自动执行任何更改。由于我不完全确定这是否是您要查找的内容,因此我还将提供一些有关 px、dp 和可伸缩性的附加信息。如果它对您没有帮助,我相信它会帮助将来最终访问此页面的数千人中的一些人......

使用像素并不能在设备之间提供一致的显示,因为给定区域中的像素数量因设备而异。或者换句话说,像素密度不是标准化的。 dp弥补了这一点。您上面提到的功能非常适合您知道设备上需要多少像素的情况。如果转换为 dp,则不必担心图像在不同像素密度的设备上显示不同。

我们也有 sp,或缩放像素。这也考虑了用户的字体大小设置。

但是,使用 dp 甚至 sp 并不能完全解决问题。如果您的资源在一台设备上是 3 英寸高,那么它在每台设备上都是 3 英寸高。显然,在 5 英寸高的设备上与在 13 英寸高的设备上看起来会有很大不同。因此,如果您的目标是让您的资产显示为完全相同的大小,而不管设备如何,那么您很好。但是,目标更频繁地以相同的相对尺寸显示。

我相信您知道,Android 屏幕尺寸远未达到标准化。因此,除了使用 dp 之外,您还需要提供多个版本的视觉资源,以更好地跨设备显示它们。如果提供资产的多个版本并将每个版本放置在其对应的文件夹中,则当该资源显示时,它将在设备间更一致地显示。在您的应用程序的资源文件夹中,您会找到 5 个不同的文件夹。这些将仅在尺寸范围的特定部分上显示。标记为“超大”的文件夹(或类似的东西;我不记得实际名称,但我记得它们是不言自明的,所以它不应该是一个东西。)

如果您将每个图像(和 gif 等)制作成 5 种不同尺寸的 5 个版本,并将每个图像放在正确的文件夹中,您最终应该得到的结果虽然不完全一致,但应该在在几乎任何设备上看起来都最少“正确”。

应该注意,这不是实现图像可扩展性的唯一方法。 Android 还提供了丰富的可扩展布局,并且随着时间的推移,这些选项会越来越好。如果您创造性地使用布局嵌套,您可以实现几乎任何您能想象到的效果,而不管您要缩放的内容是什么。

【讨论】:

  • 非常感谢您周到的回复。我还通过删除一些与我的主要观点无关的措辞来编辑我的问题,这是关于在单元测试本身中配置设备属性而不是通过使用 AVD。我发现了这个:robolectric.org/device-configuration 我相信它回答了我的问题。 @trpride 的评论把我带到了那里。随意编辑您的答案。我的问题是关于单元测试的设备配置 - 以 DP 和像素为例来说明为依赖于设备的 API 编写单元测试的问题。 〜干杯
  • 我只是浏览了链接的材料。这似乎是一个启动器/任务运行器。这是我第一次看到 cli 选项时的想法。请记住,如果您的解决方案存在其他问题,请记住。顺便说一句,我忘了早些时候采购。我发现了它here。 A 的最后一点是先写的,因为我最初误读了 Q 并且不得不编辑。很高兴你解决了。
猜你喜欢
  • 2018-05-05
  • 2011-04-05
  • 1970-01-01
  • 2018-01-06
  • 1970-01-01
  • 2021-10-07
  • 1970-01-01
  • 1970-01-01
  • 2013-12-22
相关资源
最近更新 更多