Как предоставить файлы данных для тестов на андроид
Я разрабатываю программное обеспечение, которое загружает информацию из XML файлов, используя реализацию Java java.xml.parsers.DocumentBuilder и DocumentBuilderFactory. Я пишу модульные тесты своих объектов, и мне нужно иметь возможность предоставлять множество xml файлов, которые будут использовать тестируемый код. Я использую Eclipse и имею отдельный Android Test Project. Я не могу найти способ поставить тестовый xml в тестовый проект таким образом, чтобы тестируемый код мог открыть файлы.
- Если я поместил файлы в/активы тестового проекта, тестируемый код не сможет его увидеть.
- Если я поместил файлы в/активы тестируемого кода, он, конечно, может видеть файлы, но теперь я забиваю свою фактическую систему только тестовыми файлами данных.
- Если я скопирую файлы в каталог /sdcard/data, я могу открыть их из тестируемого кода, но это мешает автоматизации моих тестов.
Приветствуются любые предложения о том, как иметь разные тестовые файлы xml в тестовом пакете, но быть видимыми для тестируемого кода.
Вот как я попытался структурировать unit test:
public class AppDescLoaderTest extends AndroidTestCase
{
private static final String SAMPLE_XML = "sample.xml";
private AppDescLoader m_appDescLoader;
private Application m_app;
protected void setUp() throws Exception
{
super.setUp();
m_app = new Application();
//call to system under test to load m_app using
//a sample xml file
m_appDescLoader = new AppDescLoader(m_app, SAMPLE_XML, getContext());
}
public void testLoad_ShouldPopulateDocument() throws Exception
{
m_appDescLoader.load();
}
}
Это не сработало, поскольку файл SAMPLE_XML находится в контексте теста, но AndroidTestCase предоставляет контекст для тестируемой системы, которая не может видеть актив из тестового пакета.
Это модифицированный код, который работал на каждый ответ:
public class AppDescLoaderTest extends InstrumentationTestCase
{
...
protected void setUp() throws Exception
{
super.setUp();
m_app = new Application();
//call to system under test to load m_app using
//a sample xml file
m_appDescLoader = new AppDescLoader(m_app, SAMPLE_XML, getInstrumentation().getContext());
}
Ответы
Ответ 1
Вариант 1: используйте InstrumentationTestCase
Предположим, что у вас есть папка с данными в проекте android project и test project, и вы помещаете файл XML в папку с ресурсами. в тестовом коде в тестовом проекте это загрузит xml из папки ресурсов проекта Android:
getInstrumentation().getTargetContext().getResources().getAssets().open(testFile);
Это загрузит xml из папки ресурсов тестового проекта:
getInstrumentation().getContext().getResources().getAssets().open(testFile);
Вариант 2: используйте ClassLoader
В вашем тестовом проекте, если папка с ресурсами добавлена в путь сборки проекта (который был автоматически выполнен плагином ADT до версии r14), вы можете загрузить файл из каталога res или assets (т.е. каталогов в пути создания проекта) без Context
String file = "assets/sample.xml";
InputStream in = this.getClass().getClassLoader().getResourceAsStream(file);
Ответ 2
Для тестирования модулей Android и JVM я использую следующее:
public final class DataStub {
private static final String BASE_PATH = resolveBasePath(); // e.g. "./mymodule/src/test/resources/";
private static String resolveBasePath() {
final String path = "./mymodule/src/test/resources/";
if (Arrays.asList(new File("./").list()).contains("mymodule")) {
return path; // version for call unit tests from Android Studio
}
return "../" + path; // version for call unit tests from terminal './gradlew test'
}
private DataStub() {
//no instances
}
/**
* Reads file content and returns string.
* @throws IOException
*/
public static String readFile(@Nonnull final String path) throws IOException {
final StringBuilder sb = new StringBuilder();
String strLine;
try (final BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(path), "UTF-8"))) {
while ((strLine = reader.readLine()) != null) {
sb.append(strLine);
}
} catch (final IOException ignore) {
//ignore
}
return sb.toString();
}
}
Все исходные файлы, которые я помещаю в следующий путь: ".../project_root/mymodule/src/test/resources/"