【发布时间】:2014-01-28 19:07:54
【问题描述】:
我在 Linux 上有一个 Python 和 C 应用程序,它应该在从磁盘读取文件时正确处理 IO 错误。大部分应用程序是用 Python 编写的,并带有一个执行 IO 的 C 扩展。检测到 IO 错误就是在这个扩展中。
在我看来,错误有两种情况。
- 文件丢失。
- 磁盘上的文件(使用
stat)看起来比使用fread读取的要大。
我可以相当轻松地测试和处理案例 1。但是,我还想为案例 2 编写一个单元测试。但是,我不知道如何触发测试的“假”IO 错误。这甚至可能吗?有没有更好的方法来测试这种错误?
【问题讨论】:
-
旁注:模拟文件在成功打开后消失(例如,它在记忆棒上,现在被移除)可能会成为另一个有趣的案例。
-
Case 2 不会给你一个 IO 错误,它只会返回比你预期更少的字节。
fread将返回读取的元素数量(对于大多数其他函数也是如此,无论是在 C/POSIX 中还是在 Python 中)。如果你打电话给ferror()和feof()来检查为什么你得到的结果比预期的少,你会分别得到零和非零。那么,您是在尝试测试实际的 I/O 错误,还是您的案例 2? -
@abarnert 我指的是 errno 值,在这种情况下为 (EIO == 5)。这在技术上不是 IO 错误吗?
-
@chux 这让我想到了,虽然我还不确定我将如何测试它。这可能意味着我必须重构我的代码。 :-/
-
errno 值来自什么?你打电话给
fread,然后ferror告诉你有错误,然后errno设置为EIO?如果是这样,这并不意味着文件比预期的要短,这意味着发生了其他事情(如物理读取错误)。如果文件比预期的短,那不是错误,ferror必须告诉你。 (如果在errno中碰巧有一些旧错误,那就无关紧要了。)除非我怀疑 linux 或 glibc 中存在严重的错误。
标签: python c linux unit-testing