Каков самый простой способ создать тест пользовательского интерфейса в Android Studio, который может делать снимки экрана, когда мне это нужно?

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

Я новичок в Android Studio и программировании для Android в целом; У меня неплохое понимание XML и Java, но я мало разбираюсь в файлах сборки и, похоже, не очень хорошо разбираюсь в Android Studio.

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

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

Сначала я попытался решить эту проблему невозможности делать снимки экрана с помощью Espresso, написав собственный код; поскольку я все еще не знаком с Android, я не совсем понимал, как это сделать, поэтому я искал помощь в Интернете (Как программно сделать снимок экрана в Android?). Однако мне не удалось заставить найденные решения работать внутри тестового файла.

Кто-то рекомендовал использовать этот инструмент: https://github.com/rtyley/android-screenshot-lib, но я не мог понять, как импортировать это в свой проект.

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

Прошел, наверное, месяц с тех пор, как я начал использовать Android Studio, и за это время у меня не было ничего, кроме проблем с правильной работой программного обеспечения. Для краткости я опустил все проблемы, которые мне удалось решить самостоятельно, но, прямо скажем, мое терпение на исходе.

TL;DR

Если бы кто-нибудь мог:

-объясните максимально простым способом, как импортировать uiautomator в проект Android Studio (я прочитал много документации о том, как импортировать внешние библиотеки в проект, но все они говорят мне добавить папку «libs» в мой проект, но не указывайте, какой тип папки использовать [Папка ресурсов Java? Папка активов? Модуль? и т. д.], и/или они говорят мне перейти в структуру проекта, выбрать мое приложение, перейти к зависимостям и выбрать «Импортировать как модуль». ," который не работает...)

OR

-объясните, как лучше всего сделать снимок экрана внутри теста эспрессо, включая любые инструкции о том, как импортировать все необходимые библиотеки

OR

-подробно объясните какой-либо другой способ создания теста пользовательского интерфейса, который может делать снимки экрана...

...Я был бы очень признателен. Я провел дни, пытаясь понять, как это сделать, и я так расстроен. Многие люди задавали подобные вопросы, но ответы либо были слишком расплывчатыми, либо проблемы не были достаточно близки к моим собственным.

Спасибо!


person ThisIsAName12345    schedule 17.02.2015    source источник
comment
Если вы не возражаете против использования отдельного инструмента для разработки и выполнения тестовых случаев UIautomator, попробуйте uiautomator-bot. С Uiaautomator-bot вам не придется беспокоиться о создании и настройке вещей. Кроме того, вы можете делать скриншоты простым способом.   -  person Dnavir    schedule 20.02.2015
comment
Это определенно сработает; однако я хотел бы запрограммировать тесты в проекте в Android Studio, если это вообще возможно. Тем не менее спасибо за рекомендацию!   -  person ThisIsAName12345    schedule 21.02.2015


Ответы (2)


Хорошо, после долгих хлопот я нашел очень простое решение. У меня ушло очень много времени на разработку, но если кому-то еще нужно сделать что-то подобное, я выложу свой вывод здесь.

Прежде всего, кажется, что среда тестирования, которую проще всего использовать с Android Studio, — это Espresso. Настроить эспрессо довольно просто; большинство инструкций можно найти здесь: https://code.google.com/p/android-test-kit/wiki/EspressoSetupInstructions Убедитесь, что вы внимательно прочитали его — в нем рассказывается практически все, что вам нужно знать, но я упустил некоторые важные детали, и это доставило мне много неприятностей.

Если вы просмотрите этот сайт Espresso, он расскажет вам обо всем, что вам нужно знать о том, как писать тесты Espresso. Меня это немного разочаровывало, потому что, если бы я написал тест, а тест не прошел, у моего устройства возникли бы проблемы с подключением к ноутбуку, и мне пришлось бы отсоединить и снова подключить USB-кабель, который я использовал. Я думаю, это как-то связано с тем фактом, что я использовал Nexus 7 с ноутбуком с Windows 8, что вызвало у меня некоторые проблемы в других областях, поэтому вы можете не столкнуться с этой проблемой самостоятельно.

Теперь, в отличие от uiautomator, в документации которого заявлена ​​поддержка снятия скриншотов, в Espresso нет встроенной поддержки снятия скриншотов. Это означает, что вам придется найти другой способ делать скриншоты. Мое решение состояло в том, чтобы создать новый класс (называемый в моем случае HelperClass) внутри моего пакета androidTest и добавить в него этот метод.

public static void takeScreenshot(String name, Activity activity)
{
    //slightly modified version of solution from http://www.ssaurel.com/blog/how-to-programmatically-take-a-screenshot-in-android/

    //I added "/Pictures/" to my path because that's the folder where I wanted to store my screenshots -- you might not have that folder on your device, so you might want to replace "/Pictures/" with just "/" until you decide where you want to store the screenshots
    String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/" + name;

    View v = activity.getWindow().getDecorView().getRootView();
    v.setDrawingCacheEnabled(true);
    Bitmap bitmap = Bitmap.createBitmap(v.getDrawingCache());
    v.setDrawingCacheEnabled(false);

    OutputStream out = null;
    File imageFile = new File(path);
    //the following line will help you find where the screen will be stored on your device
    Log.v("Screenshot", "The image file path is " + imageFile.getPath());

    try {
        out = new FileOutputStream(imageFile);
        // choose JPEG format
        bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
        out.flush();
    } catch (FileNotFoundException e) {
        // manage exception
    } catch (IOException e) {
        // manage exception
    } finally {

        try {
            if (out != null) {
                out.close();
            }

        } catch (Exception exc) {
        }

    }
}

Чтобы эта функция работала, вам также необходимо добавить следующую строку в файл манифеста.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

Без этого вышеприведенная функция будет генерировать FileNotFoundException каждый раз, когда вы ее запускаете.

Наконец, чтобы вызвать функцию takeScreenshot из вашего тестового кода Espresso, используйте эту строку (при условии, что вы назвали свой класс HelperClass... если нет, вместо этого используйте имя своего класса.

HelperClass.takeScreenshot("Whatever you want to call the file", getActivity());

Найти, где хранятся ваши скриншоты, может быть немного сложно, если вы не знаете, где искать. Я добавил строку кода в функцию takeScreenshot, которая будет печатать путь к файлу в LogCat, но я использовал проводник на своем компьютере для поиска снимков экрана на своем Nexus (который, конечно же, был подключен к компьютеру), и Я не мог найти этот путь. Тем не менее, у меня есть приложение для просмотра файлов на моем планшете, которое позволяет очень легко найти, где файлы находятся по отношению ко всему остальному.

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

Я надеюсь, что это поможет кому-то еще - это определенно решило мои проблемы, по крайней мере, на данный момент.

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

person ThisIsAName12345    schedule 24.02.2015

Попробуйте AndroidViewClient/culebra. Используя culebra GUI, вы можете автоматически создать тестовый пример, который взаимодействует с вашим приложением и делает снимок экрана именно тогда, когда вы это укажете.

person Diego Torres Milano    schedule 18.02.2015
comment
Это может сработать для моих целей, но я бы предпочел запрограммировать тесты внутри androidTest в Android Studio, если это возможно. Тем не менее, я ценю совет и обязательно учту его, если не смогу заставить что-либо работать внутри androidTest. Спасибо! - person ThisIsAName12345; 18.02.2015
comment
Есть ли хороший учебник по реализации тестов culebra (найти вид, щелкнуть, ввести текст...)? - person ahmed_khan_89; 28.04.2016
comment
Culebra GUI — это автоматический генератор тестов. сгенерировано. Затем вы можете взглянуть на сгенерированные тесты (которые созданы очень простым способом), чтобы понять, как используется базовая библиотека (AndroidViewClient). - person Diego Torres Milano; 28.04.2016