2008-09-20 2 views
16

Как вы можете протестировать большое приложение MFC UI?Единичное тестирование приложений MFC UI?

У нас есть несколько крупных приложений MFC, которые разрабатывались в течение многих лет, мы используем некоторые стандартные автоматизированные инструменты QA для запуска основных сценариев, чтобы проверить основы, открыть файл и т. Д. Они управляются группой QA после ежедневной сборки ,

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

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

Окружающая среда C++/C/FORTRAN, MSVC 2005, Intel FORTRAN 9.1, Windows XP/Vista x86 & x64.

ответ

11

Это зависит от того, как структурировано приложение. Если логический и графический интерфейс разделены (MVC), то тестирование логики легко. Взгляните на Michael Feathers "Humble Dialog Box" (PDF).

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

Это на самом деле довольно легко:

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

  1. Рефакторинг, так что есть отдельный список с элементами для списка для показа. Элементы хранятся в списке и не извлекаются из того, откуда поступают ваши данные. Код, который делает список списка вещей, знает только о новом списке.
  2. Затем вы создаете новый объект контроллера, который будет содержать логический код. Метод, который обрабатывает нажатие кнопки, вызывает только mycontroller-> ButtonWasClicked(). Он не знает о списке или других вещах.
  3. MyController :: ButtonWasClicked() делает то, что нужно сделать для предполагаемой логики, подготавливает список элементов и сообщает, что элемент управления обновляется. Для этого вам нужно отделить контроллер и управление, создав для этого интерфейс (чистый виртуальный класс). Контроллер знает только объект этого типа, а не элемент управления.

Thats it. Контроллер содержит логический код и знает управление только через интерфейс. Теперь вы можете написать регулярный модульный тест для MyController :: ButtonWasClicked(), высмеивая элемент управления. Если вы не знаете, о чем я говорю, прочитайте статью Майклса. Дважды. И снова после этого.
(Примечание для себя: нужно научиться не болтать, что много)

1

Ну, у нас есть одно из этих обширных приложений MFC на рабочем месте. Его гигантская боль, чтобы сохранить или расширить свой ... огромный шар грязи теперь, но он сгребает в moolah.Anyways

  • Мы используем Rational Robot для этого дыма испытания и тому подобное.
  • Другим подходом, который имел некоторый успех, является создание небольшого языка, специфичного для продукта, и скриптовых тестов, которые используют VBScript, а некоторые управляют манерой шпионажа управления. Включите общие действия в команды. OpenDatabase будет командой, которая, в свою очередь, введет необходимые блоки скриптов, чтобы щелкнуть Главное меню> Файл> «Открыть ...». Затем вы создаете листы excel, которые представляют собой серию таких команд. Эти команды также могут принимать параметры. Что-то вроде теста FIT, но больше работы. После того, как вы найдете большинство общих команд и готовых скриптов. Выбираем и собираем скрипты (помеченные CommandID) для написания новых тестов. Тест-лингер анализирует эти листы Excel, объединяет все маленькие блоки скриптов в тестовый скрипт и запускает его.

    1. OpenDatabase "C: \ Тесты \ MyDB"
    2. OpenDialog "Добавить модель"
    3. AddModel "M0001", "MyModel", 2,5, 100
    4. PressOK
    5. SaveDatabase

HTH

0

На самом деле мы используем Rational Team Test, то робот, но в последнее время дискуссии с Rational мы обнаружили, что у них нет планов по поддержке собственных приложений x64 фокусирующих более на .NET, поэтому мы решили переключить автоматизированные инструменты QA. Это замечательно, но расходы на лицензирование не позволяют нам использовать его для всех разработчиков.

Все наши приложения поддерживают COM API для скриптинга, который мы тестируем с помощью VB, но это не проверяет API как приложение.

В идеале меня бы интересовало, как люди интегрируют cppunit и аналогичные модули тестирования модулей в приложение на уровне разработчика.

