Яка різниця між RSpec та огірком? [зачинено]


114

У мене є 6 місяців досвіду розробки Rails. Я створив веб-додаток, який зараз використовується з аутентифікацією та авторизацією та postgresql db.

Я переходжу до свого другого додатка Rails, але цього разу, після засвоєних уроків, я хотів би розробити його за допомогою TDD, оскільки помітив його набагато простіше масштабувати його та виправляти помилки. Розвиватися це повільно, але в кінцевому рахунку з цим набагато простіше впоратися.

Я чув про Rspec та огірок, але їх ретельно збентежив.

Я хотів би знати, в чому різниця між RSpec та огірком і для чого вони використовуються.

Було б також корисно знати, чи з точки зору початківця (який також є єдиним розробником), чи дійсно потрібен тестовий фреймворк.


6
Щоб вас ще більше бентежить, Minitest також може бути варіантом
lucas clemente

5
Capybara - це справді драйвер, який можна використовувати в будь-якій із тестових рамок, а не сам по собі. Watir-webdriver і Selenium - це дві речі, які виконують подібні функції, але запускають справжній браузер і набагато повільніше, ніж Capybara за допомогою Rack :: Test
DVG

37
Як це не конструктивно ???
Jason Swett

19
Чудове запитання та чудова відповідь. Це саме те, що мені було потрібно. Мене бентежить закриття питання як неконструктивного. Кому байдуже, чи збирається вимагати дебатів? Ось для чого голосує громада.
dpurrington

14
Голосування за повторне відкриття, на мою думку, основа для закриття питання є чудовою. На це напевно можна (і було!) Відповісти, використовуючи "підтримані фактами, посиланнями або експертними знаннями", і будь- яке питання StackOverflow, можливо, "може викликати дискусії, аргументи, опитування" (які ми всі знаємо і бачили). Щодо "опитування"? Хто є способом функціонування SO - це проголошення та заборона на запитання та відповіді. Це в основному одне велике опитування. Закрити це було непросто. Це корисна допомога, на тему питання та відповіді.
Адам Кемерон

Відповіді:


323

RSpec та огірок - це тестувальні рамки. RSpec включає традиційне тестування модулів (що означає тестування класу або частини програми ізольовано від решти програми. Отже, ваша модель робить те, що повинна робити ваша модель, контролер робить те, що має робити, тощо).

І RSpec, і огірок використовуються для тестування прийнятності (що називається ATDD, BDD, специфікація за прикладом тощо, залежно від того, кого ви запитуєте). Це інтеграційні тести, орієнтовані на бізнес-кейси, які означають, що вони імітують спосіб використання користувачем програми та повного стеку Rails, тому проблеми з тим, як різні частини вашої програми працюють разом, можуть бути виявлені таким чином, що тестування одиниць не буде знайти.

Основна відмінність RSpec від огірка - це коефіцієнт читабельності бізнесу. Основний малюнок огірка полягає в тому, що специфікація (особливості) є окремими від тестового коду, тому власники ваших продуктів можуть надати або переглянути специфікацію без необхідності копати код. Це файли .feature, які ви створюєте в огірку. RSpec має подібний механізм, але замість цього ви описуєте крок із блоком Описувати, Контекст або Він, який містить специфікацію бізнесу, а потім негайно мати код, який виконує цей оператор. Такий підхід розробникам трохи легше працювати, але трохи не важче для нетехнічних людей.

Який використовувати? Якщо ви єдиний розробник та власник продукту, тоді я б дотримувався RSpec, я вважаю, що технічній особі легше зрозуміти, пропонує кілька переваг у контролі над речами та під контролем, а також не заважати RegExs для тестування кроки. Якщо ви будуєте це для клієнта, і вони практичні щодо Технічної специфікації, перейдіть з огірком для вашого тесту на прийняття та використовуйте RSpec для тестів одиниць.

Просто, щоб продемонструвати головну різницю між ними:

Огірок:

#articles.feature
Given an article exists called "Testing Demonstration"
When I visit the list of articles
Then I should see an article called "Testing Demonstration"

#article_steps.rb
Given /^an article exists called "(.+)"$/ do |title|
  FactoryGirl.create(:article, title: title)
end 
When /^I visit the list of articles$/ do
  visit articles_path
end
Then /^I should see an article called "(.+)"$/ do |title|
  page.should have_content title
end

Rspec

describe "Articles" do
  let(:article) { FactoryGirl.create(:article) }
  context "Index Page" do
    before { visit articles_path }
    it { page.should have_content article.title }
  end
end

Ця серія блогів чудово підходить для роботи з RSpec.


24
Це відмінна відповідь. Дуже дякую за ваш час та поради. Є багато книг про рейки, які я читав, але до цих пір не знайшов жодної, яка б робила такі види розрізнень і пояснювала, що це таке. Ще раз
дякую

2
Я не міг порекомендувати цю відповідь тим менше, хто потребує. Дякую за деталі!
Ікон

3
Це справді одна з найбільш вичерпних і легких для розуміння відповідей на stackoverflow (разом із чудовим прикладом!)
Sheharyar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.