2015-01-30 3 views
13

Meine sehr grundlegenden Feature-Spezifikationen werden zwar lokal gut weitergegeben, aber bei CircleCI und Codeship fehlgeschlagen. Die Tests, die fehlschlagen:Feature-Spezifikationen schlagen nur bei CircleCI- oder Codeship-Integrationsservices fehl

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 

Die Tests sowohl auf den ersten Zeilen nicht, wo sie die Erwartungen der Seiten festgelegt (expect(page).to have_content "LOG IN" und click_link "Sign up", respectively), mit Fehlern der Seite HTML was darauf hindeutet, ist völlig leer:

expected to find text "LOG IN" in "" 

Ich habe Screenshots auf CircleCI gespeichert und sie zeigen tatsächlich eine komplett leere Seite.

Hier wird es interessant. Ich habe versucht, das Problem durch running/watching the specs on Circle using a VNC zu debuggen. Als ich a)driver: :selenium für die Tests eingestellt, b) ein sleep 1 oder zwei zu den Prüfungen hinzufügen, bevor Sie die Seite Erwartungen zu testen, und c) manuell den Test nach SSHing in ihre Server mit dem VNC laufen, kann ich Sehen Sie die Tests in Selenium (sie öffnen einen Browser in der VNC) und sie passen perfekt.

Außerhalb der VNC, jedoch die Tests in beiden CI-Servern konsistent fehlschlagen. Mit oder ohne Tonnen von sleep s und driver: :selenium. Irgendwelche Ideen, was diese Diskrepanz zwischen den regulären CircleCI/Codeship-Servern und ihrer VCN/meiner lokalen Testumgebung verursachen könnte? Ich habe mich mit den Leuten von CircleCI in Verbindung gesetzt, aber sie sind für den Moment ratlos.

Wenn relevant, ich bin mit Ruby-2.2.0, Rails 4.2, Capybara 2.4.4, Capybara-Webkit 1.4.1 und Selen-WebDriver 2.44.0

Einige potenziell relevante Dateien :

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

Dies könnte ein CircleCI-Konfigurationsproblem sein. Können Sie Ihre cicle.yml-Datei auch teilen? –

+0

Verwenden Sie Headless oder einen Saas-Service? Die meisten dieser CI-Programme sind rein kopflos und können so etwas wie Selen ohne echte Arbeit nicht ausführen. – TIMBERings

+0

Wenn Sie Selen verwenden, können Sie es mit Firefox 28.0 versuchen. – juanitofatas

Antwort

2

Ich kann von ein paar Dinge denken, um zu versuchen:

  • Wenn Sie möchten, dass Ihre Angaben zu bekommen ohne Kopf zu laufen, versuchen Poltergeist mit eher als Capybara-Webkit. poltergeist hat mehrere Vorteile, die ich hier beschrieben habe: https://stackoverflow.com/a/24108439/634576
  • Selen kann nur eine Ablenkung sein, aber, wenn Sie es zur Arbeit bringen wollen, stellen Sie sicher, dass Ihre CI-Umgebung die richtige Version von Firefox hat. Jede Version von selen-webdriver scheint eine enge Auswahl an Firefox-Versionen zu benötigen. On CircleCI, you can configure circle.yml to install a specific version of Firefox. Im Moment verwenden wir Selen-WebDriver 2.46.2 und Firefox 39.0.3, mit den folgenden in circle.yml installiert:

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

    Ich weiß nicht, über Codeship.