Автоматизированное тестирование графического интерфейса пользователя:Идущий Нам Навстречу

StackOverflow https://stackoverflow.com/questions/822275

Вопрос

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

Приложение, о котором идет речь, представляет собой веб-Java-приложение, доступ к которому осуществляется через AJAX.Большинство существующих функций закодированы с использованием jsp, Javascript и немного Flash 8.Следующая волна функций будет реализована с использованием Библиотека YUI Javascript.Я в значительной степени определился с Селен в качестве тестового инструмента из-за его гибкости и ценовой категории (бесплатно).Основной момент:Я стремлюсь к возможности повторного использования тестов и простоте обслуживания.Я предпочитаю писать код, который обнаруживает, проверяет и использует элементы страницы, а не использовать систему записи и воспроизведения для разработки тестов.

Кто-нибудь может дать некоторые рекомендации относительно того, какие крючки можно было бы разместить в коде, или какие-нибудь рекомендации, чтобы упростить разработку тестов и повысить надежность самих тестов?

Это было полезно?

Решение

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

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

  • Соглашение не изменять пользовательский интерфейс произвольно - если тестировщик Боб видит, что компонент изменился с кнопки на ссылку, и он соответствует спецификации, нажимает и переходит дальше.Несмотря на то, что изменить код в автоматизации относительно просто, это изменение, которое, возможно, придется вносить в нескольких местах.(ваша задача как тестировщика - понимать, что изменения происходят, и минимизировать затраты на техническое обслуживание;их работа заключается только в том, чтобы вносить важные изменения и понимать их влияние)

  • Способ определить, на какой странице вы находитесь....Боб может определить разницу между входом в систему и вводом заказа, но как это узнает автоматизация?Если поле ввода с пометкой "Имя пользователя", откроется страница входа в систему.Если поле ввода с номером заказа, то поле заказа.

Не очень хорошо - лучшей практикой является согласованный элемент пользовательского интерфейса для идентификации страницы - заголовок страницы, скрытый компонент и т.д.

  • Способ однозначно идентифицировать каждый элемент, с которым вам нужно взаимодействовать (щелкнуть, ввести, подтвердить и т.д.), А не INPUT_42....

  • Спросите разработчиков, какую информацию тестировщики могут предоставить им для ускорения отладки, и попросите занести ее в файл журнала

  • Возможность сброса состояния программы

  • Последовательная обработка ошибок и отчетность (а также просто хороший дизайн пользовательского интерфейса)

Другие советы

Как и в большинстве вопросов, это зависит. Главным образом о том, как выглядит ваш сайт и какие элементы управления на страницах - много ли повторяющихся элементов и т. Д.?

Я имел большой успех, используя Selenium RC и Selenium IDE. Главное - привыкнуть к использованию Selenium и его команд. Также полезно привыкнуть к поиску объектов на странице (XPath и CSS-селекторы, а также функция «содержит»). Чего вы не хотите, так это множества элементов, имеющих одинаковый путь выбора. Если приведенные ниже таблицы и элементы div не содержат уникальной части, это может добавить дополнительную сложность вашим тестам.

<html>
  <body>
    <table>
      <tr>
        <td>
          <div></div>
          <div></div>
          <div></div>
        </td>
      </tr>
    </table>
    <table>
      <tr>
        <td>
          <div></div>
          <div></div>
          <div></div>
        </td>
      </tr>
    </table>
  </body>
</html>

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

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

Один совет: держите свой тестовый код как минимум на двух уровнях абстракции :

<Ол>
  • верхний слой : это должен быть своего рода фасад, ориентированный на терминологию / действия вашего конкретного приложения и т. д. Этот слой не напрямую использует библиотеку Selenium RC , В фоновом режиме он использует ...
  • ... нижний уровень : библиотека с некоторыми общими шаблонами тестирования (пример: утверждает, что выбрано значение X переключателя ") , который использует библиотеку Selenium RC.
  • Таким образом, ваши тесты будут более понятными и понятными с точки зрения того, что тестируется. Мы даже попробовали трехслойный подход, причем третий (самый верхний) уровень - это тесты, указанные с использованием XML . Это было сделано для того, чтобы наши тестеры, не занимающиеся программированием, могли указывать приемочные тесты, не углубляясь в код C #.

    Добавление к комментариям McWafflestix и s_hewitt - элементы gui должны быть правильно помечены, уникальны и предсказуемы для успеха с автоматизацией графического интерфейса. Если идентификаторы элементов не предсказуемы, у вас возникнут проблемы. Предсказуемый не обязательно означает статический. Для статических элементов страницы, таких как поле имени пользователя или кнопка входа в систему, я ожидал бы, что имя / идентификатор для них будет статическим от сборки к сборке и запуска к запуску. Для флажков, переключателей, динамического контента, я бы ожидал, что они будут динамическими, но предсказуемыми. Например, у вас может быть div с классом = " contentdetail " и id = "12345". Пока вы можете создать свой xpath, чтобы найти объект, с которым вам нужно надежно взаимодействовать, у вас все получится.

    РЕДАКТИРОВАТЬ: отличный способ для разработчиков автоматизировать тестирование с помощью настройки теста. В зависимости от вашего приложения, автоматическая настройка теста и демонтаж могут быть проблематичными. Например, в приложении рабочего процесса на складе тесты в начале рабочего процесса (прием товаров на склад) просты в настройке, но тесты в конце рабочего процесса (доставка товара со склада клиенту) много зависимостей (товар должен быть на складе, в достаточном количестве, в правильном месте инвентаризации и т. д.), что большая часть кода автоматизации может иметь дело с простой навигацией и вводом вашего пути через приложение, чтобы добраться до точки, где вы можете выполнить тест. В этих случаях может быть полезно иметь какую-то внешнюю утилиту (вне приложения, поэтому основной графический интерфейс не затрагивается) для введения зависимостей или сброса базы данных до некоторого известного состояния. В моем примере с хранилищем ваша утилита может настроить сценарий на уровне API, чтобы автоматический тест GUI можно было выполнить в соответствующей точке.

    Разработчики очень мало могут добавить в код, чтобы помочь.

    Проблема в том, что если вы хотите проверить выполнение путей кода и правильность этих путей кода, это должно быть сделано в модульных тестах, и они должны быть полностью отделены от вашего GUI. Но если вы действительно хотите протестировать свой графический интерфейс, то вам просто нужно смоделировать пользовательский ввод. Единственное, что может помочь в этом, - правильно маркировать ваши объекты и элементы управления, чтобы они могли быть правильно обнаружены вашей тестовой средой и выполнены. Кроме этого, не так много можно сделать (хотя это само по себе может немного помочь).

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

    Подход, который я использую (и я думаю, что подход, предложенный Ювалом Лоуи в «Программировании компонентов .NET»), состоит в том, чтобы попытаться абстрагировать реальный код от GUI через интерфейс, который позволяет мне писать модульные тесты для всех бизнес-логика, запускаемая графическим интерфейсом без фактического тестирования самого графического интерфейса.

    Он работает довольно хорошо и привел к созданию более чистого кода с большим отделением бизнес-логики от GUI, а также делает изменения GUI намного менее напряженными.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top