TDD / модульное тестирование приложения для Windows? - PullRequest
5 голосов
/ 20 апреля 2011

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

Однако, мое программное обеспечение - программа для Windows.По сути, он взаимодействует с другими окнами на рабочем столе пользователей и перемещает их по экрану на основе определенных критериев.Если изображение XX видно, переместите это окно в координаты x / y.Если в этом окне нажата комбинация клавиш F9, переместите ее в координаты x2 / y2.И т.д.

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

Ответы [ 3 ]

4 голосов
/ 21 апреля 2011

Поскольку вы упомянули, что вы новичок, я добавлю здесь напоминание, что вы должны быть осторожны с тем, что вы проверяете.Вы хотите проверить свою логику, а не Windows.Чтобы сделать это, вам нужно разделить ваши проблемы на класс (или классы), которые содержат вашу логику, и классы, которые содержат оболочки (прокси) для используемых вами API - вы не тестируете API.Они работают, пока вы не докажете обратное.

Вы захотите проверить свои классы, а также заглушки или издевательства над прокси.В приведенном выше примере, если, например, вы используете команды Windows API для доставки своего решения, вы поместите команды, которые перемещают окно в класс WindowsProxy, и смоделируете вызовы, проверяя , чтовызовы к ним сделаны, но на самом деле они не выполняются в тесте.

Если вы используете .NET и Windows-Forms, или какую-то аналогичную инфраструктуру, вам нужно использовать шаблон, который поддерживает тестированиенапример MVP .Вы хотите написать свои тесты, чтобы использовать Presenter , одновременно заглушая или насмехаясь над View (ваше окно) и Model (любой API или объект домена).ты используешь).

Вот пример архитектуры:

public interface IView { ... }

public class View : IView
{
   private Presenter _p;
   View()
   {
      _p = new Presenter(this);
      ...
   }

}

public class Presenter
{
   presenter IView _v;
   Presenter(IView view)
   {
      _v = view;
   }
}

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

Надеюсь, это поможет.Я трачу много времени на разработку пользовательских элементов управления на основе Win-Form и разработку их с помощью TDD.Это не невозможно и даже не сложно, как только вы освоите его.

Дайте мне знать, если вам понадобятся какие-либо дальнейшие разработки.

Ассаф.

2 голосов
/ 20 апреля 2011

Не рекомендуется использовать окна UnitTest, поэтому вам лучше провести рефакторинг своего приложения в Model-View-Controller (любой тип этого шаблона) и протестировать автономные классы Controller и Model.

1 голос
/ 20 апреля 2011

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

Если я возьму один из ваших примеров:

Если в этом окне нажать сочетание клавиш F9, переместите его в x2 / y2

Вы можете структурировать свой код так, чтобы вы могли легко вызвать функцию / метод дляпереместить окно.Затем вы захотите опросить состояние окна и определить, где оно находится.Если состояние окна сообщает, что оно находится в положении x2 / y2, это положительный результат.

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

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