프로그래밍에서 "to stub"은 무엇을 의미합니까?


117

예를 들어,이 인용문에서 의미하는 바는 무엇입니까?

외부 API와의 통합은 모든 최신 웹 앱에서 거의 보장됩니다. 효과적으로 통합을 테스트하려면, 당신은 할 필요가 스텁 그것을 밖으로. 좋은 스텁 은 쉽게 만들 수 있고 실제 현재 API 응답으로 일관되게 최신 상태 여야합니다. 이 게시물에서는 외부 API 용 스텁 을 사용하는 테스트 전략을 간략하게 설명합니다 .


9
What is a "Stub" 에서 받아 들여진 대답을 보셨습니까 ? ?
Nick

답변:


104

스텁은 시스템 의 기존 종속성 (또는 공동 작업자)에 대한 제어 가능한 대체입니다 . 스텁을 사용하면 종속성을 직접 처리하지 않고도 코드를 테스트 할 수 있습니다.

외부 종속성-기존 종속성 :
테스트중인 코드가 상호 작용하고 제어 할 수없는 시스템의 개체입니다. (일반적인 예는 파일 시스템, 스레드, 메모리, 시간 등입니다.)

예를 들어 아래 코드에서 :

public void Analyze(string filename)
    {
        if(filename.Length<8)
        {
            try
            {
                errorService.LogError("long file entered named:" + filename);
            }
            catch (Exception e)
            {
                mailService.SendEMail("admin@hotmail.com", "ErrorOnWebService", "someerror");
            }
        }
    }

mailService.SendEMail () 메서드 를 테스트하고 싶지만 테스트 메서드에서 Exception 을 시뮬레이트해야 하므로 원하는 결과를 시뮬레이트하기 위해 Fake Stub errorService 객체를 생성하면됩니다. 그러면 테스트 코드는 다음과 같습니다. mailService.SendEMail () 메서드 를 테스트 할 수 있습니다. 보시다시피 ErrorService 클래스 개체 (기존 종속성 개체) 인 다른 종속성의 결과를 시뮬레이션해야합니다 .


9
영어? 기존 종속성이란 무엇입니까?
Jwan622

17
@ Jwan622 평신도 용어로 : 코드가 사용하는 모든 것. 다시 읽고 "종속성"을 "클래스"나 "함수"또는 기타 (배경에 따라 다름)로 바꾸면 이해하는 데 도움이 될 수 있습니다. 때로는 기존 클래스 / 함수를 사용하는 것이 실행 가능한 옵션이 아니며 스텁이 필요합니다 (예 : 시스템의 현재 날짜 및 시간과 같은 환경에 의존하는 함수에 대한 자동화 된 단위 테스트에서).
MasterMastic

101

스텁 이 컨텍스트에서, 모의 구현을 의미한다.

즉, 인터페이스를 준수하고 테스트에 사용되는 간단한 가짜 구현입니다.


3
자세한 내용은 Martin Fowler 의 유명한 Mocks Are n't Stubs 기사 에서 제공됩니다 . "하지만 모의 객체가 제대로 설명되지 않는 경우가 많습니다. 특히 스텁과 혼동되는 경우가 종종 있습니다. 환경 테스트에 대한 일반적인 도우미입니다."
pba

61

Layman의 용어는 사용자 (또는 상대방)가 실제 데이터를 제공 / 수신 할 준비가 될 때까지 코드를 테스트하거나 개발하는 데 사용할 수있는 더미 데이터 (또는 가짜 데이터, 테스트 데이터 등)입니다. 프로그래머의 "Lorem Ipsum"입니다.

직원 데이터베이스가 준비되지 않았습니까? Jane Doe, John Doe ... 등으로 간단한 것을 만드십시오. API가 준비되지 않았습니까? 가짜 데이터가 포함 된 정적 .json 파일을 만들어 가짜 파일을 만듭니다.


1
예를 들어 주셔서 감사합니다 :)
CapturedTree

8

이 문맥에서 "stub"이라는 단어는 "mock"대신 사용되지만 명확성과 정확성을 위해 저자는 "mock"이 일종의 스텁이지만 테스트 용이므로 "mock"을 사용해야합니다. 더 이상의 혼란을 피하기 위해 스텁이 무엇인지 정의해야합니다.

일반적인 맥락에서 스텁은 다른 프로그램 (일반적으로 다른 시스템, VM 또는 프로세스에 위치)을 호출하는 복잡성을 캡슐화하는 프로그램 (일반적으로 함수 또는 개체)의 일부이지만 항상 그런 것은 아니지만 로컬 일 수도 있습니다. 목적). 호출 할 실제 프로그램은 일반적으로 동일한 메모리 공간에 있지 않기 때문에 호출하려면 주소 지정, 실제 원격 호출 수행, 전달할 데이터 / 인수 마샬링 / 직렬화 (및 잠재적 결과와 동일)와 같은 많은 작업이 필요합니다. 인증 / 보안 등을 처리 할 수도 있습니다. 일부 컨텍스트에서 스텁은 프록시 (예 : Java의 동적 프록시)라고도합니다.

