代码之家  ›  专栏  ›  技术社区  ›  Ula Krukar

带有文件的单元测试系统依赖项-隐藏文件

  •  4
  • Ula Krukar  · 技术社区  · 16 年前

    我正在编写一个“总指挥官”,就像Java中的应用程序一样。这里有非常明显的文件系统依赖关系。

    我想进行单元测试。我为测试目的创建了目录结构,并将其保存在SVN存储库中的已知位置。到目前为止效果很好。

    现在,我有了一个忽略隐藏文件的方法。我该怎么办?我可以标记隐藏在SVN中的文件吗?

    另一种解决方案是在运行测试之前将其中一个文件隐藏在构建脚本中,但我担心这会将文件标记为已修改并始终显示在提交对话框中。

    有什么建议吗?

    4 回复  |  直到 16 年前
        1
  •  10
  •   artemb    16 年前

    我将把测试目录的所有初始化都放到测试本身中。这种情况很简单:

    • 创建目录
    • 把一些隐藏的和可见的文件放进去
    • 测试
    • 通过删除目录来删除
        2
  •  3
  •   Assaf Stone    16 年前

    从本质上讲,在单元测试时访问文件系统是一大禁忌。对于初学者来说,这些测试比系统内测试慢(ER),从而降低了以高频率运行测试的可能性(例如每次编译)。

    如果使用适配器模式抽象出对文件系统的访问,效果会更好。我是.NET开发人员,因此我的示例将使用C,但我希望您能够足够简单地翻译它:

    public class MyManager
    {
        private readonly IFileAdapter _fileAdapter;
        public MyManager(IFileAdapter fileAdapter)
        {
            _fileAdapter = fileAdapter;
        }
    }
    
    public interface IFileAdapter
    {
        public FileStream Open(string fileName);
        public string ReadLine(FileStream fileStream);
        // More methods...
    }
    
    public class FileAdapter : IFileAdapter
    {
        public FileStream Open(string fileName)
        {
            return System.Io.File.Open(fileName);
        }
    
        public string ReadLine(FileStream fileStream)
        {
            return File.Open(fileStream);
        }
    }
    

    现在,和往常一样,您可以模拟文件系统,就像模拟任何其他类一样,提供返回的结果。记住-你是 测试Java的IO类,假设它们工作。你只是在测试你的课程(即 我的经理 ,在上面的示例中)。

    将实际使用文件系统的测试留给集成/验收测试。

    希望这有帮助, 阿萨夫。

        3
  •  2
  •   Rorick    16 年前

    我更喜欢抽象文件系统,这样我的单元测试就不需要访问真实的文件系统。当然,这个抽象层必须用真实的文件系统进行测试,但是这样可以减少对它的依赖。

    至于在SVN中存储隐藏文件,我选择了Artemb。您应该创建在JUnit设置中测试所需的所有文件。大概,您应该更喜欢按测试方法设置( @Before 和@ After )但是如果你遇到测试缓慢的问题,看看 @BeforeClass @AfterClass . 我认为它们也可以与测试套件一起使用。

        4
  •  0
  •   pgras    16 年前

    Artemb的答案是正确的,您可以使用@before和@after为每个测试创建和删除结构。

    下面是一些代码,我用来创建一个新目录,其中包含一些文件,它将在systems temp目录中创建目录,这很重要,因为根据运行测试的计算机,可能不允许您在其他地方创建文件或目录。(我必须编写这段代码,以允许在我们的Linux集成机器上执行我的测试…)

        final String tempdir = System.getProperty("java.io.tmpdir");
        final String dirname = Long.toHexString(System.currentTimeMillis());
        final File dir = new File(tempdir, dirname);
        dir.deleteOnExit();
        dir.mkdir();
        final String path = dir.getAbsolutePath();
        assertTrue(dir.exists());
        // pre condition, the directory is empty
        assertTrue(dir.list().length == 0);
    
        // create temp files in the directory
        final int nbFiles = 3;
        for (int i = 0; i < nbFiles; i++) {
            (File.createTempFile("test", ".txt", dir)).deleteOnExit();
        }
    

    顺便说一句,你必须知道你在哪个平台上运行才能创建隐藏文件…