Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

예제가 포함된 최종 RSpec 자습서

RSpec을 사용하여 Ruby 애플리케이션에 대한 테스트를 작성하는 방법을 배우고 싶습니까?

그렇다면 올바른 위치에 있습니다 !

이 튜토리얼에서는 그 방법을 보여 드리겠습니다.

내용

  • 1 왜 테스트를 작성해야 합니까?
      • 1.0.1 오류에 대한 안전망을 구축합니다(특히 리팩토링에 유용).
      • 1.0.2 코드를 문서화하는 데 도움이 됩니다.
      • 1.0.3 피드백 루프 제공
      • 1.0.4 코드가 예상한 결과를 생성하는지 확인하는 데 도움이 됩니다.
      • 1.0.5 Ruby 작업을 시작하는 데 도움이 됩니다.
  • 2 RSpec 시작하기
  • 3 RSpec 테스트 예
  • 4 RSpec Let 메서드
  • 5 주제 방법을 사용하는 방법
  • 6 모든 테스트 전에 코드를 실행하는 방법
  • 7 테스트 하위 그룹을 만드는 방법
  • 8 테스트를 일시적으로 비활성화하는 방법
  • 이름별 실행 예 9개
  • 10개의 RSpec 기대치 및 일치자
  • 11개의 RSpec 포맷터
  • 12 느린 테스트를 찾는 방법
  • 13 RSpec 동영상 튜토리얼
  • 14 요약
    • 14.1 관련

테스트를 작성해야 하는 이유

이유는 다음과 같습니다.

오류에 대한 안전망 구축(특히 리팩토링에 유용)

테스트 스위트가 없다면 무언가 깨질까 두려워 코드를 건드리고 싶지 않습니다...

...검사를 받으면 자신감이 높아집니다!

코드를 문서화하는 데 도움이 됩니다.

테스트는 애플리케이션이 수행해야 하는 작업을 설명합니다.

피드백 루프 제공

TDD를 수행할 때 피드백 루프를 얻습니다 다음에 집중해야 할 사항을 알려줍니다. 쉽게 산만해질 때 유용합니다.

코드가 예상한 결과를 생성하는지 확인하는 데 도움이 됩니다.

이것이 중요합니다!

복잡한 로직을 작성하는 경우 다양한 입력과 함께 작동하는지 확인해야 합니다 &당신이 생각해낸 한 가지 예가 아닙니다.

테스트는 코너 케이스를 발견하고 문서화하는 데 도움이 될 수 있습니다.

Ruby 작업을 시작하는 데 도움이 됩니다.

대부분의 입사 지원서는 테스트 기술을 높이 평가하여 입사 가능성을 높여줍니다.

RSpec 시작하기

RSpec의 작동 방식을 이해하기 위해 단계별 예시를 살펴보겠습니다. .

우리는 팩토리얼을 찾는 간단한 애플리케이션을 작성할 것입니다.

첫 번째 단계 :

require 'rspec/autorun'

describe Factorial do
  # ...
end

이것은 첫 번째 RSpec을 작성하기 위한 초기 코드입니다. 테스트.

rspec gem이 필요합니다.

그런 다음 describe를 생성해야 합니다. 모든 테스트를 함께 그룹화하려면 차단 &RSpec에게 테스트 중인 클래스를 알려줍니다.

다음은 it입니다. 차단:

describe Factorial do
  it "does something" do
    # ...
  end
end

이것은 테스트 이름과 모든 구성요소를 그룹화하는 방법입니다. 테스트 자체의.

구성 요소는 다음과 같습니다.

  • 설정
  • 운동
  • 확인

설정은 객체를 생성하는 곳입니다. 생성해야 합니다.

준비 단계입니다.

그런 다음 실행하려는 메서드를 호출하여 반환 값을 가져옵니다.

마지막으로 기대에 따라 결과를 확인합니다. (RSpec) 또는 주장(Minitest).

RSpec 테스트 예

이제 계승 방법을 작성하려면 온라인이나 손으로 계산하여 유효한 값을 찾아야 합니다.

그런 다음 테스트에 사용합니다.

좋아요 :

