Bogus(루비)

Bogus (Ruby)

Bogus격리된 유닛 테스트에 관련된 위험을 최소화하기 위해 사용되는 Ruby API 라이브러리입니다.2012년 7월에 [1]rubygems.org에 의해 처음 출시되었습니다.Bogus를 통해 외부 프로그램과의 실제 통합 없이 빠르고 안전한 방법으로 코드 일부를 테스트할 수 있습니다.필요한 외부 환경에 존재하지 않는 Bogus 메서드나 stub 메서드는 모킹할 수 없습니다.

보거스
설계자아담 포호레키, 파웨 피에르차와, 표트르 조트코프스키, 마렉 노왁
처음 등장한2012년 7월 30일
안정된 릴리스
2015년 1월 2일 / 0.1.6
구현 언어루비
면허증.MIT 라이선스(MIT) 저작권 (c) 2012-2013 Adam Pohorecki
웹 사이트https://rubygems.org/gems/bogus

특징들

Ruby는 필요한 테스트 프레임워크를 달성하기 위해 다양한 기능을 제공합니다.

가짜

가짜는 실제 물체의 인터페이스를 조롱하는 가벼운 물체입니다.클래스를 분리하여 테스트하기 위해 필요한 메서드가 스터브된 통합 클래스 대신 보통 일부 테스트 더블 또는 익명 객체가 사용됩니다.그러나 이 접근 방식에는 문제가 있습니다. 중간에 클래스를 변경하면 이러한 변경 내용이 모의 객체에 반영되지 않고 통합 예외 없이 테스트가 실행됩니다.가짜는 실제 공동작업자의 인터페이스를 정확하게 갖추고 실제 클래스가 변경될 때마다 예외를 발생시키기 때문에 이 문제를 해결합니다.

가짜는 다음과 같은 방법으로 구현할 수 있습니다.

기존 클래스를 속이다

fake는 fake 메서드를 호출하여 생성됩니다.

구문:

fake(fake_name, options) { ClassToCopy }

"fake_name"은 작성된 가짜의 이름으로 계약 테스트를 사용하는 동안 가짜를 식별하는 데 사용할 수 있습니다.생략하면 익명의 가짜가 생성됩니다.fake는 요건에 따라 인스턴스 또는 클래스 복사본을 반환하는 옵션을 제공합니다.가짜는 스터브 방식에도 적용할 수 있습니다.

글로벌 컨피규레이션

가짜는 스터빙의 필요성을 회피하고 다음과 같은 구성 요소를 대부분 제거합니다.as: :class/as: :instance어떤 경우에도 이러한 유형의 설정은 가짜 정의에 추가해야 합니다.따라서 콜라보레이터가 많을수록 중복되는 경우가 많아집니다[2].Bogus는 DSL을 도입하여 한 곳에서 가짜를 구성함으로써 이 문제를 해결하고 모든 테스트에서 DSL의 사용을 통일합니다.stubbed 메서드는 가짜 매크로 또는 가짜 도우미 기능을 사용하여 덮어쓸 수 있습니다.

이름 없는 테스트가 두 배로 증가하다

익명 테스트 더블은 다른 테스트 라이브러리에서 개체를 마이그레이션하는 동안 중간 단계로 사용할 수 있습니다.그들은 방법을 조롱하지 않고 관찰하는 데 도움을 준다.메서드는 스터브할 수 있습니다.

  • 아무리 많은 논의를 해도
  • 초기화 방법으로
  • 인라인
  • 제멋대로의 방법을 쓰다

클래스의 치환

일반적으로 종속성 주입은 클래스의 구성을 쉽게 하고 코드를 더 모듈화하기 위해 사용됩니다.가짜로 클래스를 대체하면 이 요구사항이 회피됩니다.만들어진 가짜 수업에는 다른 가짜 이름이 붙을 수 있다.

오리형 가짜

시스템은 단일 기능을 구현하는 여러 클래스를 가질 수 있습니다.이로 인해 특정 시나리오의 구현 선택이 복잡해집니다.Bogus는 수업을 위해 오리 타입을 만들어서 이 문제를 해결합니다.

