2012-12-23 7 views
4

저는 capybara-webkit을 사용하여 앱에 대한 현실감있는 테스트를 수행하고 있습니다. 앱이 매우 풍부한 JS 기반 UI를 특징으로하고 Rails 부분이 대부분 API 호출이기 때문에 이것은 절대적으로 필요합니다.레일즈 + 카피 바라 - 웹킷 - 자바 스크립트 코드 범위?

질문 : 자바 스크립트 코드를 입력하고 해당 범위를보고 할 수있는 테스트 파이프 라인에 통합 할 수있는 도구가 있습니까? 여기 핵심은 쉽게 테스트 워크 플로우 (rcov/simplecov처럼)에 쉽게 통합 할 수 있다는 점입니다. jscoverage 나 analog와 함께하는 아이디어가 마음에 들지 않습니다.

미리 감사드립니다.

+1

나는 또한 이것에 흥미가있다. 요청 사양에서 js 적용 범위를 달성 할 수 있는지 궁금하지 않으십니까? – steve

답변

0

업데이트 : JSCover 버전 1.05부터 시작하여 이전 답변에서 설명한 해킹은 더 이상 필요하지 않습니다. 이를 반영하여 답변을 업데이트했습니다.

나는 Rails + Capybara 파이프 라인에서 JSCover 작업을 할 수 있었지만 작동시키기 위해 해킹이 필요했습니다.

  1. 모든 파일을 기기에 자바 항아리를 호출하는 스크립트를 생성하고
  2. 가 jscover 패치 디렉토리 임시로 빈 보고서를 생성하기 위해 레일 자산 파이프 라인을 사용하여 좀 레이크 작업을 내장 .js 스크립트는 "report mode"에서 작동합니다 (끝에 jscoverage_isReport = true를 추가하면됩니다).
  3. 은/public/assets에 결과를 복사하여 테스트가 변경되지 않고 자동으로 적용 보고서를 자동으로 열 수 있도록합니다 브라우저에서

그런 다음 테스트 시작시 브라우저의 localStorage를 지우는 설정 작업과 마지막에 완성 된 보고서를 작성하는 teardown 작업을 추가했습니다.

def setup 
    unless $startup_once 
    $startup_once=true 
    puts 'Clearing localStorage' 
    visit('/') 
    page.execute_script('localStorage.removeItem("jscover");') 
    end 
end 
def teardown 
    out=page.evaluate_script("typeof(_$jscoverage)!='undefined' && jscoverage_serializeCoverageToJSON()") 
    unless out.blank? then 
    File.open(File.join(Rails.root,"public/assets/jscoverage.json"), 'w') {|f| f.write(out) } 
    end 
end 

어쨌든, 최종 결과가 잘 작동, 이런 식으로 일을의 장점은 또한 CI에 포함 할 수 있도록 그것은 또한 머리가없는 브라우저에서 작동한다는 것입니다.

*** 업데이트 2 : 다음의 단계를 자동화하는 레이크 작업이 이제 (트렁크) JSCover에 추가 된

# Coverage testing for JavaScript 
# 
# Usage: 
# Download JSCover from: http://tntim96.github.io/JSCover/ and move it to 
# ~/Applications/JSCover-1 
# First instumentalize the javascript files: 
# rake assets:coverage 
# Then run browser tests 
# rake test 
# See the results in the browser 
# http://localhost:3000/assets/jscoverage.html 
# Don't forget to clean up instrumentalization afterwards: 
# rake assets:clobber 
# Also don't forget to re-do instrumentalization after changing a JS file 


