Тестовые приспособления или эквивалент для тестовых данных с помощью Smalltalk Seaside?

Я использовал разработку через тестирование в приложении Seaside, с которым я играл, и все мои данные хранятся в виде объектов на изображении (в отличие от базы данных).

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

ToDoTest>>setUp 
    savedTasks := Task tasklist.
    Task deleteAllTasks.

    savedProjects := ToDoProject projectlist.
    ToDoProject deleteAllProjects.

    savedPeople := Person peoplelist.
    Person deleteAllPeople.

И:

ToDoTest>>tearDown
    Task tasklist: savedTasks.
    ToDoProject projectlist: savedProjects.
    Person peoplelist: savedPeople

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

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

В любом случае, я могу улучшить это?


person Eric Clack    schedule 27.04.2013    source источник


Ответы (2)


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

Чтобы исправить это в вашей текущей настройке, вам нужно где-то добавить гарантировать: заблокировать. Блок обеспечения «гарантирует» вам, что что-то выполнено, независимо от того, все ли прошло нормально или произошла ошибка. Проблема в том, что вам нужно сделать это до и после теста.

В этом случае я бы перезаписал TestCase>>#runCase в вашем собственном тестовом классе чем-то вроде

runCase
   [ self saveRealModel.
      super runCase ]
      ensure: [ self restoreRealModel ]
person Norbert Hartl    schedule 29.04.2013
comment
Интересный. Я думаю, что идея разделения данных каким-то образом может помочь здесь. Например, мое простое приложение для работы с задачами в настоящее время не имеет концепции пользователей, я мог бы добавить их, а затем создать тестового пользователя для модульных тестов. - person Eric Clack; 30.04.2013
comment
Есть много способов сделать это. Если вы хотите локализовать свои данные, простой способ — переместить вещи со стороны класса на сторону экземпляра. Если ToDoProject является вашим основным классом, переместите методы стороны класса на сторону экземпляра. У вас будет ToDoProject››#taskList, ToDoProject››#projectList,... На первом этапе вы можете сделать ToDoProject одноэлементным, чтобы класс ToDoProject ››#default возвращал экземпляр ToDoProject с вашими реальными данными. Ваш морской компонент будет иметь проект instVar. Затем вы настраиваете свой компонент с ToDoProject по умолчанию для реального использования, а для тестирования вы устанавливаете ToDoProject new - person Norbert Hartl; 30.04.2013

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

DEUser subclass: #SBUser
    instanceVariableNames: 'email initials projects invitations'
    classVariableNames: ''
    poolDictionaries: ''
    category: 'StoryBoard-Data'

с пользователями класса instancevar в качестве точки входа. Проекты доступны только через пользователей.

users
    ^users ifNil: [ users := OrderedCollection with: (SBAdministrator new
        userid: 'admin';
        password: 'admin';
        yourself)
    ]

и способ их очистить

resetUsers
    " SBUser resetUsers "
    users := nil

Часто мы можем передавать зависимости при создании для объектов предметной области.

Iteration>on: aProject
    ^self new
        project: aProject;
        yourself

Это позволяет тестовому набору проходить сам по себе или отдельному (фиктивному) объекту.

person Stephan Eggermont    schedule 12.05.2013