Тесты JUnit не проходят при создании новых файлов - PullRequest
2 голосов
/ 07 июля 2011

У нас есть несколько тестов JUnit, которые основаны на создании новых файлов и их чтении. Однако есть проблемы с файлами, которые не создаются должным образом. Но эта ошибка приходит и уходит.

Это код:

@Test
public void test_3() throws Exception {

    // Deletes files in tmp test dir

    File tempDir = new File(TEST_ROOT, "tmp.dir");
    if (tempDir.exists()) {
        for (File f : tempDir.listFiles()) {
            f.delete();
        }
    } else {
        tempDir.mkdir();
    }

    File file_1 = new File(tempDir, "file1");
    FileWriter out_1 = new FileWriter(file_1);
    out_1.append("# File 1");
    out_1.close();

    File file_2 = new File(tempDir, "file2");
    FileWriter out_2 = new FileWriter(file_2);
    out_2.append("# File 2");
    out_2.close();

    File file_3 = new File(tempDir, "fileXXX");
    FileWriter out_3 = new FileWriter(file_3);
    out_3.append("# File 3");
    out_3.close();
            ....

Ошибка в том, что второй объект файла, file_2, никогда не создается. Иногда. Затем, когда мы пытаемся написать в него, FileNotFoundException выбрасывается

  • Если мы запускаем только этот тестовый сценарий, все работает нормально.
  • Если мы запустим этот тестовый файл с ~ 40 тестовыми сценариями, он может не только сработать, но и работать в зависимости от текущего лунного цикла.
  • Если мы запустим весь набор тестов, состоящий из примерно 10 * 40 тестовых случаев, он всегда завершится неудачей.

Мы пытались

  • добавление снов (5 секунд) после new File, ничего
  • добавление цикла while, пока file_2.exists() не станет true, но цикл никогда не останавливался
  • перехватывает SecurityException, IOException и даже бросаемый, когда мы делаем New File(..), но ничего не перехватывается.

В какой-то момент мы получили все файлы, которые должны быть созданы, но файл_2 был создан до файла_1, и тест, проверивший время создания, не удался.

Мы также пытались добавить file_1.createNewFile(), и оно всегда возвращает true.

Так что происходит? Как мы можем сделать тесты, которые зависят от реальных файлов и всегда быть уверены, что они существуют?

Это было протестировано в Java 1.5 и 1.6, а также в Windows 7 и Linux. Единственное различие, которое можно заметить, заключается в том, что иногда подобный тестовый сценарий раньше не проходит, а иногда вместо него создается файл_1

Обновление

Мы попробовали новый вариант:

File file_2 = new File(tempDir, "file2");
while (!file_2.canRead()) {
    Thread.sleep(500);
    try {
        file_2.createNewFile();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Это приводит к множеству исключений типа:

java.io.IOException: Access is denied
 at java.io.WinNTFileSystem.createFileExclusively(Native Method)
 at java.io.File.createNewFile(File.java:883)

... но в итоге все работает, файл создан.

Ответы [ 4 ]

2 голосов
/ 07 июля 2011

Есть ли несколько запущенных экземпляров вашей программы одновременно? Проверьте наличие лишних экземпляров javaw.exe. Если несколько программ имеют дескрипторы к одному и тому же файлу одновременно, все может стать очень шатким и очень быстрым.

Есть ли у вас антивирусное программное обеспечение или что-то еще, что мешает созданию / удалению файлов, дескриптором?

1 голос
/ 09 июля 2011

Попробуйте Файл # createTempFile , это, по крайней мере, гарантирует, что не существует других файлов с таким же именем, которые все еще сохраняют блокировку.

1 голос
/ 08 июля 2011

Не кодируйте имена файлов жестко, используйте случайные имена. Это единственный способ абстрагироваться от различных внешних ситуаций (множественный доступ к одному и тому же файлу, права доступа, ошибка файловой системы, проблемы с блокировкой и т. Д.).

Одно можно сказать наверняка: использование sleep () или повторных попыток гарантированно вызовут странные ошибки в будущем, избегайте этого.

0 голосов
/ 07 июля 2011

Я немного погуглил и основываясь на этой ошибке lucene и этот вопрос к доске , похоже, указывает на то, что может быть проблема с блокировкой файла и другими процессами, использующими файл.

Поскольку мы выполняем это на ClearCase, кажется вероятным, что ClearCase выполняет некоторую индексацию или что-то подобное во время создания файлов. Добавление циклов, которые повторяются до тех пор, пока файл не станет читаемым, решило проблему, поэтому мы будем с этим. Очень уродливое решение, хотя.

...