namespace :assets do 
    desc 'Instrument all the assets named in config.assets.precompile' 
    task :coverage do 
    Rake::Task["assets:coverage:primary"].execute 
    end 

    namespace :coverage do 
    def jscoverage_loc;Dir.home+'/Applications/JSCover-1/';end 
    def internal_instrumentalize 

     config = Rails.application.config 
     target=File.join(Rails.public_path,config.assets.prefix) 

     environment = Sprockets::Environment.new 
     environment.append_path 'app/assets/javascripts' 
     `rm -rf #{tmp=File.join(Rails.root,'tmp','jscover')}` 
     `mkdir #{tmp}` 
     `rm -rf #{target}` 
     `mkdir #{target}` 

     print 'Generating assets' 
     require File.join(Rails.root,'config','initializers','assets.rb') 
     (%w{application.js}+config.assets.precompile.select{|f| f.is_a?(String) && f =~ /\.js$/}).each do |f| 
     print '.';File.open(File.join(target,f), 'w') {|ff| ff.write(environment[f].to_s) } 
     end 
     puts "\nInstrumentalizing…" 
     `java -Dfile.encoding=UTF-8 -jar #{jscoverage_loc}target/dist/JSCover-all.jar -fs #{target} #{tmp} #{'--no-branch' unless ENV['C1']} --local-storage` 
     puts 'Copying into place…' 
     `cp -R #{tmp}/ #{target}` 
     `rm -rf #{tmp}` 
     File.open("#{target}/jscoverage.js",'a'){|f| f.puts 'jscoverage_isReport = true' } 

    end 

    task :primary => %w(assets:environment) do 
     unless Dir.exist?(jscoverage_loc) 
     abort "Cannot find JSCover! Download from: http://tntim96.github.io/JSCover/ and put in #{jscoverage_loc}" 
     end 
     internal_instrumentalize 
    end 

    end 

end 
+0

위 네 단계에 대해 작성한 레이크 작업을 공유 하시겠습니까? – sameers

+0

좋아, 내가 이것을 자동화하기 위해 사용하는 레이크 작업을 추가했다. 내 실제 설정에서 몇 가지 스위치를 추가하여 테스트 커버리지를 선택 사항으로 만들었습니다. 명확성을 위해 제거했습니다. –

+0

Dang, 멋지 네요! 그래서 Sprockets을 너무 잘 이해하지 못합니다. 코드에서 약간 유도해야 할 것이지만'precompile'에 이미'application.js'가 들어 있다고 가정하면,이 태스크는 벤더 JS 파일을 jQuery)도 마찬가지입니다. – sameers

1

/lib 디렉토리/작업이 드롭된다 - 관련 스레드에서 JSCover는 here입니다.

나는 레일 + 카피 바라 파이프 라인에서 작업 JSCover을 얻을 수 있었다, 그러나 는 그것이

이러한 변화는 JSCover의 트렁크에 지금 일하러 가야 해킹 꽤 걸릴 않았고 될 것입니다 버전 1.0.5의 일부. 실례 (Selenium IDE로 기록 된 예제 포함)와 문서도 있습니다.

이 쉽게이 새로운에서 사용되는이 작업을 수행하는 기능입니다

JSON으로 직렬화 할 수없는 객체를 사용하기 때문에 작업에 지점 탐지를 얻기 위해 필요한 몇 가지 추가 작업이 있습니다 암호.

어쨌든, 최종 결과는 잘 동의

작동합니다. 이로 인해 JSCover는 iFrames 또는이 방법으로 피할 수있는 여러 창과 잘 작동하지 않는 고급 도구에서 사용할 수 있습니다. 또한, 코드 커버리지는 두 개의 조정으로 기존의 셀레늄 테스트에 추가 할 수 있습니다 의미 : 시험은 JSCover 프록시

  • 저장 테스트 스위트의 끝에 커버리지 보고서를 통해 실행 확인

    자세한 정보는 JSCover의 문서를 참조하십시오. 이러한 변경 사항이 포함 된 버전 1.0.5는 며칠 내에 발표되어야합니다.

  • +0

    감사합니다. 새 버전이 출시되었으므로 이러한 변경 사항을 반영하기 위해 이전 답변을 업데이트했습니다. –