Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Автоматизация тестирования в RoR

D83b63db79b42978fe35e120550ca180?s=47 Anton Kaliaev
September 29, 2012

Автоматизация тестирования в RoR

В рамках данного доклада я расскажу об истории тестирования и его будущем. Также будут рассмотрены основные библиотеки (гемы), активно используемые при тестировании приложений, написанных на Ruby и Ruby on Rails.

D83b63db79b42978fe35e120550ca180?s=128

Anton Kaliaev

September 29, 2012
Tweet

Transcript

  1. Автоматизация тестирования в RoR Chebit, 29 сентября 2012

  2. Антон Каляев github.com/akalyaev twitter.com/AntonKalyaev

  3. Зачем вообще писать тесты?

  4. → рефакторинг без страха → уменьшение стоимости внесения изменений →

    документирование кода → … → хороший сон → счастливый брак
  5. Давным давно…

  6. 1980 2000 2012 В 80-х годах…

  7. 1980 2000 2012 Юнит-тесты с использованием Job Control Language (JCL)

    Программирова ние мейнфреймов IBM
  8. 1980 2000 2012 //IS198CPY JOB (IS198T30500),'COPY JOB',CLASS=L,MSGCLASS=X //COPY01 EXEC PGM=IEBGENER

    //SYSPRINT DD SYSOUT=* //SYSUT1 DD DSN=IS198.TEST.INPUT,DISP=SHR //SYSUT2 DD DSN=IS198.TEST.OUTPUT, // DISP=(NEW,CATLG,DELETE), // SPACE=(CYL,(40,5),RLSE), // DCB=(LRECL=115,BLKSIZE=0), // DATACLAS=SEQFB //SYSIN DD DUMMY // Копирование одного набора данных в другой на JCL
  9. Позднее…

  10. 1980 2000 2012 В 2000-х…

  11. 1980 2000 2012 JAVA Использование JUnit в рамках TDD и

    XP
  12. Еще позднее…

  13. 1980 2000 2012 Настоящее время…

  14. 1980 2000 2012 Ruby + Ruby on Rails Встроенные юнит,

    функциональные и интеграционные тесты
  15. MINITEST https://github.com/seattlerb/minitest

  16. реализация xUnit “minitest provides a complete suite of testing facilities

    supporting TDD, BDD, mocking, and benchmarking.”
  17. замена Test::Unit начиная с Ruby 1.9

  18. class TestSomething < Test::Unit::TestCase def test_foo foo = Foo.new assert

    foo bar = nil assert_nil bar assert_equal true, false end end
  19. RSPEC https://github.com/rspec/rspec

  20. DSL для тестирования поведения системы “RSpec is testing tool for

    the Ruby programming language. Born under the banner of BDD, it is designed to make TDD a productive and enjoyable”
  21. к примеру, это может быть спецификация контроллера

  22. describe WidgetsController do describe "GET index" do it "assigns all

    widgets to @widgets" do widget = create(:widget) get :index assigns(:widgets).should eq([widget]) end end end
  23. или модели …

  24. describe Article do describe ".recent" do it "includes articles published

    less than one week ago" do article = create(:article, published_at: Date.today - 1.week + 1.second) Article.recent.should eq([article]) end it "excludes articles published at midnight one week ago" do article = create(:article, published_at: Date.today - 1.week) Article.recent.should be_empty end end end
  25. А также роутинга, хэлперов и представлений

  26. FACTORY_GIRL https://github.com/thoughtbot/factory_girl

  27. DSL для генерации объектов ActiveRecord “factory_girl is a fixtures replacement

    with a straightforward definition syntax, support for multiple build strategies, and support for multiple factories for the same class, including factory inheritance.”
  28. require 'factory_girl‘ FactoryGirl.define do factory :user do name 'John Doe'

    date_of_birth { 21.years.ago } end end user = build(:user) user = create(:user) attrs = attributes_for(:user)
  29. MOCKS

  30. изображают реальные объекты

  31. позволяют изолировать приложение от внешних сервисов

  32. • Rspec::Mocks • Mocha • Minitest::Mock Популярные библиотеки:

  33. GUARD https://github.com/guard/guard

  34. отслеживание изменений в системе и не только “Guard is a

    command line tool to easily handle events on file system modifications.”
  35. → визуальная нотификация → перезапуск тестов при изменении → рестарт

    веб-сервера → Перекомпиляция Coffeescript и/или SCSS → Запуск shell команд при изменении
  36. CUCUMBER https://github.com/cucumber/cucumber

  37. None
  38. лучшая альтернатива Rspec Feature

  39. набор сценариев

  40. Функционал: Авторизация в системе Чтобы иметь возможность выполнять бизнесс операции,

    пользователь должен авторизоваться Сценарий: пользователь авторизуется в системе как работник Допустим "Сергей" является работником Если он заходит на страницу авторизации работника И вводит в поле "Email" свой email И вводит в поле "Пароль" свой пароль И нажимает "Войти" Тогда он должен быть на странице списка компаний
  41. может использоваться совместно с Capybara или Webrat

  42. CAPYBARA https://github.com/jnicklas/capybara

  43. симулирует действия браузера “Capybara helps you test Rails and Rack

    applications by simulating how a real user would interact with your app. It is agnostic about the driver running your tests and comes with Rack::Test and Selenium support built in.”
  44. используется в описании шагов Cucumber

  45. Допустим /^"(.*?)" является работником$/ do |first_name| Employee.create(first_name: first_name, last_name: 'Иванов',

    email: 'test@test.ru', password: '54321') end Если /^он заходит на страницу авторизации работника$/ do visit new_employee_session_path end Если /^вводит в поле "([^"]*)" свой email$/ do |email| fill_in(email, :with => 'test@test.ru') end Если /^нажимает "(.*)"$/ do |button| click_button(button) end Тогда /^он должен быть на странице списка компаний$/ do current_path == employee_companies_path end
  46. JASMINE https://github.com/pivotal/jasmine

  47. аналог RSpec для Javascript “Jasmine is a behavior-driven development framework

    for testing JavaScript code. It does not depend on any other JavaScript frameworks.”
  48. describe("A suite", function() { it("contains spec with an expectation", function()

    { expect(true).toBe(true); }); });
  49. Отлично подходит для API Не замена ручному тестированию Тоже программирование

    Автоматизированное тестирование
  50. Вопросы? twitter.com/AntonKalyaev anton.kalyaev@gmail.com homeonrails.com

  51. 1. Top 12 Reasons to Write Unit Tests http://onjava.com/pub/a/onjava/2003/04/02/javaxpckbk.html 2.

    Guard plugins https://rubygems.org/search?query=guard- Ссылки: