15. describe "downloader" do
before :all do
@data_server = DataServerHelper.new
@downloader = DownloaderHelper.new
@data_server.start
end
before :each do
@data_server.delete_all_schedules
@downloader.clear_jobs_queue
end
it "download schedule for tomorrow" do
schedule = Schedule.new(Time.now + 1.day)
@data_server.create_schedule(schedule)
act_schedule = @downloader.download_schedule(schedule)
act_schedule.should == schedule.expected
end
after :all do
@data_server.stop
end
end
15
16. describe "downloader" do
before :all do
@data_server = DataServerHelper.new
@downloader = DownloaderHelper.new
@data_server.start
end
before :each do
@data_server.delete_all_schedules
@downloader.clear_jobs_queue
end
it "download schedule for tomorrow" do
schedule = Schedule.new(Time.now + 1.day)
@data_server.create_schedule(schedule)
act_schedule = @downloader.download_schedule(schedule)
act_schedule.should == schedule.expected
end
after :all do
@data_server.stop
end
end
16
17. describe "downloader" do
before :all do
@data_server = DataServerHelper.new
@downloader = DownloaderHelper.new
@data_server.start
end
before :each do
@data_server.delete_all_schedules
@downloader.clear_jobs_queue
end
it "download schedule for tomorrow" do
schedule = Schedule.new(Time.now + 1.day)
@data_server.create_schedule(schedule)
act_schedule = @downloader.download_schedule(schedule)
act_schedule.should == schedule.expected
end
after :all do
@data_server.stop
end
end
17
18. describe "downloader" do
before :all do
@data_server = DataServerHelper.new
@downloader = DownloaderHelper.new
@data_server.start
end
before :each do
@data_server.delete_all_schedules
@downloader.clear_jobs_queue
end
it "download schedule for tomorrow" do
schedule = Schedule.new(Time.now + 1.day)
@data_server.create_schedule(schedule)
act_schedule = @downloader.download_schedule(schedule)
act_schedule.should == schedule.expected
end
after :all do
@data_server.stop
end
end
18
19. $ rspec spec -f doc
downloader
download schedule for today
download schedule for week
not download yesterday schedule
not download schedule after 7th day
download schedule if it was updated
download schedule with different event names
Finished in 120.089 seconds
6 examples, 1 failures
19
24. Данные Тестируем как
name, description текстовые поля
beginning - ending интервал времени
id числовое поле
24
25. Нормальное название
Длинное название
Стандартные разделители
“‘`|/,;:&<>^*!?«»
Пустое название
Пробелы
ЧуВсТвИтЕлЬнОсТь К рЕгИсТрУ
Окончания строк
^M, n, r
Диакритические знаки
àáâãäå
Плохие символы
♂♠♪
Греческий, арабский, китайский
Другая кодировка
Плохое выражение
“[|]’~<!--@/*$%^&#*/()?>,.*/-->
25
26. 1. Учить язык программирования
2. Использовать готовые библиотеки
3. Писать обертки
4. Отделять данные от тестов
5. Не забывать о «тестировании по выходу»
26
Добрый день, уважаемые коллеги! Давайте начнем.Мой доклад называется "Автотестирование веб-сервиса с помощью Ruby и Rspec". Но для начала давайте познакомимся.Я хотел бы узнать кто пришел на доклад.Кто из Вас занимается автоматизацией тестирования?Кто работает с Linux?Кто из Вас знает Ruby?
Теперь я расскажу немного о себе, чтобы вы знали кто я и почему вообще что-то рассказываю.Меня зовут Игорь Любин. Я закончил Казанский Государственный университет и имею степень кандидата физико-математических наук. В тестировании я работаю ровно 4 года, начал свою карьеру в Казани, учился в Санкт-Петербурге. Участвовал в конференциях SQAdays, был и докладчиком и организатором.
Последние полгода я живу в Москве и работаю в компании undev.ru. Наша компания занимается разработкой различных интернет-проектов.Основным языком разработки является Ruby. У нас работает самая большая команда Ruby разработчиков в Москве.
Цель этого доклада рассказать о своей работе. На примере из своей работы я покажу решение как можно автоматизировать веб-сервисы. Расскажу как написать свои обертки (helperы) на функциями сервиса, расскажу как организовать тесты, тестовые данные и сам тестовый проект в целом. Ну и в конце хотел бы получить обратную связь и узнать ваши мысли по этому поводу.
На практике встречаются проекты с массой бек-энд сервисов, и порой всю работу вашего приложения не видно через UI. Здесь UI лишь вершина айсберга. От нашего взгляда бывает скрыта масса различного рода сервисов. Для их проверки ручного тестирования через UI явно недостаточно. Для более качественной проверки прибегают к компонентному тестированию при помощи автоматизации.Для своего рассказа я выбрал один из таких сервисов, который скрыт глубоко под капотом.
Это сервис по скачиванию расписаний. На рисунке я его изобразил "черным ящиком". Он взаимодействует с 2-мя компонентами.Data Server- это сторонний сервер, который у себя выкладывает расписание событий в XML формате.Наш downloader ходит к этому DSyза расписанием событий, скачивает их, затем обрабатывает полученные данные, урезает их и в виде json файлов отправляет дальше в Web.Вот такой сервис, которому на вход приходит XML, а на выходе получается json, и надо тестировать. Как сказал выше здесь надо писать автоматизацию.
В моем случае язык программирования был жестко определен, практически без вариантов. Ruby надо сказать не самый плохой язык для программирования.Я использовал библиотеки из Ruby. Webrick - для написания эмулятора веб-сервера, iconv - для работы с кодировками.Фреймворком для запуска тестов был выбран rspec. Наиболее популярный для ruby, и что не мало важно по rspecу есть достаточно хорошей документации и примеров. На последнем слайде будет ссылка на один из них. Фреймворк я сам не писал, взял готовый.А вот драйвера готового нет, здесь я писал свои обертки над приложением, так называемые helperы.
Имеющуюся архитектуру тестового приложения мы проектируем в свои тесты и создаем над каждым имеющимся объектом, над каждой сущностью обертку. Так я получаю 2 будущих класса, с которыми буду работать в тестах. Интересующий нас DownloaderHelper и эмулятор DataServerHelper.В этих классах я описываю команды для взаимодействия с реальными сервисами.Эмулятор DSHнеобходим поскольку мы не можем на реальный сервер выкладывать свои тестовые данные.
Мы можем написать свой веб-сервер. С помощью webrick это делается буквально в одну строчку.А в конфигеdownloaderа прописываем, что теперь расписания надо скачивать по адресу нашего эмулятора.
Перед тем как тестировать нужно подготовить тестовые данные. Это я делаю следующим образом. Я подготавливаю пару файловXML-JSON.XML – я буду выкладывать на веб сервер.JSON – я буду сравнивать с тем что получается в результате теста.Причем в тестах я не буду явно использовать ссылки на XML и JSON. О них будет знать только объект Schedule, который я буду создавать перед тестом. И лишь он будет содержать всю информацию о расписаниях. На какой день мы создаем расписание, какую XML берем и с каким JSON сравниваем.Итак имея заготовленные тестовые данные…
Мы запускаем веб сервер, и выкладываем на нем XMLрасписания. Просто копируем заранее заготовленный файл с XML в папку вебсервера.
Затем просим наш downloader скачать эту XML. Мы вызываем команду закачки у нашего веб-сервиса, ждем достаточное время, переодически опрашивая веб-сервис не скачал ли он расписание. И как только он скачал возвращаем результат в переменную – актуальное раписание.
И последним шагом мы производим проверку только что скаченного расписания с заранее заготовленным файлом.Причем сравниваем не строки содержащие JSON, а преобразуем JSON в хеш, ассоциативный массив. И сравниваем массивы друг с другом.
Только что описанная процедура записывается в виде rspecтеста следующим образом.В rspecмы делаем описание нашего downloaderа. Этот тест говорит нам что downloader должен уметь скачивать расписания на завтра.
В начале теста есть 2 блока before.Before :all выполняется 1 раз перед всеми тестами.В нем мы создаем экземпляры наших объектов с которыми будем работать в тесте. И запускаем веб-сервер.Before :each выполняется перед каждым тестом. И перед каждым тестом мы осуществляем очистку состояний, на веб-сервере мы удаляем все старые файлы XMLек от предыдущих тестов, а у downloaderа чистим очередь работ по закачиванию.
В конце теста есть блок after :all. В котором мы останавливаем запущенный в начале теста веб-сервер.
Теперь разберем что происходит в тесте.Сначала мы создаем расписание на завтра. Затем выкладываем расписание на веб-сервер. Даунлоадер скачивает расписание. И в конце мы производим проверку актуального расписания с ожидаемым.Думаю тест понятен. Все почти на понятном английском.