Java 存储空间不足的Android测试

Java 存储空间不足的Android测试,java,android,testing,filesystems,Java,Android,Testing,Filesystems,我编写了一个android应用程序,它(除其他外)将文件写入磁盘。现在我想知道当文件系统的存储空间不足时会发生什么。我猜,例如java.io.FileOutputStream.write()将抛出一个我必须捕获的IOException 问题是,我不想依赖我的超级忍者力量——我可能忘了在什么地方试抓,或者没有正确处理。因此,我想测试这个场景 可悲的是,我找不到任何关于这样做的良好实践的词——甚至连这样的话都找不到 当然,我想我会手动用类似这样的东西填充文件系统: size = N dir = /s

我编写了一个android应用程序,它(除其他外)将文件写入磁盘。现在我想知道当文件系统的存储空间不足时会发生什么。我猜,例如
java.io.FileOutputStream.write()
将抛出一个我必须捕获的
IOException

问题是,我不想依赖我的超级忍者力量——我可能忘了在什么地方试抓,或者没有正确处理。因此,我想测试这个场景

可悲的是,我找不到任何关于这样做的良好实践的词——甚至连这样的话都找不到

当然,我想我会手动用类似这样的东西填充文件系统:

size = N
dir = /some/path
data = generateDataForSize(size)
while( write(data, dir) );
while( round(size/=2) > 1 )
    write(generateDataForSize(size), dir)
其中
write()
将生成不同的文件或附加到单个文件。
generateDataForSize()
和大尺寸可能会有一些问题,但现在我们暂且不谈

让我发痒的是,我必须把这个放到我的应用程序的某个地方,再加上我必须清理那$%#!手动启动。好的,如果我把它放在它自己的目录中,我就可以在adb外壳上用一行代码丢弃整个东西

无论如何,有没有更简单的方法来解决我所缺少的问题?android是否为此提供了任何机制,比如临时限制每个应用程序的可用存储空间?是否有针对单元测试或android sdk工具的集成解决方案?其他人(你)是如何做到这一点的


TL;DR:如何有效地填充fs,以便在fs已满时写入测试用例


编辑:我正在一个没有根目录的真实设备上测试。即使HAXM已经启动并运行,模拟器的速度也非常慢。遗憾的是,使用模拟器不是一种选择

不过,塔索斯·穆塔卡斯暗示限制AVD的可用空间是很好的。我想如果您避免android:installLocation=“preferExternal”的问题,并将应用程序移动到sd/将文件写入有限的sd,这是一个可接受的解决方案


被接受的答案几乎就是我最后所做的。但是这仍然需要一些手工工作,所以请随意发布更多答案。

如果您在AVD模拟器上测试应用程序,您只需配置模拟器中的可用空间即可。看见让我知道这个解决方案是否适合你。
下面是关于如何在Google Play服务中使用AVD的说明。

Android在linux上运行,因此您可以转到shell并使用
dd
命令填充磁盘。通过USB连接设备并键入
adb shell
,然后

dd if=/dev/zero of=/sdcard/deleteme bs=1m count=1024
将名为
deleteme
的1GB文件写入
/sdcard
,其中满是零

  • if=
    是输入文件
  • /dev/zero
    只返回无穷的零
  • of=
    是输出文件
  • bs=
    是块大小,此处为1兆字节;有些实现更喜欢
    1M
  • count=
    是要写入的块数,此处为1024,表示1GB文件

调整大小以满足您的需要,或写入多个文件。准备好让Android在达到大约400MB可用空间时开始抱怨磁盘空间不足。根据我的经验,早在应用程序崩溃之前,Android就开始抱怨磁盘空间不足。

如果正在运行的程序只进行POSIX系统调用,您可以使用它来执行故障注入和写调用之类的操作返回PC,以模拟磁盘已满


另一个技巧是使用FUSE文件系统,例如允许您在文件系统级别注入故障。

试试这个:

谢谢您的回复。你更应该把问题作为评论放在你的答案中。AVD是一个很好的提示,+1。遗憾的是,我的应用程序依赖于模拟器中不可用的服务。你指的是什么服务?如果你能分享一些你的想法,你是如何想出这个解决方案的,可能会对Play服务和其他gms服务非常有帮助。幸运的是,你可以使用AVD。见编辑后的回答我更新了我的答案。模拟器速度太慢,无法在我的机器上进行测试(2007 iMac w/HAXM&x86 image)?AVD模拟器还是物理设备?这就是我最终得到的。我通过adb外壳连接,并在fs中填充了一些垃圾文件。我不得不使用bs=1m而不是bs=1M@vman-我还必须使用bs=1m,而不是bs=1m。我对答案进行了编辑以反映这一点。似乎有些实现需要
1M
,而另一些实现需要
1M
。我的三星设备完全忽略了字母,始终以字节为单位。我的谷歌设备使用小写字母。完全取决于设备。