2013-04-08 3 views
4

내 테스트 클래스에 정의 된 전역 변수를 사용하는 데 문제가 있습니다. 그러면 라이브러리 파일에서 참조됩니다. Ruby 1.9.3p392 및 테스트 유닛 2.5.4를 사용하고 있습니다.루비 단위 테스트에서 전역 변수에 액세스

Started 
E 
=============================================================================== 
Error: test_001_login(Test_002) 
    NoMethodError: undefined method `goto' for nil:NilClass 
(...) 
    23: end 
    24: 
    25: def test_001_login 
    => 26:  login('some_url', 'some_user', 'some_passw') 
    27: end 
    28:  
    29: end 
=============================================================================== 

Finished in 3.0043 seconds. 

1 tests, 0 assertions, 0 failures, 1 errors, 0 pendings, 0 omissions, 0 notifications 
0% passed 

0.33 tests/s, 0.00 assertions/s 
:

require 'rubygems' 

module Functions 

    def login(url, user, passw) 
    @browser.goto(url) 
    ... 
    end 
end 

이것은 출력 :

은 테스트 실행 코드입니다 :

require 'rubygems' 
gem 'test-unit' 
require 'test/unit' 
require 'ci/reporter/rake/test_unit_loader' 
load '../lib/functions.rb' 
require 'watir' 

class Test_002 < Test::Unit::TestCase 

    include Functions 

    class << self 
    def startup 
     @browser = Watir::Browser.new :ie 
     @browser.speed = :fast 
    end 

    def shutdown 
     @browser.close 
    end 
    end 

    def test_001_login 
    login('some_url', 'some_user', 'some_passw') 
    end 
end 

을 그리고 이것은 로그인 기능을 포함하는 라이브러리의 일부입니다

아이디어가 있으십니까?

답변

2

인스턴스 변수 (예 : @browser을)를 TES을 사용할 수 없습니다 ts. 이 오래된 포럼 스레드를 기반으로 http://www.ruby-forum.com/topic/144884, 의도적으로 설계된 것입니다 :

피드백 보내기 현재 상태 이것은 의도적으로 설계된 동작입니다. "테스트 격리"이상은 테스트 케이스가 시작될 때마다 깨끗한 슬레이트를 얻기 위해 너무 열심히 일할 필요가 없다는 것을 의미합니다. 그렇지 않으면 테스트가 이전 테스트의 @ 값에 의존 할 수 있으며 사용자가주의하지 않는 방식으로 테스트에 의존 할 수 있습니다.

물론 다른 영구 변수는 테스트 격리를 망칠 수 있습니다. 우리는 각 테스트 케이스 사이에서 Ruby를 멈추지 않고 다시 시작하지 않습니다. 하지만 적어도 @instance 변수가 발생하면 책임을지지 않습니다.

동일한 테스트를 통해 동일한 브라우저를 사용했던 한 가지 해결 방법은 클래스 변수 (예 : @@browser)를 사용하는 것이 었습니다. 시작은 다음과 같습니다. 다른 방법은 비슷하게 @@browser을 사용하도록 업데이트해야합니다.

def startup 
    @@browser = Watir::Browser.new :ie 
    @@browser.speed = :fast 
end 
+0

이것은 의미가 있습니다. 어쩌면 이것이 내가 성취하고자하는 최선의 준비가 아닐 수도 있습니다. 테스트 스위트를 만들었고, Watir 및 각 블록 (단계 + 검증)에서 자동화 된 테스트 케이스를 단위 테스트 케이스로 포함하도록 구조화하는 방식을 만들었습니다. 그렇기 때문에 @browser 인스턴스를 만든 다음 나머지 단계를 단위 테스트로 실행하려고합니다. 이것을 처리 할 수있는 또 다른 방법이 있습니까? – Tedi

+4

이전 테스트에 따라 테스트 케이스에서 각 테스트를 수행 할 계획 인 것 같습니다 (즉, 테스트 002는 테스트 001의 끝 부분에있는 브라우저 상태에 따라 달라집니다). 나는 한 번 같은 테스트 스위트로 작업했다. 이상적이지 않았습니다. 하나의 테스트가 실패하면 테스트를 다시 확인하기 위해 모든 것을 다시 실행해야합니다.브라우저 인스턴스를 공유하면 브라우저의 시작/종료를 저장할 수 있습니다. 그러나 테스트 자체는 의존해서는 안됩니다. –

3

테스트 전 초기화 코드가 실행되고 있지 않습니다.

TestUnit 프레임 워크는 설치 코드가 setup라는 방법 및 당신은 두 가지 옵션이 하나 setup의 방법 startup 및 방법 shutdownteardown을로 이름을 변경 teardown

라는 방법으로 될 수있는 분해 코드에있을 것으로 예상 당신이 어떤 다른 목적 설정/종료해야하는 경우, 또는, 위임 방법을 만들기 : startup 방법에 정의

def setup 
    startup 
end 

def teardown 
    shutdown 
end 
+1

저는 사전 테스트 초기화 코드가 실행되고 있다고 생각합니다. 최신 버전의 test-unit에는 [startup] (http://test-unit.rubyforge.org/test-unit/Test/Unit/TestCase.html#method-c-startup) 및 [shutdown] (http : //test-unit.rubyforge.org/test-unit/Test/Unit/TestCase.html#method-c-shutdown) 방법. –

관련 문제