12

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

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

  • Прежде всего, вам понадобится поддержка управления новыми исправлениями, чтобы заняться немного дольше. Убедитесь, что все понимают, почему.
  • Далее купите копию WELC book. Прочтите его на обложку, если у вас есть время. Или, если вам трудно, отсканируйте индекс, чтобы найти симптом, который демонстрирует ваше приложение. Эта книга содержит много хороших советов и именно то, что вам нужно, пытаясь получить существующий код для тестирования. alt text http://ecx.images-amazon.com/images/I/51RCXGPXQ8L._SL160_AA115_.jpg
  • Затем для каждого нового исправления/изменения потратить некоторое время и понять область, над которой вы собираетесь работать. Напишите несколько тестов в выбранном вами варианте xUnit (свободно доступный) для осуществления текущего поведения.
  • Убедитесь, что все испытания прошли. Напишите новый тест, который требует необходимого поведения или ошибки.
  • Запишите код, чтобы сделать этот последний пробный проход.
  • Рефтор безжалостно находится в зоне испытаний, чтобы улучшить дизайн.
  • Повторите все изменения, которые вы должны внести в систему здесь. Никаких исключений из этого правила.
  • Земля обетованная: Скоро появятся все растущие острова хорошо протестированного кода. Все больше и больше кода будет подпадать под автоматизированный набор тестов, и изменения будут постепенно упрощаться. И это потому, что медленно и верно базовый дизайн становится более проверяемым.

Простой выход был моим предыдущим ответом. Это трудный, но правильный выход.

3

Хотя не совершенны, лучшее, что я нашел для этого AutoIt http://www.autoitscript.com/autoit3

«AutoIt v3 является бесплатным BASIC-подобный язык сценариев для автоматизации графического интерфейса Windows, и общие сценарии. Она использует комбинацию моделируемых нажатий клавиш , перемещение мыши и манипулирование окнами/элементами управления, чтобы автоматизировать задачи таким образом, которые невозможно или надежно использовать на других языках (например, VBScript и SendKeys). AutoIt также очень мала, автономна и будет работать во всех версиях Windows из «ящик без раздражающего« времени автономной работы »!

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

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

Я чувствую, что при разработке нового приложения я бы настаивал на последовательном сигнале «ГОТОВ». Это было бы полезно для пользователей пользователей, а также для тестовых скриптов! Это может быть проблемой для устаревшего приложения, но, возможно, вы можете ввести его в проблемные моменты и медленно распространить его на все приложение, поскольку техническое обслуживание продолжается.

+0

Мне нравится функция AutoIt3, но вопрос касался модульного тестирования, и вы говорите об интеграционном тесте интеграции. Это два разных теста. – 2012-01-27 05:52:34

2

Хотя он не может обрабатывать сторону пользовательского интерфейса, я тестирую код MFC с помощью библиотеки Boost Test. Там есть статья код проекта на начало работы:

Designing Robust Objects with Boost

+0

Я рассматриваю эту модульную систему тестирования для наших приложений MFC. Но я также хотел бы проверить логику пользовательского интерфейса. Я понимаю, что было бы невозможно проверить класс просмотра. Но как насчет класса Document? Я думаю, чтобы класс Document работал как Ведущий MVP и тестировал логику пользовательского интерфейса, реализуя модульные тесты этого класса, как мы тестируем класс контроллера в MVC. Считаете ли вы, что это сработает? – 2011-12-15 16:25:27

3

Я понимаю, что это датированный вопрос, но для тех из нас, кто по-прежнему работать с MFC, то Microsoft C++ Unit Testing Framework в VS2012 работает хорошо.

Генеральная Процедура:

  1. Скомпилируйте MFC проект в качестве статической библиотеки
  2. Добавить новый проект Test Unit Native к вашему решению.
  3. В тестовом проекте добавьте проект MFC в качестве ссылки.
  4. В свойствах конфигурации тестового проекта добавьте каталоги Include для ваших файлов заголовков.
  5. В компоновщике параметры ввода добавляют ваш MFC.lib; nafxcwd.lib; libcmtd.Lib;
  6. В разделе «Игнорировать конкретные библиотеки по умолчанию» добавьте nafxcwd.lib; libcmtd.lib;
  7. В разделе «Общие» укажите местоположение файла экспортированной библиотеки MFC.

У https://stackoverflow.com/questions/1146338/error-lnk2005-new-and-delete-already-defined-in-libcmtd-libnew-obj есть хорошее описание почему вам нужны nafxcwd.lib и libcmtd.lib.

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

Смежные вопросы