Я пытаюсь создать тесты jUnit для некоторого кода, который генерирует файлы tar. Во время тестирования я создам множество tar-файлов и сравниваю их с изображениями «Gold» из ожидаемого результата. Я изо всех сил пытался создать функцию assertTarEquals (String file1, String file2) и надеялся, что кто-то сможет дать рекомендации относительно наилучшего подхода. Не важно иметь записи tar-файла в том же порядке или с теми же атрибутами. Мне просто нужно проверить, что у них есть все те же файлы и что эти файлы содержат один и тот же контент. Я создал assertZipEquals (String file1, String file2) на основе приведенного здесь примера: http://www.java2s.com/Tutorial/Java/0180__File/Comparetwozipfiles.htm, но ZipFile.getInputSteam (EntryName), похоже, не имеет параллельной функции в классах Commons Tar, поскольку они не реализовали маркеры в TarInputStream.Каков наилучший способ сравнить архивы tar в тестах юнита
2
A
ответ
0
Я, как правило, согласен с тем, что для тестирования модулей нет места для тестирования архивов, но проверяемый код управляет созданием архивов, поэтому, на мой взгляд, это не только целесообразно, но и необходимо. Код ниже довольно уродлив, и я бы никогда не хотел использовать что-то вроде этого в производственном коде, но для тестирования я думаю, что все в порядке ... вот код, который я использую для assertArchiveEquals, он поддерживает файлы tar и zip. ... как всегда вся обратная связь приветствуется.
package com.foo.util.merge;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
import org.apache.commons.io.IOUtils;
import static org.junit.Assert.*;
public final class CompareArchives {
public static final void assertArchiveEquals(String type, String archive1, String archive2) throws NoSuchAlgorithmException, IOException {
if (type.endsWith("zip")) {
assertZipEquals(archive1, archive2);
} else {
assertTarEquals(archive1, archive2);
}
}
/**
* @param archive1
* @param archive2
* @throws ZipException
* @throws IOException
*/
public static final void assertZipEquals(String archive1, String archive2) throws ZipException, IOException {
// Get Archives
ZipFile zipFile1 = new ZipFile(new File(archive1));
ZipFile zipFile2 = new ZipFile(new File(archive2));
// Get Member Hash
HashMap<String, ZipEntry> files1 = getMembers(zipFile1);
HashMap<String, ZipEntry> files2 = getMembers(zipFile2);
// Compare Files
assertMembersEqual(zipFile1, files1, zipFile2, files2);
}
/**
* @param archive
* @return
* @throws IOException
*/
private static final HashMap<String, ZipEntry> getMembers(ZipFile archive) throws IOException {
HashMap<String, ZipEntry> map = new HashMap<String, ZipEntry>();
@SuppressWarnings("unchecked")
Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>) archive.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = entries.nextElement();
map.put(entry.getName(), entry);
}
return map;
}
/**
* @param zip1
* @param files1
* @param zip2
* @param files2
* @throws IOException
*/
private static final void assertMembersEqual(ZipFile zip1, HashMap<String, ZipEntry> files1,
ZipFile zip2, HashMap<String, ZipEntry> files2) throws IOException {
if (files1.size() != files2.size()) {
fail("Different Sizes, expected " + Integer.toString(files1.size()) + " found " + Integer.toString(files2.size()));
}
for (String key : files1.keySet()) {
if (!files2.containsKey(key)) {
fail("Expected file not in target " + key);
}
String file1 = IOUtils.toString(zip1.getInputStream(files1.get(key)));
String file2 = IOUtils.toString(zip2.getInputStream(files2.get(key)));
assertEquals(file1, file2);
}
}
/**
* @param archive1
* @param archive2
* @throws IOException
* @throws NoSuchAlgorithmException
*/
public static final void assertTarEquals(String archive1, String archive2) throws IOException, NoSuchAlgorithmException {
// Get Member Hash
HashMap<String, TarArchiveEntry> files1 = getMembers(archive1);
HashMap<String, TarArchiveEntry> files2 = getMembers(archive2);
// Compare Files
assertMembersEqual(archive1, files1, archive2, files2);
}
/**
* @param archive
* @return
* @throws IOException
*/
private static final HashMap<String,TarArchiveEntry> getMembers(String archive) throws IOException {
TarArchiveInputStream input = new TarArchiveInputStream(
new BufferedInputStream(
new FileInputStream(archive)));
TarArchiveEntry entry;
HashMap<String, TarArchiveEntry> map = new HashMap<String, TarArchiveEntry>();
while ((entry = input.getNextTarEntry()) != null) {
map.put(entry.getName(), entry);
}
input.close();
return map;
}
/**
* @param tar1
* @param files1
* @param tar2
* @param files2
* @throws IOException
*/
private static final void assertMembersEqual(String tar1, HashMap<String, TarArchiveEntry> files1,
String tar2, HashMap<String, TarArchiveEntry> files2) throws IOException {
if (files1.size() != files2.size()) {
fail("Different Sizes, expected " + Integer.toString(files1.size()) + " found " + Integer.toString(files2.size()));
}
for (String key : files1.keySet()) {
if (!files2.containsKey(key)) {
fail("Expected file not in target " + key);
}
}
for (String key : files1.keySet()) {
if (!files2.containsKey(key)) {
fail("Expected file not in target " + key);
}
}
for (String key : files1.keySet()) {
String file1 = getTarFile(tar1, key);
String file2 = getTarFile(tar2, key);
assertEquals(file1, file2);
}
}
/**
* @param archive
* @param name
* @return
* @throws IOException
*/
private static final String getTarFile(String archive, String name) throws IOException {
TarArchiveInputStream input = new TarArchiveInputStream(
new BufferedInputStream(
new FileInputStream(archive)));
TarArchiveEntry entry;
while ((entry = input.getNextTarEntry()) != null) {
if (entry.getName().equals(name)) {
byte[] content = new byte[(int) entry.getSize()];
input.read(content, 0, content.length);
input.close();
return new String(content);
}
}
input.close();
return "";
}
}
Смежные вопросы
- 1. Каков наилучший способ сравнить несколько свойств javabean?
- 2. Каков наилучший способ сравнить Double и Int?
- 3. Каков наилучший способ сравнить два листа Excel?
- 4. Каков наилучший способ сравнить сходство двух строк?
- 5. Каков наилучший способ сравнить равенство файлов?
- 6. Каков наилучший способ сравнить хешированные строки? (PHP)
- 7. Каков наилучший способ прочитать GetResponseStream()?
- 8. Каков наилучший способ сравнить две строки для равенства в C?
- 9. Каков наилучший способ сравнить два JavaScriptObjects в GWT?
- 10. Каков наилучший способ запроса?
- 11. Каков наилучший способ многопоточности?
- 12. Каков наилучший способ увеличения?
- 13. Каков наилучший способ сравнить 2 варианта SQL-запроса для производительности?
- 14. Каков наилучший способ сравнить строку с другой строкой?
- 15. Каков наилучший способ сравнить две версии продукта/сборки
- 16. Каков наилучший способ сравнить несколько списков с различным количеством параметров
- 17. Каков наилучший способ сравнить 2 вектора или строки по элементам?
- 18. Каков наилучший способ сравнить 2 дерева папок на окнах?
- 19. Каков наилучший способ сравнить целую часть двух нецелых чисел?
- 20. Каков наилучший или быстрый способ сравнить две строки?
- 21. NSDate Сравнить в тестах
- 22. Каков наилучший способ заявить о равенстве numpy.array?
- 23. Каков наилучший способ организовать код?
- 24. Каков наилучший способ пропустить активность
- 25. Каков наилучший способ сэкономить JNIEnv *
- 26. Каков наилучший способ профилирования javascript?
- 27. Каков наилучший способ сохранить запросы?
- 28. Каков наилучший способ обрезать список?
- 29. Каков наилучший способ переучивания языка?
- 30. Каков наилучший способ структурирования проекта?
Смотрите также http://stackoverflow.com/questions/30595038/where-to-store-a-binary-file-to-be-used-for-unit-testing – Raedwald