RSpec이 포함된 기본 Ruby 계산기

22044 단어 rspecruby
테스트는 소프트웨어 개발의 중요한 부분이다. 특히 당신이 공부하는 과정에서 테스트의 시작은 매우 느릴 수 있지만, 장기적으로 보면 매우 중요한 구원자이다.프로젝트가 커지면서 새로운 기능이 낡은 기능을 파괴하지 않고 의외의 결과가 발생하지 않도록 테스트를 실행할 수 있습니다.
시작하기 위해서, 나는 RSpec을 배우고 연습하기로 결정했다. 이것은 루비 프로그래밍 언어의 단원 테스트 프레임워크이다.RSpec은 행위 구동을 위한 개발 도구로 RSpec로 작성된 테스트가 테스트된 프로그램의'행위'에 중점을 둔다는 것을 의미한다.Rspec은 응용 프로그램이 어떻게 작동하는지를 강조하는 것이 아니라 응용 프로그램이 실제로 무엇을 했는지를 강조한다.
이것은 내가 처음으로 테스트 드라이브 개발(TDD)을 사용하여 간단한 루비 계산기를 구축하는 것을 시도한 것이다!TDD는 소프트웨어가 완전히 개발되기 전에 소프트웨어 수요를 테스트 용례로 전환하고 모든 테스트 용례에 대한 중복 테스트 소프트웨어를 통해 모든 소프트웨어 개발을 추적하는 소프트웨어 개발 과정이다.이것은 때때로 빨간색-녹색 테스트라고 불린다. 코드가 실행하기를 원하는 동작을 위해 테스트를 작성한 다음에 테스트를 실행해서 실패를 볼 수 있기 때문이다. (빨간색)그리고 테스트를 통과하도록 코드를 작성합니다. (녹색)
우선 루비와 RSpec이 설치되어 있는지 확인하십시오.너는 운행을 통해
$ ruby -v
ruby 2.6.1p33 (2019-01-30 revision 66950)

$ rspec -v
RSpec 3.10
  - rspec-core 3.10.1
  - rspec-expectations 3.10.1
  - rspec-mocks 3.10.2
  - rspec-support 3.10.2
이 두 옵션 중 하나가 없으면 Ruby 문서를 보고 RSpec을 추가할 수 있습니다
$ gem install rspec
gem은 루비 라이브러리입니다. 코드에서 사용할 수 있고, gm 명령으로 설치할 수 있습니다.
다음에 선택한 위치에calculator라는 폴더를 만듭니다.
$ mkdir calculator
폴더에 cd를 넣고 코드 편집기로 엽니다.
$ cd calculator
$ code .
다음에 RSpec 버전을 실행하려면 Gemfile이 필요합니다.
$ touch Gemfile
gem 파일에 추가source "https://rubygems.org"그래서 보석을 어디서 얻었는지 알아요.그리고 너의 터미널에서.
$ bundle add rspec
항목이 최신 버전의 rspec를 사용할 수 있도록 gemfile가 업데이트됩니다.

현재 우리는 lib라는 폴더를 만들어서 계산기 종류를 저장할 수 있으며, 스펙은 테스트를 저장하는 데 사용됩니다. 이것은 흔히 볼 수 있는 방법입니다.
$ mkdir lib
$ mkdir spec
이제 재밌는 부분!calculator spec.rb라는 파일을 만듭니다. 일반적인 방법은 테스트 파일의 이름에 spec.와 다른 calculator라는 파일을 추가하는 것입니다.lib 폴더에 있습니다.
먼저 스펙 파일 상단에서 테스트해야 하는 파일:
require './lib/calculator.rb'
이제 첫 번째 테스트를 작성합시다!우리는 우리의 계산기가 두 개의 숫자를 더해서 결과를 되돌릴 수 있기를 바란다.
describe Calculator do 
  context "Given two numbers" do 
    it "adds the numbers using the add method" do
      calc = Calculator.new
      sum = calc.add(2,3)
      expect(sum).to eql(5)
    end
  end
