SlideShare ist ein Scribd-Unternehmen logo
1 von 27
Игорь Любин




              1
   Игорь Любин
   Канд. физ.-мат. наук

   Тестировщик с 1.12.2007

   SQAdays 3, 5, 8, 9, 10!




                              2
3
   Рассказать о своей работе
   На примере автоматизации веб-сервиса
   Получить обратную связь




                                           4
UI




     5
Data Server   xml   Downloader   json   Web




                                              6
Язык            Библиотеки



Драйвер          Фреймворк

          Из презентации А. Баранцева
                                        7
Webrick
 Ruby
           Iconv


Helpers   Rspec


                    8
DataServer         Downloader
             xml                json   …
 Helper              Helper




                                           9
WEBrick::HTTPServer.new(:DocumentRoot=>dir).start




 DataServer           Downloader
                xml                   json          …
   Helper                Helper


@data_server.start




                                                        10
XML                   JSON




 DataServer           Downloader
                xml                   json   …
   Helper                Helper


schedule = Schedule.new(Time.now + 1.day)




                                                 11
XML




 DataServer           Downloader
                xml                      json   …
   Helper                Helper


@data_server.create_schedule(schedule)




                                                    12
DataServer           Downloader
                xml                   json        …
   Helper                Helper


act_schedule = @downloader.download_schedule(schedule)




                                                         13
JSON




 DataServer           Downloader
                xml                   json   …
   Helper                Helper


act_schedule.should == schedule.expected




                                                 14
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
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
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
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
$ 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
test

 lib

spec

data

 log

public


         20
<?xml version="1.0" encoding="windows-1251"?>
<Grid>
  <Event>…</Event>     Event
  <Event>…</Event>
  <Event>…</Event>
                                  Iconv
  <Event>…</Event>
  <Event>…</Event>
  <Event>…</Event>
  …
</Grid>




                                                21
<Event>                                              __DAY__
  <ID>33894863</ID>
  <DayNo> ... </DayNo>
  <Start>__DAY__ 07:00:00</Start>
  <Finish>__DAY__ 07:15:00</Finish>
  <Star>0</Star>
  <Name>Test Name</Name>
  <Info id="89724" type="2"> ... </Info>
  <Flag><ID>4</ID><Name>Инфо</Name></Flag>
  <Location>                                 Event
    <ID> ... </ID>
    <Type>1</Type>
  </Location>
  <Gate> ...
    <Info>Test Description</Info>
  ... </Gate>
  <Type ... >other</Type>
</Event>



                                                               22
[
    {
      "name": "Test Name",
      "id": "33894863",
      "beginning": "__DAY__ 07:00:00",
                                           Event
      "ending": "__DAY__ 07:15:00",
      "description": "Test Description",
      "type": "other"
    },
    …
]



                                                   23
Данные               Тестируем как

name, description    текстовые поля

beginning - ending   интервал времени