describe Factorial do
  it "finds the factorial of 5" do
    calculator = Factorial.new

    expect(calculator.factorial_of(5)).to eq(120)
  end
end

이 코드를 실행하면(일반 Ruby 프로그램처럼) 다음과 같이 표시됩니다.

uninitialized constant Factorial (NameError)

Factorial이 없기 때문에 이것은 정상입니다. 아직 수업이 없습니다.

하나 만들어 봅시다:

class Factorial
end

다음 오류는 다음과 같습니다.

undefined method 'factorial_of'

factorial_of를 생성하여 이 문제를 해결합니다. 방법:

class Factorial
  def factorial_of
  end
end

그런 다음 코드를 다시 실행하십시오.

wrong number of arguments (given 1, expected 0)

또 다른 오류! 하지만 뭔지 아세요?

다행이네요 🙂

오류는 좌절할 일이 아닙니다.

피드백입니다.

지금:

factorial_of에 메소드 인수 하나 추가 방법:

class Factorial
  def factorial_of(n)
  end
end

지금 얻는 것은 테스트 실패입니다. :

expected: 120
     got: nil

이것이 바로 이 시점에서 원하는 위치입니다!

다음 작업은 메서드를 구현하는 것입니다.

class Factorial
  def factorial_of(n)
    (1..n).inject(:*)
  end
end

그리고 첫 번째 통과 테스트를 받게 됩니다. :

.

Finished in 0.00315 seconds (files took 0.09083 seconds to load)
1 example, 0 failures

이것이 우리가 테스트 주도 개발(TDD)이라고 부르는 것입니다.

먼저 테스트를 작성한 다음 테스트에서 다음에 수행해야 할 작업을 안내합니다.

RSpec Let 메서드

많은 테스트를 작성하고 동일한 개체를 재사용하려는 경우 let으로 이러한 객체를 정의할 수 있습니다. 진술.

다음과 같습니다.

describe Factorial do
  let(:calculator) { Factorial.new }

  it "finds the factorial of 5" do  
    expect(calculator.factorial_of(5)).to eq(120)
  end
end

이제 calculator를 재사용할 수 있습니다. 동일한 describe 아래의 모든 테스트에서 차단합니다.

let에 대해 알아야 할 한 가지 그것은 "게으름"입니다.

그게 무슨 말인가요?

처음 사용할 때까지 개체가 생성되지 않습니다. .

이 개체를 만들 때 데이터베이스 항목을 만들거나 파일에 쓰는 것과 같은 부작용이 있는 경우 차이를 만들 수 있습니다.

이러한 부작용을 피하는 것이 가장 좋지만 그렇게 할 수 없다면 let!를 사용하세요. 방법.

:

let!(:user) { User.create("[email protected]") }

let! 메서드는 지연되지 않으므로 테스트가 실행되기 전에 개체가 생성됩니다.

제목 방법 사용 방법

let의 다른 버전 subject입니다. .

유일한 차이점은 하나의 subject만 가질 수 있다는 것입니다. , 인스턴스 테스트 중인 주요 개체의.

RSpec은 이미 기본 subject를 생성합니다. 이렇게:

subject { Factorial.new }

이를 "암시적 주제"라고 합니다.

다음과 같이 사용할 수 있습니다.

describe Factorial do
  it "finds the factorial of 5" do  
    expect(subject.factorial_of(5)).to eq(120)
  end
end

주제에 이름을 지정할 수 있습니다.

subject(:calculator) { Factorial.new }

이것은 let를 사용하는 것과 같은 방식으로 작동합니다. , 그러나 한 줄 기대치를 사용할 수 있습니다.

it { should be_empty }

모든 테스트 전에 코드를 실행하는 방법

RSpec에는 모든 테스트 전후 또는 전체 테스트 그룹을 실행하는 데 사용할 수 있는 실행 후크가 있습니다.

예를 들어 :

describe Shop do
  before(:all) { Shop.prepare_database }
  after (:all) { Shop.cleanup_database }
end

각 예제(예제 =RSpec의 테스트)에 대해 이 코드를 실행하려면 :each를 사용할 수 있습니다. :all 대신 .

테스트 하위 그룹을 만드는 방법

