Модульное тестирование приложений MFC UI? - PullRequest
17 голосов
/ 20 сентября 2008

Как вы тестируете большое приложение MFC UI?

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

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

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

Среда: C ++ / C / FORTRAN, MSVC 2005, Intel FORTRAN 9.1, Windows XP / Vista x86 и x64.

Ответы [ 7 ]

13 голосов
/ 20 сентября 2008

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

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

  • Сначала вам понадобится поддержка со стороны руководства, чтобы новые исправления заняли немного больше времени. Убедитесь, что все понимают, почему.
  • Далее купите копию WELC book . Если у вас есть время ИЛИ если у вас есть затруднения, прочитайте его, чтобы отсканировать индекс, чтобы найти признак, который демонстрирует ваше приложение. Эта книга содержит много полезных советов и является именно тем, что вам нужно, когда вы пытаетесь сделать существующий код тестируемым. alt text
  • Тогда для каждого нового исправления / изменения тратьте некоторое время и разбирайтесь в области, над которой вы собираетесь работать. Напишите несколько тестов в выбранном вами варианте xUnit (в свободном доступе), чтобы проверить текущее поведение.
  • Убедитесь, что все тесты пройдены. Напишите новый тест, который демонстрирует необходимое поведение или ошибку.
  • Напишите код для прохождения последнего теста.
  • Рефакторинг беспощадно в тестируемой области для улучшения дизайна.
  • Повторите эти действия для каждого нового изменения, которое вы должны внести в систему с этого момента. Нет исключений из этого правила.
  • Теперь Земля обетованная : Скоро появятся постоянно растущие острова хорошо проверенного кода. Все больше и больше кода попадают под автоматизированный набор тестов, и изменения будут постепенно упрощаться. И это потому, что медленно и уверенно базовый дизайн становится более тестируемым.

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

12 голосов
/ 20 сентября 2008

Это зависит от того, как приложение структурировано. Если логика и код GUI разделены (MVC), то тестирование логики легко. Взгляните на Michael Feathers «Диалоговое окно смирения» (PDF).

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

На самом деле это довольно просто:

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

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

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

4 голосов
/ 30 января 2014

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

Общая процедура:

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

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

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

3 голосов
/ 20 сентября 2008

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

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

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

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

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

2 голосов
/ 20 сентября 2008

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

Проектирование надежных объектов с ускорением

1 голос
/ 20 сентября 2008

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

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

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

НТН

0 голосов
/ 20 сентября 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...