id                   числовое поле




                                        24
   Нормальное название
   Длинное название
   Стандартные разделители
       “‘`|/,;:&<>^*!?«»
   Пустое название
   Пробелы
   ЧуВсТвИтЕлЬнОсТь К рЕгИсТрУ
   Окончания строк
       ^M, n, r
   Диакритические знаки
       àáâãäå
   Плохие символы
       ♂♠♪
   Греческий, арабский, китайский
   Другая кодировка
   Плохое выражение
       “[|]’~<!--@/*$%^&#*/()?>,.*/-->


                                           25
1.   Учить язык программирования
2.   Использовать готовые библиотеки
3.   Писать обертки
4.   Отделять данные от тестов
5.   Не забывать о «тестировании по выходу»




                                              26
   Ruby
      Вики-учебник http://ru.wikibooks.org/wiki/Ruby
      Упражнения http://rubymonk.com
   Rspec
      http://kerryb.github.com/iprug-rspec-presentation


   Контакты
      E-mail: ilyubin@yandex.ru
      Skype: igor.lyubin




                                                           27

Weitere ähnliche Inhalte

Was ist angesagt?

Go meetup smotri+ 23.04.2015
Go meetup smotri+ 23.04.2015Go meetup smotri+ 23.04.2015
Go meetup smotri+ 23.04.2015Mikhail Salosin
 
Hacking PostgreSQL. Физическое представление данных
Hacking PostgreSQL. Физическое представление данныхHacking PostgreSQL. Физическое представление данных
Hacking PostgreSQL. Физическое представление данныхAnastasia Lubennikova
 
Hacking PostgreSQL. Обзор исходного кода
Hacking PostgreSQL. Обзор исходного кодаHacking PostgreSQL. Обзор исходного кода
Hacking PostgreSQL. Обзор исходного кодаAnastasia Lubennikova
 
Школа-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с даннымиШкола-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с даннымиГлеб Тарасов
 
Расширения для PostgreSQL
Расширения для PostgreSQLРасширения для PostgreSQL
Расширения для PostgreSQLAnastasia Lubennikova
 
ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014
ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014
ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014InterSystems
 
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...Timur Shemsedinov
 
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Интуит. Разработка приложений для iOS. Лекция 8. Работа с даннымиИнтуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Интуит. Разработка приложений для iOS. Лекция 8. Работа с даннымиГлеб Тарасов
 
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.Anastasia Lubennikova
 
JS утиліти WordPress на практиці
JS утиліти WordPress на практиціJS утиліти WordPress на практиці
JS утиліти WordPress на практиціShtrih Sruleg
 
Call of Postgres: Advanced Operations (part 5)
Call of Postgres: Advanced Operations (part 5)Call of Postgres: Advanced Operations (part 5)
Call of Postgres: Advanced Operations (part 5)Alexey Lesovsky
 
SECON'2016. Бочкарев Игорь, Реактивные мобильные приложения
SECON'2016. Бочкарев Игорь, Реактивные мобильные приложенияSECON'2016. Бочкарев Игорь, Реактивные мобильные приложения
SECON'2016. Бочкарев Игорь, Реактивные мобильные приложенияSECON
 
Расширенное кеширование в Doctrine2
Расширенное кеширование в Doctrine2Расширенное кеширование в Doctrine2
Расширенное кеширование в Doctrine2Ilyas Salikhov
 
Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2Paul Klimov
 
[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java
[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java
[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в JavaProvectus
 
05 - Web-технологии. Сетевые протоколы
05 - Web-технологии. Сетевые протоколы05 - Web-технологии. Сетевые протоколы
05 - Web-технологии. Сетевые протоколыRoman Brovko
 
FrontTalks: Михаил Давыдов (Яндекс), «Promise – это не больно»
FrontTalks: Михаил Давыдов (Яндекс), «Promise – это не больно»FrontTalks: Михаил Давыдов (Яндекс), «Promise – это не больно»
FrontTalks: Михаил Давыдов (Яндекс), «Promise – это не больно»Yandex
 

Was ist angesagt? (19)

Go meetup smotri+ 23.04.2015
Go meetup smotri+ 23.04.2015Go meetup smotri+ 23.04.2015
Go meetup smotri+ 23.04.2015
 
Nginx.pm
Nginx.pmNginx.pm
Nginx.pm
 
Hacking PostgreSQL. Физическое представление данных
Hacking PostgreSQL. Физическое представление данныхHacking PostgreSQL. Физическое представление данных
Hacking PostgreSQL. Физическое представление данных
 
Hacking PostgreSQL. Обзор исходного кода
Hacking PostgreSQL. Обзор исходного кодаHacking PostgreSQL. Обзор исходного кода
Hacking PostgreSQL. Обзор исходного кода
 
Школа-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с даннымиШкола-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с данными
 
Расширения для PostgreSQL
Расширения для PostgreSQLРасширения для PostgreSQL
Расширения для PostgreSQL
 
ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014
ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014
ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014
 
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
 
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Интуит. Разработка приложений для iOS. Лекция 8. Работа с даннымиИнтуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
 
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
 
JS утиліти WordPress на практиці
JS утиліти WordPress на практиціJS утиліти WordPress на практиці
JS утиліти WordPress на практиці
 
Call of Postgres: Advanced Operations (part 5)
Call of Postgres: Advanced Operations (part 5)Call of Postgres: Advanced Operations (part 5)
Call of Postgres: Advanced Operations (part 5)
 
Почему Mojolicious?
Почему Mojolicious?Почему Mojolicious?
Почему Mojolicious?
 
SECON'2016. Бочкарев Игорь, Реактивные мобильные приложения
SECON'2016. Бочкарев Игорь, Реактивные мобильные приложенияSECON'2016. Бочкарев Игорь, Реактивные мобильные приложения
SECON'2016. Бочкарев Игорь, Реактивные мобильные приложения
 
Расширенное кеширование в Doctrine2
Расширенное кеширование в Doctrine2Расширенное кеширование в Doctrine2
Расширенное кеширование в Doctrine2
 
Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2
 
[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java
[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java
[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java
 
05 - Web-технологии. Сетевые протоколы
05 - Web-технологии. Сетевые протоколы05 - Web-технологии. Сетевые протоколы
05 - Web-технологии. Сетевые протоколы
 
FrontTalks: Михаил Давыдов (Яндекс), «Promise – это не больно»
FrontTalks: Михаил Давыдов (Яндекс), «Promise – это не больно»FrontTalks: Михаил Давыдов (Яндекс), «Promise – это не больно»
FrontTalks: Михаил Давыдов (Яндекс), «Promise – это не больно»
 

Ähnlich wie Автотестирование веб-сервиса с Ruby и Rspec

Pavel Dovbush Toster
Pavel Dovbush Toster Pavel Dovbush Toster
Pavel Dovbush Toster Pavel Dovbush
 
Переезжаем с Zabbix на Prometheus / Василий Озеров (fevlake)
Переезжаем с Zabbix на Prometheus / Василий Озеров (fevlake)Переезжаем с Zabbix на Prometheus / Василий Озеров (fevlake)
Переезжаем с Zabbix на Prometheus / Василий Озеров (fevlake)Ontico
 
Meet Magento Belarus - Alexander Kaigorodov
Meet Magento Belarus - Alexander KaigorodovMeet Magento Belarus - Alexander Kaigorodov
Meet Magento Belarus - Alexander KaigorodovAmasty
 
Batch processing in rails
Batch processing in railsBatch processing in rails
Batch processing in railssergeymoiseev
 
Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016Кирилл Толкачёв
 
Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"Yandex
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Yandex
 
Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.Nikita Borzykh
 
Scala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentScala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentAnton Kirillov
 
RDSDataSource: Promises
RDSDataSource: PromisesRDSDataSource: Promises
RDSDataSource: PromisesRAMBLER&Co
 
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf Conference
 
Tdd webpack + testem + mocha + chai
Tdd webpack + testem + mocha + chaiTdd webpack + testem + mocha + chai
Tdd webpack + testem + mocha + chaiMichael Chernobrov
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Minktyomo4ka
 
GitLab, Prometheus и Grafana с Kubernetes
GitLab, Prometheus и Grafana с KubernetesGitLab, Prometheus и Grafana с Kubernetes
GitLab, Prometheus и Grafana с KubernetesVictor Login
 
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)7bits
 
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"Yandex
 
Yii development
Yii developmentYii development
Yii developmentMageCloud
 

Ähnlich wie Автотестирование веб-сервиса с Ruby и Rspec (20)

Tdd php
Tdd phpTdd php
Tdd php
 
Erlang tasty & useful stuff
Erlang tasty & useful stuffErlang tasty & useful stuff
Erlang tasty & useful stuff
 
Pavel Dovbush Toster
Pavel Dovbush Toster Pavel Dovbush Toster
Pavel Dovbush Toster
 
Переезжаем с Zabbix на Prometheus / Василий Озеров (fevlake)
Переезжаем с Zabbix на Prometheus / Василий Озеров (fevlake)Переезжаем с Zabbix на Prometheus / Василий Озеров (fevlake)
Переезжаем с Zabbix на Prometheus / Василий Озеров (fevlake)
 
Meet Magento Belarus - Alexander Kaigorodov
Meet Magento Belarus - Alexander KaigorodovMeet Magento Belarus - Alexander Kaigorodov
Meet Magento Belarus - Alexander Kaigorodov
 
Batch processing in rails
Batch processing in railsBatch processing in rails
Batch processing in rails
 
Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016
 
Лекция Android
Лекция AndroidЛекция Android
Лекция Android
 
Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
 
Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.
 
Scala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentScala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application Development
 
RDSDataSource: Promises
RDSDataSource: PromisesRDSDataSource: Promises
RDSDataSource: Promises
 
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
 
Tdd webpack + testem + mocha + chai
Tdd webpack + testem + mocha + chaiTdd webpack + testem + mocha + chai
Tdd webpack + testem + mocha + chai
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Mink
 
GitLab, Prometheus и Grafana с Kubernetes
GitLab, Prometheus и Grafana с KubernetesGitLab, Prometheus и Grafana с Kubernetes
GitLab, Prometheus и Grafana с Kubernetes
 
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
 
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
 
Yii development
Yii developmentYii development
Yii development
 

Mehr von SQALab

Готовим стажировку
Готовим стажировкуГотовим стажировку
Готовим стажировкуSQALab
 
Куда приводят мечты? или Искусство развития тестировщика
Куда приводят мечты? или Искусство развития тестировщикаКуда приводят мечты? или Искусство развития тестировщика
Куда приводят мечты? или Искусство развития тестировщикаSQALab
 
Оптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержкиОптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержкиSQALab
 
Автоматизация 0.0: 0 - бюджет, 0 - опыт программирования
Автоматизация 0.0: 0 - бюджет, 0 - опыт программированияАвтоматизация 0.0: 0 - бюджет, 0 - опыт программирования
Автоматизация 0.0: 0 - бюджет, 0 - опыт программированияSQALab
 
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...SQALab
 
Continuous performance testing
Continuous performance testingContinuous performance testing
Continuous performance testingSQALab
 
Конфиги вместо костылей. Pytestconfig и зачем он нужен
Конфиги вместо костылей. Pytestconfig и зачем он нуженКонфиги вместо костылей. Pytestconfig и зачем он нужен
Конфиги вместо костылей. Pytestconfig и зачем он нуженSQALab
 
Команда чемпионов в ИТ стихии
Команда чемпионов в ИТ стихииКоманда чемпионов в ИТ стихии
Команда чемпионов в ИТ стихииSQALab
 
API. Серебряная пуля в магазине советов
API. Серебряная пуля в магазине советовAPI. Серебряная пуля в магазине советов
API. Серебряная пуля в магазине советовSQALab
 
Добиваемся эффективности каждого из 9000+ UI-тестов
Добиваемся эффективности каждого из 9000+ UI-тестовДобиваемся эффективности каждого из 9000+ UI-тестов
Добиваемся эффективности каждого из 9000+ UI-тестовSQALab
 
Делаем автоматизацию проектных KPIs
Делаем автоматизацию проектных KPIsДелаем автоматизацию проектных KPIs
Делаем автоматизацию проектных KPIsSQALab
 
Вредные привычки в тест-менеджменте
Вредные привычки в тест-менеджментеВредные привычки в тест-менеджменте
Вредные привычки в тест-менеджментеSQALab
 
Мощь переполняет с JDI 2.0 - новая эра UI автоматизации
Мощь переполняет с JDI 2.0 - новая эра UI автоматизацииМощь переполняет с JDI 2.0 - новая эра UI автоматизации
Мощь переполняет с JDI 2.0 - новая эра UI автоматизацииSQALab
 
Как hh.ru дошли до 500 релизов в квартал без потери в качестве
Как hh.ru дошли до 500 релизов в квартал без потери в качествеКак hh.ru дошли до 500 релизов в квартал без потери в качестве
Как hh.ru дошли до 500 релизов в квартал без потери в качествеSQALab
 
Стили лидерства и тестирование
Стили лидерства и тестированиеСтили лидерства и тестирование
Стили лидерства и тестированиеSQALab
 
"Давайте не будем про качество"
"Давайте не будем про качество""Давайте не будем про качество"
"Давайте не будем про качество"SQALab
 
Apache.JMeter для .NET-проектов
Apache.JMeter для .NET-проектовApache.JMeter для .NET-проектов
Apache.JMeter для .NET-проектовSQALab
 
Тестирование геолокационных систем
Тестирование геолокационных системТестирование геолокационных систем
Тестирование геолокационных системSQALab
 
Лидер или босс? Вот в чем вопрос
Лидер или босс? Вот в чем вопросЛидер или босс? Вот в чем вопрос
Лидер или босс? Вот в чем вопросSQALab
 
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...SQALab
 

Mehr von SQALab (20)

Готовим стажировку
Готовим стажировкуГотовим стажировку
Готовим стажировку
 
Куда приводят мечты? или Искусство развития тестировщика
Куда приводят мечты? или Искусство развития тестировщикаКуда приводят мечты? или Искусство развития тестировщика
Куда приводят мечты? или Искусство развития тестировщика
 
Оптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержкиОптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержки
 
Автоматизация 0.0: 0 - бюджет, 0 - опыт программирования
Автоматизация 0.0: 0 - бюджет, 0 - опыт программированияАвтоматизация 0.0: 0 - бюджет, 0 - опыт программирования
Автоматизация 0.0: 0 - бюджет, 0 - опыт программирования
 
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
 
Continuous performance testing
Continuous performance testingContinuous performance testing
Continuous performance testing
 
Конфиги вместо костылей. Pytestconfig и зачем он нужен
Конфиги вместо костылей. Pytestconfig и зачем он нуженКонфиги вместо костылей. Pytestconfig и зачем он нужен
Конфиги вместо костылей. Pytestconfig и зачем он нужен
 
Команда чемпионов в ИТ стихии
Команда чемпионов в ИТ стихииКоманда чемпионов в ИТ стихии
Команда чемпионов в ИТ стихии
 
API. Серебряная пуля в магазине советов
API. Серебряная пуля в магазине советовAPI. Серебряная пуля в магазине советов
API. Серебряная пуля в магазине советов
 
Добиваемся эффективности каждого из 9000+ UI-тестов
Добиваемся эффективности каждого из 9000+ UI-тестовДобиваемся эффективности каждого из 9000+ UI-тестов
Добиваемся эффективности каждого из 9000+ UI-тестов
 
Делаем автоматизацию проектных KPIs
Делаем автоматизацию проектных KPIsДелаем автоматизацию проектных KPIs
Делаем автоматизацию проектных KPIs
 
Вредные привычки в тест-менеджменте
Вредные привычки в тест-менеджментеВредные привычки в тест-менеджменте
Вредные привычки в тест-менеджменте
 
Мощь переполняет с JDI 2.0 - новая эра UI автоматизации
Мощь переполняет с JDI 2.0 - новая эра UI автоматизацииМощь переполняет с JDI 2.0 - новая эра UI автоматизации
Мощь переполняет с JDI 2.0 - новая эра UI автоматизации
 
Как hh.ru дошли до 500 релизов в квартал без потери в качестве
Как hh.ru дошли до 500 релизов в квартал без потери в качествеКак hh.ru дошли до 500 релизов в квартал без потери в качестве
Как hh.ru дошли до 500 релизов в квартал без потери в качестве
 
Стили лидерства и тестирование
Стили лидерства и тестированиеСтили лидерства и тестирование
Стили лидерства и тестирование
 
"Давайте не будем про качество"
"Давайте не будем про качество""Давайте не будем про качество"
"Давайте не будем про качество"
 
Apache.JMeter для .NET-проектов
Apache.JMeter для .NET-проектовApache.JMeter для .NET-проектов
Apache.JMeter для .NET-проектов
 
Тестирование геолокационных систем
Тестирование геолокационных системТестирование геолокационных систем
Тестирование геолокационных систем
 
Лидер или босс? Вот в чем вопрос
Лидер или босс? Вот в чем вопросЛидер или босс? Вот в чем вопрос
Лидер или босс? Вот в чем вопрос
 
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
 

Автотестирование веб-сервиса с Ruby и Rspec

  • 2. Игорь Любин  Канд. физ.-мат. наук  Тестировщик с 1.12.2007  SQAdays 3, 5, 8, 9, 10! 2
  • 3. 3
  • 4. Рассказать о своей работе  На примере автоматизации веб-сервиса  Получить обратную связь 4
  • 5. UI 5
  • 6. Data Server xml Downloader json Web 6
  • 7. Язык Библиотеки Драйвер Фреймворк Из презентации А. Баранцева 7
  • 8. Webrick Ruby Iconv Helpers Rspec 8
  • 9. DataServer Downloader xml json … Helper Helper 9
  • 10. WEBrick::HTTPServer.new(:DocumentRoot=>dir).start DataServer Downloader xml json … Helper Helper @data_server.start 10
  • 11. XML JSON DataServer Downloader xml json … Helper Helper schedule = Schedule.new(Time.now + 1.day) 11
  • 12. XML DataServer Downloader xml json … Helper Helper @data_server.create_schedule(schedule) 12
  • 13. DataServer Downloader xml json … Helper Helper act_schedule = @downloader.download_schedule(schedule) 13
  • 14. JSON DataServer Downloader xml json … Helper Helper act_schedule.should == schedule.expected 14
  • 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
  • 21. <?xml version="1.0" encoding="windows-1251"?> <Grid> <Event>…</Event> Event <Event>…</Event> <Event>…</Event> Iconv <Event>…</Event> <Event>…</Event> <Event>…</Event> … </Grid> 21
  • 22. <Event> __DAY__ <ID>33894863</ID> <DayNo> ... </DayNo> <Start>__DAY__ 07:00:00</Start> <Finish>__DAY__ 07:15:00</Finish> <Star>0</Star> <Name>Test Name</Name> <Info id="89724" type="2"> ... </Info> <Flag><ID>4</ID><Name>Инфо</Name></Flag> <Location> Event <ID> ... </ID> <Type>1</Type> </Location> <Gate> ... <Info>Test Description</Info> ... </Gate> <Type ... >other</Type> </Event> 22
  • 23. [ { "name": "Test Name", "id": "33894863", "beginning": "__DAY__ 07:00:00", Event "ending": "__DAY__ 07:15:00", "description": "Test Description", "type": "other" }, … ] 23
  • 24. Данные Тестируем как name, description текстовые поля beginning - ending интервал времени id числовое поле 24
  • 25. Нормальное название  Длинное название  Стандартные разделители  “‘`|/,;:&<>^*!?«»  Пустое название  Пробелы  ЧуВсТвИтЕлЬнОсТь К рЕгИсТрУ  Окончания строк  ^M, n, r  Диакритические знаки  àáâãäå  Плохие символы  ♂♠♪  Греческий, арабский, китайский  Другая кодировка  Плохое выражение  “[|]’~<!--@/*$%^&#*/()?>,.*/--> 25
  • 26. 1. Учить язык программирования 2. Использовать готовые библиотеки 3. Писать обертки 4. Отделять данные от тестов 5. Не забывать о «тестировании по выходу» 26
  • 27. Ruby  Вики-учебник http://ru.wikibooks.org/wiki/Ruby  Упражнения http://rubymonk.com  Rspec  http://kerryb.github.com/iprug-rspec-presentation  Контакты  E-mail: ilyubin@yandex.ru  Skype: igor.lyubin 27

