|
|
|
Нужен совет по оптимизации структуры классов
|
|||
|---|---|---|---|
|
#18+
В общем, есть приложение и код, тестирующий его. Структура кода имеет 3 уровня: -уровень теста, там даются инструкции типа "ввести название объекта", "создать в графике выходной с параметрами ХУZ" и т.п. Это самый верхний уровень -уровень сущности, там уже действия, описанные на уровне теста, раскладываются на более мелкие, но еще не атомарные (т.е., например, там даются команды "Нажать на кнопку Create Schedule", передать графику параметра X, нажать ОК) -уровень UI, там прописаны элементы управления и действия над ними. Этот уровень самый нижний из рассматриваемых. Тест ориентирован на процесс. Т.е. описан так: сначала я делаю то-то, затем нажимаю сюда, потом проверяю еще что-то. А теперь, собственно, проблема: на уровне сущности все действия доступны в один и тот же момент времени. А сама сущность имеет несколько состояний, в некоторых из них часть действий не имеет смысла (например, открыто модальное окно графика, и мы в этом режиме с параметрами исходной сущности работать не можем). Соответственно, наш тест становится зависимым от знаний специалиста, программирующего тест-кейс. От этого хочется уйти, но пока не представляю как: - на мой взгляд, структура теста и так уже достаточно сложна, ее расширение, хотя и возможно, но при добавлении 2-3 уровней "вглубь", структура станет черезчур сложна - можно ввести что-то вроде семафора состояний, тогда тест уже не закрешится, но все равно, хочется, чтобы в зависимости от состояния приложения были доступны только методы, не нарушающие логику работы приложения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2012, 12:29 |
|
||
|
Нужен совет по оптимизации структуры классов
|
|||
|---|---|---|---|
|
#18+
Жентосно все равно, хочется, чтобы в зависимости от состояния приложения были доступны только методы, не нарушающие логику работы приложения. Зачем? Попробуйте сформулировать хоть одно преимущество, достигаемое таким образом. Фактически Вы хотите повторно закодировать в тесте бизнес-логику, реализованную в тестируемом объекте, сделать тест и сущность связанными сильнее, чем сейчас, как результат - уменьшить ценность теста и увеличить трудоёмкость разработки за счёт количества случаев, когда изменения в компоненте приводят к необходимости изменений в тесте. Просто представьте себе, что у Вас есть код, есть набор тестов. Теперь вы меняете бизнес-логику: окно графика стало немодальным. Что будет в исходном случае? А всё хорошо, правильные тесты правильно работают, надо только добавить тест немодальности (или изменить тест модальности, если он был). Что будет в Вашей схеме? Правильно, надо будет бегать по уйме методов и переписывать условия "когда он доступен". Правильный (с моей точки зрения) подход достигается следующим образом: если операция не может быть выполнена (скажем, пытаемся выполнить Click на недоступной кнопке) это приводит к генерации соответствующего исключения. Это автоматом реализует "недоступность" (точнее, правильный результат теста) для всех методов, прямо или косвенно вызывающих этот Click. Это автоматом отрабатывает ситуации типа "окно, которое должно было закрыться, не закрылось" и прочие возможные неприятности. Зачем это дублировать и портить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2012, 13:06 |
|
||
|
Нужен совет по оптимизации структуры классов
|
|||
|---|---|---|---|
|
#18+
softwarerПравильный (с моей точки зрения) подход достигается следующим образом: если операция не может быть выполнена (скажем, пытаемся выполнить Click на недоступной кнопке) это приводит к генерации соответствующего исключения. вот не факт, что исключение - лучший варант. может просто метод должен просто ничего не делать, в случае не активности окна... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2012, 16:00 |
|
||
|
Нужен совет по оптимизации структуры классов
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaNможет просто метод должен просто ничего не делать, Какой именно метод? "Нажми на кнопку"? "Введи значение в ячейку"? Нее, такой метод должен работать совершенно однозначно. У него есть постусловие (кнопка нажата, значение введено в ячейку). Такой метод должен ничего не делать, если значение уже в ячейке. Но если окно недоступно - он должен кидать исключение. Без вариантов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2012, 16:42 |
|
||
|
Нужен совет по оптимизации структуры классов
|
|||
|---|---|---|---|
|
#18+
softwarerZyK_BotaNможет просто метод должен просто ничего не делать, Какой именно метод? "Нажми на кнопку"? "Введи значение в ячейку"? Нее, такой метод должен работать совершенно однозначно. У него есть постусловие (кнопка нажата, значение введено в ячейку). Такой метод должен ничего не делать, если значение уже в ячейке. Но если окно недоступно - он должен кидать исключение. Без вариантов.значит нужна прокся, которая может отфильтровать левые мессаги. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2012, 16:42 |
|
||
|
Нужен совет по оптимизации структуры классов
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaNзначит нужна прокся, которая может отфильтровать левые мессаги. Зачем? Если цель - получить в результате тестирования красивую зелёную галочку, не надо писать никакой прокси, можно просто не писать тестов :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2012, 16:45 |
|
||
|
Нужен совет по оптимизации структуры классов
|
|||
|---|---|---|---|
|
#18+
softwarer, в принципе, с выбросом исключения согласен, можно будет такое сделать. Самая главная причина, по которой я бы хотел сделать сабж -- уровень сущности напоминает свалку, в которой есть абсолютно все методы обработки этой сущности во всех состояниях. Некоторые сущности имеют по пару тысяч строк кода, названия методов пересекаются и приходится перепроверять: тот ли метод вызван. В общем, тяжело будет поддерживать, если будем продолжать в том же духе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2012, 19:09 |
|
||
|
Нужен совет по оптимизации структуры классов
|
|||
|---|---|---|---|
|
#18+
Жентосуровень сущности напоминает свалку, в которой есть абсолютно все методы обработки этой сущности во всех состояниях. Вот этого я пока не понимаю. Вернее, могу проинтерпретировать разными способами, и при этом не соотношу с чем-то из своего опыта. Попробую рассказать как у меня. На базовом уровне - api работы с интерфейсом, те самые методы "найди объект", "нажми кнопку", "выбери значение в комбобоксе" итп. В текущем проекте это обёртка над Selenium, до того была обёртка над SendInput, в целом не суть. На этом же уровне реализуются всякие фенечки, повышающие достоверность работы: значения в поля вводятся с небольшой паузой после каждого символа, метод "нажми кнопку" некоторое время ждёт её появления и/или становления доступной итп. Главное, что этот уровень позволяет формулировать тесты в виде наглядной, читаемой записи "действий пользователя", его задача - максимально отсечь прочий код от технической специфики. Он же отвечает за формирование хороших сообщений об ошибках. Следующий уровень можно назвать настройкой на контекст. Для форм, фреймов и подобных конструктивных элементов описываются в виде функций составляющие их части. Например, у формы есть кнопка OK - значит, будет метод btnOk(), возвращающий эту кнопку в том виде, в котором её можно подать параметром в функцию click(). Если эта кнопка будет нажиматься часто, может быть реализован и метод clickOk(). Может появиться и более сложный типовой метод, скажем saveRecord(). Этим уровнем незачем слишком увлекаться, редкие вещи описывать не обязательно, его главная задача - дополнительно улучшить язык описания теста. Следующий уровень предназначен для создания сложных тестов, вероятно, он и соответствует Вашему "уровню сущности". Это описание сложных, составных операций. Например, если нам нужно ввести десять записей, будет довольно скучно расписывать их в виде "введи значение в поле а .. введи значение в поле б .. нажми ок .. нажми инсерт .. введи значение в поле а .." На этом уровне делается метод, например, "опиши бизнес-объект", который создаёт запись, вводит в неё указанные параметры, создаёт какие-нибудь дочерние записи итп. Здесь часто встречаются ветвления, иногда циклы. Наконец, собственно тесты - в простых случаях формулируются непосредственными вызовами первого-второго, в сложных - третьего уровня. В том, что касается собственно проверок - почти всю работу в итоге выполняют методы первого уровня. В методах четвёртого мы формулируем результаты, которых собственно должен достичь правильно отработавший тест - но когда тест работает неправильно, чаще всего об этом свидетельствует диагностика вида "кнопка ОК недоступна" или, например, "в результате нажатия кнопки ОК выдано сообщение об ошибке" с первого уровня. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2012, 22:38 |
|
||
|
Нужен совет по оптимизации структуры классов
|
|||
|---|---|---|---|
|
#18+
Ну вот, подниму немного топик.... есть кнопки, которые опичываются вот так: Код: java 1. действие "нажать" на копку описывается так: Код: java 1. 2. 3. 4. 5. 6. Вот думаю, может, сделать сам класс "кнопки" с методом нажатия на него, ведь банально выполняется одно и тоже действие. Проверку создания кнопки пока опустим (по FlexMonkey инфы даже на офф. форуме мало) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2012, 15:41 |
|
||
|
|

start [/forum/topic.php?fid=16&fpage=71&tid=1342396]: |
0ms |
get settings: |
9ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
51ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
43ms |
get tp. blocked users: |
2ms |
| others: | 221ms |
| total: | 364ms |

| 0 / 0 |