end
와, 넬리!웬일이야!그래.그래서descripe 단어는 Rspec 키워드입니다.이것은 '예시 그룹' 을 정의하는 데 사용되며, 이것은 테스트 그룹입니다.descripe 키워드는 클래스 이름과/또는 문자열 파라미터를 사용할 수 있습니다. 예를 들어 계산기 클래스 이름을 사용했습니다. (존재하지 않습니다.)별도의 테스트를 포함하거나 RSpec에서 '예시' 라고 부르는 블록 파라미터를 전달해야 합니다.블록은 Ruby do/end 키워드로 지정된 Ruby 블록일 뿐입니다.
따라서, 우리의 설명 계산기 블록은 각 테스트를 봉인할 것입니다.descripe 블록에서 context, 또 다른 RSpec 키워드입니다.이것은 descripe 블록과 매우 비슷하며 강제적이지는 않지만, 테스트에 더 많은 세부 사항을 추가할 수 있습니다.이 예에서, 우리는 입력 함수의 두 숫자를 어떻게 처리하는지 테스트할 뿐이다.
단어 it는 "예제", 즉 테스트 용례를 정의하는 또 다른 RSpec 키워드입니다.이것은 문자열과do/end로 지정한 블록 매개 변수를 전달합니다. (예를 들어 descripe와context) 클래스를 받아들일 수 있지만, 이렇게 하는 것은 매우 드물습니다.문자열은 테스트의 예상 결과를 설명합니다.문자열은 우리가 계산기 종류의 실례에서dd를 호출할 때 무슨 일이 일어나야 하는지를 명확하게 보여 준다.RSpec 이념의 일부로서 예는 테스트일 뿐만 아니라 규범(spec)이기도 하다.따라서 이 예제에서는 Ruby 코드의 예상 동작을 기록하고 테스트합니다.
그리고 Calculator 클래스의 실례를 만듭니다. 그러면 이 클래스가 정말 정확하게 덧붙었는지 확인하기 위해dd 방법을 호출할 수 있습니다.숫자 2와 3을dd에 전송하는 방법과 같은sum 변수를 설정합니다.
이제, 진정한 테스트!expect 키워드는 RSpec에서 기대치를 정의하는 데 사용됩니다.이것이 바로 우리가 검증한 부분, 즉 특정한 기대 조건을 만족시켰다는 것이다.우리의 생각은expect 문장은 보통 영어처럼 읽어야 한다는 것이다.너는 큰소리로 "기대 총화는 5"라고 말할 수 있다.이 생각은 그것의 묘사성과 읽기 쉽다는 것이다.
to 키워드는expect 문장의 일부분으로 사용됩니다.to는 점과 연결되어 (및) 이외에.그것은 사실상 일반적인 루비 방법일 뿐이기 때문이다.사실 모든 RSpec 키워드는 사실상 루비 메소드에 불과합니다.
마지막으로, 우리는 eql 키워드가 있는데, 이것은 특수한 RSpec 키워드인 Matcher라고 한다.정합기는 테스트할 조건 유형을 진짜(또는 가짜)로 지정하는 데 사용됩니다.여기에서 우리는dd 방법이 5와 일치하는 정수를 되돌려 주기를 바란다.
그래!명령rspec와spec 폴더에 지정된 파일을 사용하여 테스트를 실행합시다!
$ rspec spec/calculator_spec.rb   

우리의 오류는 상량계산기에 사체가 없다는 것을 알려준다. 이것은 일리가 있다. 왜냐하면 우리는 아직 계산기 종류를 구축하지 않았기 때문이다.그래서 계산기에 있어요.rb 파일, 우리 수업하러 갑시다.
class Calculator 
end
테스트를 다시 실행합니다.

엉엉!1 실패!이거 좋네.우리는 빨간색/녹색 테스트의 빨간색 부분에 있다.추가할 방법이 없습니다.우리가 이 문제를 해결합시다.
def add
end

현재, 우리의 테스트는 우리에게dd 방법이 2개의 파라미터를 받았지만, 예상은 0이다.이것은 테스트에서 우리는 그것에게 두 개의 파라미터를 주었지만 실제 코드에서는 어떤 파라미터도 방법에 전달되지 않았기 때문에 우리는 그것에게 두 개의 파라미터를 주었다.
 def add(x,y)
 end

현재 테스트는 5개를 되돌릴 예정이지만, 그 테스트는 실패했다. 왜냐하면 우리는 어떤 내용도 되돌려 주지 않았기 때문이다.우리가 이 문제를 해결합시다.
  def add(x,y)
    return 5
  end

구애!얘 지나갔어!하지만...기다리다이거 너무 바보 아니야?네, 네 말이 맞아요.테스트를 작성하고 최소한의 작업량으로 통과하는데, 실제적으로 원하는 방식으로 실행되지 않는다면, 테스트를 업그레이드해서 더욱 튼튼하게 해야 합니다.다른 테스트를 추가합시다!
    it "can add two different numbers" do 
      calc = Calculator.new
      sum = calc.add(8,23) 
      expect(sum).to eql(31)
    end