앱에서 다양한 시나리오를 테스트하는 경우 관련 테스트를 함께 그룹화하는 것이 도움이 될 수 있습니다.

컨텍스트 블록을 사용하여 이 작업을 수행할 수 있습니다. RSpec.

다음은 예입니다:

describe Course do
  context "when user is logged in" do
    it "displays the course lessons" do
    end

    it "displays the course description" do
    end
  end

  context "when user it NOT logged in" do
    it "redirects to login page" do
    end

    it "it shows a message" do
    end
  end
end

테스트를 일시적으로 비활성화하는 방법

디버깅 목적으로 테스트를 비활성화할 수 있습니다.

it을 변경하기만 하면 됩니다. xit 비활성화하려는 테스트에 대해.

:

xit "eats lots of bacon" do
end

x를 제거하는 것을 잊지 마십시오. 완료되면!

이름으로 예제 실행

테스트를 비활성화하는 대신 -e를 사용하여 실행하려는 테스트를 필터링할 수 있습니다. 플래그.

:

> ruby person.rb -e bacon

이 필터링은 테스트 이름을 기반으로 하므로 위의 예는 "bacon"이라는 단어가 있는 모든 테스트와 일치합니다.

RSpec 기대치 및 일치자

우리가 사용한 다음 예를 기억할 것입니다.

expect(calculator.factorial_of(5)).to eq(120)

하지만 이 eq(120)는 무엇입니까? 부품?

음, 120은 우리가 기대하는 값입니다...

...및 eq 우리가 일치자라고 부르는 것입니다.

매처는 RSpec이 메소드의 출력을 비교하는 방법입니다. 기대값으로 .

eq의 경우 , RSpec은 ==를 사용합니다. 연산자(Ruby 연산자에 대해 자세히 알아보기).

하지만 다른 매처가 있습니다 사용할 수 있습니다.

예를 들어, be_something 매처:

expect(nil).to be_nil

something 술어 메소드(예:empty? ) 테스트 결과에서 호출됩니다.

기타 유용한 매처:

  • 포함(배열 및 해시용)
  • start_with
  • 종료
  • 일치(정규 표현식 일치용)
  • 사이에
  • have_key / have_value(해시용)
  • be_instance_of
  • 응답
  • have_attributes(인스턴스 변수 테스트용)

특별한 주의가 필요한 매처 raise_error입니다. 매처.

그 이유는 그것을 사용하려면 블록 내에서 기대치를 포장해야 하기 때문입니다.

좋아요 :

expect{ :x.count }.to raise_error(NoMethodError)

change matcher도 다음과 같이 작동합니다.

expect{ stock.increment }.to change(stock, :value).by(100)

RSpec 포맷터

기본 RSpec 출력은 "진행률" 형식입니다.

이 형식을 사용하면 점(. ) 각각 1개의 통과 테스트를 나타내는 F 실패한 테스트(예상 및 실제가 일치하지 않음) 또는 E 오류입니다.

그러나 사용할 수 있는 대체 서식 옵션이 있습니다.

목록은 다음과 같습니다.

  • 진행 상황
  • 문서
  • json
  • html

-f 플래그를 사용하여 활성화할 수 있습니다.

> ruby factorial.rb -f d

Person
  eats lots of healthy food
  writes many articles

Finished in 0.00154 seconds (files took 0.09898 seconds to load)
2 examples, 0 failures

문서 형식은 테스트 설명을 사용하여 출력을 생성합니다.

느린 테스트를 찾는 방법

RSpec에는 테스트를 프로파일링하는 매우 편리한 옵션이 있습니다. .

--profile을 전달하면 됩니다. 플래그를 지정하면 각 테스트를 실행하고 정말 느린 테스트를 수정하는 데 걸리는 시간을 확인할 수 있습니다.

예시 :

> ruby factorial.rb --profile

Factorial finds the factorial of 5
  0.00043 seconds

RSpec 비디오 튜토리얼

요약

RSpec 테스트 프레임워크를 사용하여 테스트를 작성하는 방법을 배웠습니다.

이제 여러분이 직접 테스트 작성을 시작할 차례입니다!