【问题标题】:Detecting if the code read the specified input file检测代码是否读取了指定的输入文件
【发布时间】:2017-01-19 17:37:59
【问题描述】:

我正在编写一些自动化测试来测试代码并向程序员提供反馈。

其中一个要求是检测代码是否成功读取了指定的输入文件。如果没有 - 我们需要相应地向用户提供反馈。检测此问题的一种方法是atime 时间戳,但由于我们的服务器驱动器安装有relatime 选项 - 我们不会为每个文件读取更新atime。更改此选项以记录每个atime 是不可行的,因为它会显着减慢我们的 I/O 操作。

是否有任何其他替代方法可以用来检测给定代码是否确实读取了指定的输入文件?

【问题讨论】:

  • 即使有完整的atime 支持,您如何区分读取整个文件的代码和只读取其中一部分的代码?你真的需要检查吗?也许验证代码输出(如果它读取并处理文件,它将匹配)?
  • 我同意 Sergio 的观点:触摸文件并不意味着它已被成功读取。如果您想真正“确定”;这些程序必须“发回”某种指示。
  • @SergioTulentsev - 我们已经在检查只有在处理输入后才会生成的输出,但是我们需要检测程序员是否正确读取了文件(部分对创建输出没有用处) ,所以我们在这里介绍)。我们经常看到他们在路径上出错(归咎于C: :P),我们希望检测到这一点并提供相关反馈。

标签: linux file io


【解决方案1】:

这是一个疯狂的想法:在某个时候拦截读取调用。一种可能的方法或多或少是这样的:

  1. 该程序通过抽象进行所有读取。例如,MyFileUtils.read(filename)(自定义)而不是 File.read(filename)(stdlib)。
  2. 在正常操作期间,MyFileUtils 只是将工作委托给File(或您使用的任何系统内置库/调用)。
  3. 但在测试中,MyFileUtils 被替换为一个特殊的测试版本,该版本与委托一起还向框架报告使用情况。

请注意,在某些环境/语言中,可能可以将代码直接注入File,并且不需要抽象。

【讨论】:

    【解决方案2】:

    我同意 Sergio 的观点:触摸文件并不意味着它已被成功读取。如果您想真正“确定”;这些程序必须“发送”某种指示回来。当然,有很多选择可以实现。

    一种实用的方法可能是:假设那些被测试的程序创建日志文件;您的“测试监视器”可以检查日志文件是否包含固定条目,例如“读取 xyz PASSED”或类似内容。

    如果您的“被测代码”没有创建日志文件;也许:考虑改变它。

    【讨论】:

    • 或许可以拦截系统调用什么的。真正验证程序是否打开并读取了文件。不知道要求,但这看起来完全是矫枉过正。 :)
    • 这取决于:如果日志文件已经存在,可能根本不存在
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多