Краткая версия моего вопроса:
В тестах Cucumber, написанных для одностраничного веб-приложения Angular, как мне выполнить задачи, обычно выполняемые в «заданном» разделе сценария (например, настройка тестовых данных, определение ассоциаций записей базы данных и обеспечение чистого состояния базы данных между тестами ) при тестировании полного стека, как интерфейсного приложения, так и его серверной части? Исходный код приложения хранится в двух отдельных репозиториях Git: один для интерфейсного приложения, а другой - для внутреннего. Серверная часть написана на Ruby с использованием гема Rails API. Проблема тестирования полного стека этого приложения связана с тем, что это фактически два приложения, в отличие от более традиционного приложения Ruby on Rails, не реализованного как одностраничное приложение.
Полная версия моего вопроса:
Я хочу написать серию тестов Cucumber для веб-приложения. Приложение состоит из внешнего одностраничного приложения, написанного на Angular, и внутреннего API, написанного с использованием Rails API. Исходный код для внешнего интерфейса и исходный код для внутреннего интерфейса находятся в своих собственных репозиториях Git, обеспечивая четкое разделение между двумя базами кода. Кроме того, приложение использует MySQL и Elasticsearch.
Раньше я использовал Cucumber в предыдущих проектах Ruby on Rails. Эти проекты не разрабатывались как одностраничные приложения. В этих проектах было легко создавать объекты Ruby в качестве тестовых данных в определениях шагов Cucumber. Например, рассмотрим следующий файл функций из проекта Rails, который не был одностраничным приложением:
# features/home_page.feature
Feature: Home page
Scenario: Viewing application's home page
Given there's a post titled "My first" with "Hello, BDD world!" content
When I am on the homepage
Then I should see the "My first" post
Шаги в этом файле функций могут быть реализованы с помощью следующих определений шагов:
# features/step_definitions/home_page_steps.rb
Given(/^there's a post titled "(.*?)" with "(.*?)" content$/) do |title, content|
@post = FactoryGirl.create(:post, title: title, content: content)
end
When(/^I am on the homepage$/) do
visit root_path
end
Then(/^I should see the "(.*?)" post$/) do |title|
@post = Post.find_by_title(title)
page.should have_content(@post.title)summary of the question
page.should have_content(@post.content)
end
В проектах Ruby on Rails, которые не были разработаны как одностраничные приложения, инструменты тестирования могут быть включены в проект как драгоценные камни Ruby. Для меня эти инструменты включают:
group :test do
gem 'shoulda-matchers'
gem 'cucumber-rails', require: false
gem 'database_cleaner'
gem 'selenium-webdriver'
end
group :development, :test do
gem 'factory_girl_rails'
end
Как видите, это включает Factory Girl, используемую для настройки объектов Ruby в качестве тестовых данных и определения ассоциаций записей базы данных, и Database Cleaner, используемую для обеспечения чистого состояния базы данных между тестами. Включение Selenium WebDriver требуется для сценариев Cucumber, использующих JavaScript.
В случае моего одностраничного приложения ситуация иная. Как описано выше, приложение разбито на две отдельные базы кода: одну для внешнего одностраничного приложения Angular, а другую - для внутреннего интерфейса Rails API.
Однако одностраничные приложения, такие как мой проект, по-прежнему имеют те же требования к тестированию, что и более традиционные приложения Rails, не созданные как одностраничные приложения. Необходимо протестировать полный стек приложения, чтобы убедиться, что каждый компонент, как внешний, так и внутренний, работают вместе, как ожидалось. Необходимо будет определить шаги Cucumber, которые создают «заданные» предварительные условия перед тестом, и необходимо будет обеспечить чистую базу данных между тестами.
Как мне протестировать с помощью Cucumber такое приложение, как это, с двумя базами кода, реализованное как одностраничное приложение? Для JavaScript доступна версия Cucumber под названием CucumberJS. Однако я не знаю, как создавать фикстуры, ассоциации записей и обеспечивать чистую базу данных между тестами с помощью CucumberJS. Также существует инструмент для тестирования JavaScript, написанный на Angular, под названием Protractor. Я предполагаю, что этот инструмент заменит Selenium WebDriver.