Hinweis der Redaktion

  1. Добрый день, уважаемые коллеги! Давайте начнем.Мой доклад называется &quot;Автотестирование веб-сервиса с помощью Ruby и Rspec&quot;. Но для начала давайте познакомимся.Я хотел бы узнать кто пришел на доклад.Кто из Вас занимается автоматизацией тестирования?Кто работает с Linux?Кто из Вас знает Ruby?
  2. Теперь я расскажу немного о себе, чтобы вы знали кто я и почему вообще что-то рассказываю.Меня зовут Игорь Любин. Я закончил Казанский Государственный университет и имею степень кандидата физико-математических наук. В тестировании я работаю ровно 4 года, начал свою карьеру в Казани, учился в Санкт-Петербурге. Участвовал в конференциях SQAdays, был и докладчиком и организатором.
  3. Последние полгода я живу в Москве и работаю в компании undev.ru. Наша компания занимается разработкой различных интернет-проектов.Основным языком разработки является Ruby. У нас работает самая большая команда Ruby разработчиков в Москве.
  4. Цель этого доклада рассказать о своей работе. На примере из своей работы я покажу решение как можно автоматизировать веб-сервисы. Расскажу как написать свои обертки (helperы) на функциями сервиса, расскажу как организовать тесты, тестовые данные и сам тестовый проект в целом. Ну и в конце хотел бы получить обратную связь и узнать ваши мысли по этому поводу.
  5. На практике встречаются проекты с массой бек-энд сервисов, и порой всю работу вашего приложения не видно через UI. Здесь UI лишь вершина айсберга. От нашего взгляда бывает скрыта масса различного рода сервисов. Для их проверки ручного тестирования через UI явно недостаточно. Для более качественной проверки прибегают к компонентному тестированию при помощи автоматизации.Для своего рассказа я выбрал один из таких сервисов, который скрыт глубоко под капотом.
  6. Это сервис по скачиванию расписаний. На рисунке я его изобразил &quot;черным ящиком&quot;. Он взаимодействует с 2-мя компонентами.Data Server- это сторонний сервер, который у себя выкладывает расписание событий в XML формате.Наш downloader ходит к этому DSyза расписанием событий, скачивает их, затем обрабатывает полученные данные, урезает их и в виде json файлов отправляет дальше в Web.Вот такой сервис, которому на вход приходит XML, а на выходе получается json, и надо тестировать. Как сказал выше здесь надо писать автоматизацию.
  7. В моем случае язык программирования был жестко определен, практически без вариантов. Ruby надо сказать не самый плохой язык для программирования.Я использовал библиотеки из Ruby. Webrick - для написания эмулятора веб-сервера, iconv - для работы с кодировками.Фреймворком для запуска тестов был выбран rspec. Наиболее популярный для ruby, и что не мало важно по rspecу есть достаточно хорошей документации и примеров. На последнем слайде будет ссылка на один из них. Фреймворк я сам не писал, взял готовый.А вот драйвера готового нет, здесь я писал свои обертки над приложением, так называемые helperы.
  8. Имеющуюся архитектуру тестового приложения мы проектируем в свои тесты и создаем над каждым имеющимся объектом, над каждой сущностью обертку. Так я получаю 2 будущих класса, с которыми буду работать в тестах. Интересующий нас DownloaderHelper и эмулятор DataServerHelper.В этих классах я описываю команды для взаимодействия с реальными сервисами.Эмулятор DSHнеобходим поскольку мы не можем на реальный сервер выкладывать свои тестовые данные.
  9. Мы можем написать свой веб-сервер. С помощью webrick это делается буквально в одну строчку.А в конфигеdownloaderа прописываем, что теперь расписания надо скачивать по адресу нашего эмулятора.
  10. Перед тем как тестировать нужно подготовить тестовые данные. Это я делаю следующим образом. Я подготавливаю пару файловXML-JSON.XML – я буду выкладывать на веб сервер.JSON – я буду сравнивать с тем что получается в результате теста.Причем в тестах я не буду явно использовать ссылки на XML и JSON. О них будет знать только объект Schedule, который я буду создавать перед тестом. И лишь он будет содержать всю информацию о расписаниях. На какой день мы создаем расписание, какую XML берем и с каким JSON сравниваем.Итак имея заготовленные тестовые данные…
  11. Мы запускаем веб сервер, и выкладываем на нем XMLрасписания. Просто копируем заранее заготовленный файл с XML в папку вебсервера.
  12. Затем просим наш downloader скачать эту XML. Мы вызываем команду закачки у нашего веб-сервиса, ждем достаточное время, переодически опрашивая веб-сервис не скачал ли он расписание. И как только он скачал возвращаем результат в переменную – актуальное раписание.
  13. И последним шагом мы производим проверку только что скаченного расписания с заранее заготовленным файлом.Причем сравниваем не строки содержащие JSON, а преобразуем JSON в хеш, ассоциативный массив. И сравниваем массивы друг с другом.
  14. Только что описанная процедура записывается в виде rspecтеста следующим образом.В rspecмы делаем описание нашего downloaderа. Этот тест говорит нам что downloader должен уметь скачивать расписания на завтра.
  15. В начале теста есть 2 блока before.Before :all выполняется 1 раз перед всеми тестами.В нем мы создаем экземпляры наших объектов с которыми будем работать в тесте. И запускаем веб-сервер.Before :each выполняется перед каждым тестом. И перед каждым тестом мы осуществляем очистку состояний, на веб-сервере мы удаляем все старые файлы XMLек от предыдущих тестов, а у downloaderа чистим очередь работ по закачиванию.
  16. В конце теста есть блок after :all. В котором мы останавливаем запущенный в начале теста веб-сервер.
  17. Теперь разберем что происходит в тесте.Сначала мы создаем расписание на завтра. Затем выкладываем расписание на веб-сервер. Даунлоадер скачивает расписание. И в конце мы производим проверку актуального расписания с ожидаемым.Думаю тест понятен. Все почти на понятном английском.