덕 유형을 작성하기 위한 구문:

make_duck(Class 1, Class 2, Class 3)

Bogus는 가짜에서 여러 클래스가 반환될 때 자동으로 오리 유형을 생성하여 더욱 단순화합니다.실제로 글로벌 환경에서도 이 기능을 수행합니다.

계약 테스트

가짜 스터브에서 예외 처리가 예상대로 수행되는지 확인하려면 모의 객체에 대한 샘플테스트를 작성해야 합니다.이 테스트는 Bogus에 의해 작성되지 않았지만 개발자에게 그렇게 하도록 상기시킵니다.

verify_contract[4](object) 메서드는 실제 클래스에서 수행된 모든 감청을 기록하고 테스트하는 것을 잊은 가짜 객체에 기록된 시나리오가 있으면 테스트에 실패합니다.

오브젝트가 조롱, 스텁 또는 스파이될 때마다 입출력 파라미터에 계약이 지정됩니다.Bogus는 계약이 이행되었는지 여부를 자동으로 확인합니다.조롱된 메서드 또는 스터브된 메서드가 실제 개체로 호출되지 않습니다.계약 테스트에서는 올바른 수의 파라미터가 전달되었는지 여부를 확인할 뿐만 아니라 오브젝트가 올바른 인수를 사용하여 테스트되었는지도 확인합니다.

계약 검증은 통과된 코드 블록 또는 인수 블록이 무의미하고[5] 부작용이 없는 경우에만 올바르게 식별할 수 있습니다.

스텁

가짜뿐만 아니라 제어 원리의 반전을 사용하지 않는 경우에도 stub을 허용합니다.다음 두 가지 조건을 따릅니다.

  1. 스터브되는 메서드가 존재해야 합니다.
  2. 통과 매개 변수는 일관성이 있어야 합니다.메서드 시그니처는 유지됩니다.

구문은 루비 [6]스터브와 비슷합니다.

RR 구문 수 스텁(물건).method_name { return_value }  가짜 구문 수 스텁(물건).method_name(any_modules) { return_value } 

가짜와 스터빙의 주요 차이점은 가짜에서는 스터빙 전에 메서드콜을 확인할 수 있다는 것입니다.단, 스터브에서는 메서드콜이 발생했는지 확인하기 위해서는 사전에 스터브해야 합니다.

세이프 모킹

모크는 객체를 분리하여 테스트하는 데 사용됩니다.이를 통해 개체와 공동작업자 간의 통신이 제대로 이루어지고 있는지 확인할 수 있습니다.모크는 오브젝트나 조롱되는 메서드가 존재해야 한다는 점에서 스텁과 같습니다.

구문:[7]

모의(물건).method_name(*args) { return_value } 

스파이

코드를 테스트할 때는 메시지 송수신이 매우 중요합니다.이것은 spy를 사용하여 검증됩니다.이상적인 경우 어떤 일이 일어나야 하는지 지정하기 위해 사용됩니다.spy는 stubing하기 전에 메서드가 호출되었는지 확인합니다.

인수 매칭자

인수 매처는 전달되는 인수의 세부 정보가 메서드가 호출되었는지 여부를 확인하는 것만큼 중요하지 않을 때 유용합니다.실제 인수 대신 와일드카드 엔트리나 정규 표현같은 일부 입력자를 [8][9]사용할 수 있습니다.

구성 옵션

잘못된 설정 구문:[10]

보거스.설정하다 하다  c    c.검색_실행 = [물건]   c.fake_ar_attributes = 진실의 끝. 

Search_modules

기본적으로 Bogus는 네임스페이스를 유지하지 않습니다.따라서 특정 클래스를 검색하는 동안(클래스 이름을 해결하기 위해) 모든 식별자에 대해 검색이 수행됩니다.검색 공간을 좁히기 위해 Search_modules를 커스터마이즈하여 특정 클래스 모듈을 포함할 수 있습니다.예를 [11]들어 다음과 같습니다.