mock은 테스트를 위해 다른 함수 나 객체를 대체하기 때문에 매우 구체적이고 제한적인 종류의 스텁입니다. 실제로 우리는 종종 테스트 환경에서 원격 프로그램을 대체하기 위해 로컬 프로그램 (함수 또는 객체)으로 모의를 사용합니다. 어쨌든 모의는 제한된 컨텍스트에서 대체 된 프로그램의 실제 동작을 시뮬레이션 할 수 있습니다.

가장 유명한 종류의 스텁은 원격 프로 시저 ( RPC ) 또는 원격 객체 ( RMI , CORBA ) 를 호출해야 할 때 분산 프로그래밍을위한 것 입니다. 대부분의 분산 프로그래밍 프레임 워크 / 라이브러리는 스텁 생성을 자동화하므로 수동으로 작성할 필요가 없습니다. 예를 들어 IDL 로 작성된 인터페이스 정의에서 스텁을 생성 할 수 있습니다 (하지만 모든 언어를 사용하여 인터페이스를 정의 할 수도 있습니다).

일반적으로, RPC, RMI, CORBA에서, 그래서 하나의 구별에 클라이언트 측 스텁 대부분 마샬링의 관리 / 인수를 직렬화 및 원격 호출을 수행하고, 수행, 서버 측 스텁을 대부분의 비 정렬 화를 돌봐 / 역 직렬화 인수 및 실제로 원격 함수 / 메소드를 실행합니다. 분명히 클라이언트 스텁은 클라이언트 측에 있고 서버 스텁 (종종 스켈레톤이라고 함)은 서버 측에 있습니다.

효율적이고 일반적인 스텁을 작성하는 것은 객체 참조를 다룰 때 매우 어렵습니다. RMI 및 CORBA와 같은 대부분의 분산 개체 프레임 워크는 분산 개체 참조를 처리하지만 대부분의 프로그래머는 REST 환경에서이를 피합니다. 일반적으로 REST 환경에서 JavaScript 프로그래머는 AJAX 호출을 캡슐화하는 간단한 스텁 함수를 만듭니다 ( JSON.parse및 에서 지원하는 객체 직렬화 JSON.stringify). 자신감 CODEGEN의 프로젝트는 자동으로 여러 언어로 REST 스텁을 생성하기위한 광범위한 지원을 제공합니다.


4

스텁은 올바른 함수 이름, 올바른 매개 변수 수를 가지며 올바른 유형의 더미 결과를 생성하는 함수 정의입니다.

테스트 작성을 돕고 기능 설계가 완료되기 전에도 예제를 실행할 수 있도록 일종의 스캐 폴딩 역할을합니다.


3

또한 그러한 스텁을 생성 할 수있는 매우 좋은 테스트 프레임 워크가 있습니다. 내가 가장 좋아하는 것 중 하나는 Mockito 입니다. EasyMock 과 다른 것들도 있습니다 ... 그러나 Mockito는 당신이 읽어야 할 훌륭합니다-매우 우아하고 강력한 패키지


3

이 문구는 거의 확실하게 주택 건설의 단계 인 "stubbing out"배관과 유사합니다. 공사 중에는 벽이 열려있는 동안 거친 배관이 설치됩니다. 공사를 계속하려면이 작업이 필요합니다. 그런 다음 주변의 모든 것이 충분히 준비되면 다시 돌아와 수도꼭지와 화장실 및 실제 최종 제품을 추가합니다. (예를 들어 배관 스텁 아웃을 설치하는 방법을 참조하십시오 .)

프로그래밍에서 함수를 "스텁 아웃"하면 (테스트 또는 다른 코드 작성을 위해) 해결할 수있을만큼 충분히 빌드합니다. 그런 다음 나중에 돌아와서 전체 구현으로 대체합니다.


0

RPC 스텁

  • 기본적으로 클라이언트 측 스텁은 호출 가능한 서버 프로 시저 인 것처럼 클라이언트를 보는 프로 시저입니다.
  • 서버 측 스텁은 호출 클라이언트 인 것처럼 서버를 찾습니다.
  • 클라이언트 프로그램은 서버를 호출하고 있다고 생각합니다. 사실, 클라이언트 스텁을 호출합니다.
  • 서버 프로그램은 클라이언트가 호출했다고 생각합니다. 사실, 서버 스텁에서 호출합니다.
  • 스텁은 서로에게 메시지를 보내 RPC를 발생시킵니다.

출처


0

"함수를 제거한다는 것은 함수가 호출되었음을 보여줄만큼만 작성하고 나중에 시간이 더있을 때 세부 정보를 남겨 두는 것을 의미합니다."

From : SAMS Teach yourself C ++, Jesse Liberty 및 Bradley Jones

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.