좋아, 우리는 첫 번째 테스트를 통과했지만 두 번째는 아니야.우리 둘 다 통과할 수 있도록 이 문제를 해결합시다!
  def add(x,y)
    return x + y
  end

맞아요!두 번 통과!
또 우리가 두 모듈에서calculator류를 초기화한 새로운 실례를 발견한 사람이 있습니까?Rspec-before-hook을 사용하여 재구성할 수 있습니다. 이 갈고리는 실행할 범위와 코드 블록을 표시하는 기호를 받아들일 수 있습니다.before (: each) 블록은 모든 예시 전에 실행됩니다.
describe Calculator do 

  before(:each) do 
    @calc = Calculator.new 
  end

  context "Given two numbers" do 
    it "can add the numbers using the add method" do
      sum = @calc.add(2,3)
      expect(sum).to eql(5)
    end

    it "can add two different numbers" do 
      sum = @calc.add(8,23) 
      expect(sum).to eql(31)
    end
  end
end
이 코드를 다시 실행하면 두 개의 테스트가 통과됩니다!
새로운dd 방법으로 다른 숫자를 추가하려고 한다면 터미널의irb 세션에 들어가서 계산기 클래스를 포함하는 파일을 불러오고, 이 클래스의 새로운 실례를 실례화하여 변수에 저장한 다음, 추가하고 싶은 두 개의 숫자를 매개 변수로 사용하여dd 방법을 호출할 수 있습니다.exit를 입력하여irb를 종료하십시오!

계속해서 빨간색/녹색 TDD 과정에 따라 감법, 곱셈, 나눗셈 연산을 시도해 봅시다.잊지 마라!0으로 나누려고 하는 사용자를 테스트하고 오류 메시지를 표시해야 할 수도 있습니다.
사양/계산기\u사양rb
require './lib/calculator.rb'

describe Calculator do 

  before(:each) do 
    @calc = Calculator.new 
  end

  context "Given two numbers" do 
    it "can add the numbers using the add method" do
      sum = @calc.add(2,3)
      expect(sum).to eql(5)
    end

    it "can add two different numbers" do 
      sum = @calc.add(8,23) 
      expect(sum).to eql(31)
    end

    it "can subtract the numbers using the subtract method" do 
      expect(@calc.subtract(6,4)).to eql(2)
    end

    it "can multiply the numbers using the multiply method" do 
      expect(@calc.multiply(3,4)).to eql(12)
    end

    it "can divide the numbers using the divide method" do 
      expect(@calc.divide(18,3)).to eql(6)
    end

    it "gives a warning if try to divide by zero" do 
      expect(@calc.divide(2,0)).to eql("You can't divide by zero!")
    end

    it "can provide the remainder when dividing two numbers using the modulo method" do 
      expect(@calc.modulo(15,5)).to eql(0)
    end

    it "can square the result of a number" do 
      expect(@calc.square(2)).to eql(4)
    end

    it "can find the squareroot of a given number" do 
      expect(@calc.squareroot(9)).to eql(3)
    end

    it "can find the factorial of a given number" do 
      expect(@calc.factorial(3)).to eql(6)
    end 
  end
end
라이브러리/계산기.rb
class Calculator

  def add(x,y)
    return x + y
  end

  def subtract(x,y)
    return x - y
  end

  def multiply(x,y)
    return x * y
  end

  def divide(x,y)
    if y == 0 
     return "You can't divide by zero!"
    end
    return x / y
  end

  def modulo(x,y)
    return x % y
  end

  def square(x)
    return x * x
  end

  def squareroot(x)
    return Math.sqrt(x).round()
  end

  def factorial(x)
    result = 1
    while (x > 0)
      result = result * x
      x -= 1
    end
    return result
  end

end
파일 구조와 폴더를 보려면 mygithub repo를 보십시오.보기Tutorialspoint 또 다른 좋은 강좌를 알아보고, 보기Relishbefore hook에 대한 더 많은 내용을 알아보세요.
RSpec을 처음 사용하는 사람들에게 도움이 되었으면 합니다.Rspec 전문가라면 누구나 제가 쓴 테스트를 개선하는 방법에 대해 논평을 하고 싶습니다. 피드백에 감사드립니다.
즐거운 코딩!

좋은 웹페이지 즐겨찾기