보거스.설정하다 하다  c    c.검색_실행 << > 막대 끝. 

여기서 '바'는 검색을 수행해야 하는 일련의 클래스를 포함하는 모듈입니다.

Fake_ar_modules

이 기능은 ActiveRecord를 처리합니다.: 베이스[12] 클래스여기서 Active Record는 모듈이고 Base는 클래스 중 하나입니다.Active Record의 속성은 명시적이지 않습니다.이러한 수정은 데이터베이스에서 직접 수행됩니다.기본 클래스는 응답하는 메서드가 있지만 자체 메서드로 명시적으로 언급하지 않는 특수 클래스입니다.따라서 이러한 메서드가 가짜일 경우 클래스에 해당 메서드가 존재하지 않기 때문에 오류가 발생합니다.예를 들어,[13]

학급 블로그 포스트 < > 액티브 레코드::기초 끝. 블로그_포스트 = 블로그 포스트.신규 블로그_포스트.응답할 수 있습니까?(: 이름) # = > 참 블로그_포스트.방법(: 이름) # 는 Name Error 를 올립니다. 

이 문제를 피하기 위해 fake_ar_modules를 true로 설정합니다.그러면 오류 없이 가짜를 만들 수 있습니다.

RSpec Mocks vs Bogus

Bogus는 유닛 테스트 중 오브젝트를 격리합니다.즉, 오브젝트 메서드 테스트에 관련된 클래스나 오브젝트의 정보는 필요 없습니다.Rspec Mocks는 오브젝트 테스트에 사용되는 오브젝트에 관한 추가 정보가 필요합니다.Rspec Mocks에 비해 가짜를 사용하는 것의 큰 장점은 Bogus가 안전한 스터빙을 제공한다는 것입니다.

버전 이력

버전 하이라이트
0.1.6 Rubinius, RSpec 3 사용 테스트 클리어
0.1.5 매처 추가 및 기능 향상
0.1.4 코드 재정비, 위조품 개선, 최소 계약 지원
0.1.3 미니테스트 지원
0.1.2 RSPec 경고 삭제
0.1.1 RubiniusJRuby 지원
0.1.0 Ruby 2.0 지원, 위조 방지, 스파이 기능 향상
0.0.4 개량된 모크
0.0.3 글로벌 짝퉁, 향상된 stub 구문
0.0.2 익명의 가짜, 개선된 스터브 방식 콜
0.0.1 가짜, 몽둥이, 모크, 스파이

레퍼런스

  1. ^ "RubyGems.org - your community gem host". rubygems.org.
  2. ^ "Global fake configuration - Fakes - Bogus - bogus - Relish". www.relishapp.com. Retrieved 2017-02-13.
  3. ^ "What's a Ruby DSL and what isn't?". InfoQ. Retrieved 2017-02-10.
  4. ^ "Contract Tests - Bogus - bogus - Relish". www.relishapp.com. Retrieved 2017-02-13.
  5. ^ "What are idempotent and/or safe methods? - The RESTful cookbook". restcookbook.com. Retrieved 2017-02-13.
  6. ^ "Safe Stubbing - Bogus - bogus - Relish". www.relishapp.com. Retrieved 2017-02-11.
  7. ^ "Safe mocking - Safe Stubbing - Bogus - bogus - Relish". www.relishapp.com. Retrieved 2017-02-11.
  8. ^ "Bogus: A Brief Introduction".
  9. ^ "Argument matchers - Safe Stubbing - Bogus - bogus - Relish". www.relishapp.com. Retrieved 2017-02-12.
  10. ^ "Configuration Options - Bogus - bogus - Relish". www.relishapp.com. Retrieved 2017-02-11.
  11. ^ "search_modules - Configuration Options - Bogus - bogus - Relish". www.relishapp.com. Retrieved 2017-02-11.
  12. ^ "Class: ActiveRecord::Base — Documentation for rails (3.1.1)". www.rubydoc.info.
  13. ^ "fake_ar_attributes - Configuration Options - Bogus - bogus - Relish". www.relishapp.com. Retrieved 2017-02-11.

원천

외부 링크