2015-01-30 34 views
13

Moje bardzo proste specyfikacje funkcji przechodzą dobrze, ale lokalnie, ale zawieszają się w CircleCI i Codeship. Testy, które są upadające:Specyfikacja funkcji kończy się niepowodzeniem tylko w przypadku usług ciągłej integracji CircleCI lub Codeship

require 'spec_helper' 

describe 'Authentication' do 

    describe "sign in" do 
    it "is the landing page for non-authenticated users" do 
     user = create(:user) 
     visit root_path 

     expect(page).to have_content 'LOG IN' # On sign-in page 
     fill_in 'Email', with: user.email 
     fill_in "Password", with: user.password 
     click_button 'Sign in' 

     expect(current_path).to eq user_path(user) 
    end 
    end 

    describe 'registration' do 
    it "allows new users to register" do 
     visit root_path 

     click_link 'Sign up' 
     fill_in 'Email', with: '[email protected]' 
     fill_in 'Password', with: 'password' 
     fill_in 'Password confirmation', with: 'password' 
     fill_in 'First name', with: 'John' 
     fill_in 'Last name', with: 'Doe' 
     click_button "Sign up" 

     expect(current_path).to include '/users/' 
     expect(page).to have_content "Welcome! You have signed up successfully." 
    end 
    end 
end 

testów zarówno zawieść na pierwszych liniach gdzie określonych oczekiwań stron (expect(page).to have_content "LOG IN" i click_link "Sign up", odpowiednio), z błędów sugerujących HTML strony jest całkowicie pusta:

expected to find text "LOG IN" in "" 

Zapisałem zrzuty ekranu w CircleCI i rzeczywiście pokazują całkowicie pustą stronę.

Oto, gdzie to staje się interesujące. Próbowałem debugowania problemu przez running/watching the specs on Circle using a VNC. Kiedy a) ustawić driver: :selenium Do testów b) dodać sleep 1 lub dwa do testów przed badaniem oczekiwania stron, a c) ręcznie uruchomić test po SSHing na swoich serwerach z VNC, mogę zobacz testy uruchomione w Selenium (otwierają przeglądarkę w VNC) i przechodzą perfekcyjnie.

Jednak poza VNC testy kończą się niepowodzeniem w obu serwerach CI. Z lub bez ton sleep s i driver: :selenium. Jakieś pomysły, które mogą powodować tę rozbieżność między zwykłymi serwerami CircleCI/Codeship a ich VCN/moim lokalnym środowiskiem testowym? Skontaktowałem się z ludźmi z CircleCI, ale oni są na moment zaskoczeni.

stosownych przypadkach, biegnę Ruby 2.2.0, Rails 4.2, 2.4.4 Kapibara, Kapibara-Webkit 1.4.1 i selen Webdriver 2.44.0

Niektóre potencjalnie odpowiednie pliki :

spec_helper.rb

ENV["RAILS_ENV"] = "test" 

require File.expand_path("../../config/environment", __FILE__) 

require "rspec/rails" 
require "shoulda/matchers" 
require "webmock/rspec" 
require 'vcr' 

Dir[Rails.root.join("spec/support/**/*.rb")].each { |file| require file } 

module Features 
    include Warden::Test::Helpers 
    Warden.test_mode! 

    def sign_in(user) 
    login_as(user, scope: :user) 
    end 
end 

module Controllers 
    # Pre-parse controller responses for easy access 
    def response_body 
    body = JSON.parse(response.body) 
    body.is_a?(Hash) ? body.to_sh : body.map(&:to_sh) 
    end 
end 

module Mock 
    def disable_webmock(&block) 
    WebMock.disable! 
    yield 
    WebMock.enable! 
    end 
end 

RSpec.configure do |config| 
    config.expect_with :rspec do |c| 
    c.syntax = :expect 
    end 

    # Save a screenshot to CircleCI when a feature test fails 
    config.after(:each, :type => :feature) do |example| 
    if example.exception 
     artifact = save_page 
     puts "\"#{example.description}\" failed. Page saved to #{artifact}" 
    end 
    end 

    config.include Features, type: :feature 
    config.include Controllers, type: :controller 
    config.include Mock 
    config.include Formulaic::Dsl, type: :feature 
    config.infer_spec_type_from_file_location! 
    config.infer_base_class_for_anonymous_controllers = false 
    config.order = "random" 
    config.use_transactional_fixtures = false 
end 

RSpec::Matchers.define :hash_eq do |expected| 
    match do |actual| 
    actual.recursive_symbolize_keys == expected.recursive_symbolize_keys 
    end 
end 

VCR.configure do |c| 
    c.cassette_library_dir = 'spec/fixtures/vcr_cassettes' 
    c.hook_into :webmock 
    c.allow_http_connections_when_no_cassette = true 
    c.configure_rspec_metadata! 
    c.ignore_hosts '127.0.0.1', 'localhost:3000' 
end 

ActiveRecord::Migration.maintain_test_schema! 
Capybara.javascript_driver = :webkit 

if ENV['CIRCLE_ARTIFACTS'] 
    Capybara.save_and_open_page_path = ENV['CIRCLE_ARTIFACTS'] 
end 

WebMock.disable_net_connect!(allow_localhost: true) 

database_cleaner.rb

RSpec.configure do |config| 
    config.use_transactional_fixtures = false 

    config.before(:suite) do 
    DatabaseCleaner.strategy = :truncation 
    end 

    config.before(:each) do 
    DatabaseCleaner.start 
    end 

    config.after(:each) do 
    DatabaseCleaner.clean 
    end 

end 
+0

Może to być problem z konfiguracją CircleCI. Czy możesz również udostępnić swój plik cicle.yml? –

+0

Czy korzystasz z usługi bezgłowej lub usługi Saas? Większość z tych programów CI jest czysto bezgłowych i nie można uruchomić czegoś takiego jak selen bez jakiejś prawdziwej pracy. – TIMBERings

+0

Jeśli używasz selenu, możesz wypróbować przeglądarkę Firefox 28.0. – juanitofatas

Odpowiedz

2

Mogę myśleć o kilka rzeczy, aby spróbować:

  • Jeśli chcesz, aby Twoje specyfikacje uruchomić bez głowy, spróbuj użyć poltergeist zamiast Kapibara-WebKit. poltergeist ma kilka zalet, które opisałem tutaj: https://stackoverflow.com/a/24108439/634576
  • Selen może po prostu rozproszyć, ale jeśli chcesz go uruchomić, upewnij się, że twoje środowisko CI ma odpowiednią wersję przeglądarki Firefox. Każda wersja selenu-webdrivera wydaje się wymagać wąskiego zakresu wersji Firefoksa. On CircleCI, you can configure circle.yml to install a specific version of Firefox. Teraz używamy selenu webdriver 2.46.2 i Firefox 39.0.3, zainstalowany z następujących w circle.yml:

    dependencies: 
        pre: 
        - sudo apt-get update; sudo apt-get install firefox=39.0.3+build2-0ubuntu0.12.04.1 
    

    nie wiem o Codeship.