단위, 기능, 수용 및 통합 테스트의 차이점은 무엇입니까? [닫은]


799

단위, 기능, 수용 및 통합 테스트 (및 언급하지 않은 다른 유형의 테스트)의 차이점은 무엇입니까?



1
로드 테스트를 포함하는 것을 잊었다 고 생각합니다!
토크는 싸다 Show Me Code

답변:


1350

보이는 위치에 따라 약간 다른 답변을 얻을 수 있습니다. 나는 그 주제에 대해 많이 읽었으며 여기에 증류가 있습니다. 다시 말하지만, 이들은 약간 울리며 다른 사람들은 동의하지 않을 수 있습니다.

단위 테스트

가장 작은 기능 단위, 일반적으로 메소드 / 함수를 테스트합니다 (예 : 특정 상태의 클래스가 주어지면 클래스에서 x 메소드를 호출하면 y가 발생 함). 단위 테스트는 하나의 특정 기능에 중점을 두어야합니다 (예 : 스택이 비어있을 때 pop 메소드를 호출하면 InvalidOperationException). 접촉하는 모든 것은 메모리에서 수행되어야합니다. 즉, 테스트 코드 테스트중인 코드는 다음 같아서는 안됩니다.

  • (사소하지 않은) 공동 작업자에게 전화
  • 네트워크에 액세스
  • 데이터베이스 조회
  • 파일 시스템 사용
  • 실을 돌려
  • 기타

느리거나 이해하기 어려운 / 초기화 / 조작이 가능한 모든 종류의 종속성은 적절한 기술을 사용하여 스텁 / 조롱 / 무엇이든 상관없이 코드 단위가 수행하는 작업에 초점을 맞출 수 있습니다.

간단히 말해, 단위 테스트는 가능한 한 간단하고 디버깅하기 쉽고 신뢰할 수 있으며 (외부 요소 감소로 인해) 실행 속도가 빠르고 프로그램의 가장 작은 빌딩 블록이 조합되기 전에 의도 한대로 작동 함을 증명하는 데 도움이됩니다. 주의해야 할 점은, 완벽하게 격리되어 작동한다는 것을 증명할 수 있지만 코드 단위가 결합되면 폭발 할 수 있습니다.

통합 테스트

통합 테스트는 코드 단위를 결합하고 결과 조합이 올바르게 작동하는지 테스트하여 단위 테스트를 기반으로합니다. 하나의 시스템에 내장되어 있거나 여러 시스템을 결합하여 유용한 기능을 수행 할 수 있습니다. 또한 통합 테스트와 단위 테스트를 차별화하는 또 다른 사항은 환경입니다. 통합 테스트는 스레드를 사용하거나 데이터베이스에 액세스하거나 모든 코드 다른 환경 변경이 올바르게 작동하는지 확인하는 데 필요한 모든 작업을 수행 할 수 있습니다.

직렬화 코드를 구축하고 디스크를 건드리지 않고 내장을 테스트 한 경우 디스크를로드하고 디스크에 저장할 때 어떻게 작동하는지 어떻게 알 수 있습니까? 파일 스트림을 플러시하고 처리하는 것을 잊었을 수 있습니다. 파일 권한이 잘못되었을 수 있으며 메모리 스트림에서 사용하여 내장을 테스트했습니다. 확실하게 확인할 수있는 유일한 방법은 프로덕션에 가장 가까운 환경을 사용하여 '실제로'테스트하는 것입니다.

주요 장점은 와이어 링 버그 (예 : 클래스 A의 인스턴스가 예기치 않게 널 인스턴스 B를 수신함)와 같은 단위 테스트가 할 수없는 버그와 환경 버그 (단일 CPU 머신에서 잘 실행되지만 동료의 4 대 컴퓨터는 테스트를 통과 할 수 없습니다). 가장 큰 단점은 통합 테스트가 더 많은 코드를 건드리고 신뢰성이 떨어지며 고장을 진단하기가 어렵고 테스트를 유지하기가 어렵다는 것입니다.

또한 통합 테스트가 반드시 완전한 기능이 작동 함을 입증하지는 않습니다. 사용자는 내 프로그램의 내부 세부 정보에 신경 쓰지 않을 수도 있지만 그렇게합니다!

기능 테스트

기능 테스트는 지정된 입력에 대한 결과를 사양과 비교하여 특정 기능의 정확성을 검사합니다. 기능 테스트는 중간 결과 또는 부작용과 관련이 없으며 결과 만 제공합니다 (x를 수행 한 후 객체 y의 상태가 z 인 것을 신경 쓰지 않습니다). "2의 인수를 가진 함수 Square (x)를 호출하면 4가 리턴 됨"과 같은 스펙의 일부를 테스트하기 위해 작성됩니다.

합격 시험

승인 테스트는 두 가지 유형으로 나뉩니다.

표준 승인 테스트는 전체 시스템에서 테스트를 수행하여 (예 : 웹 브라우저를 통해 웹 페이지 사용) 응용 프로그램 기능이 사양을 충족하는지 확인합니다. 예를 들어 "확대 / 축소 아이콘을 클릭하면 문서보기가 25 % 확대됩니다." 결과의 실제 연속성은 없으며 단지 통과 또는 실패 결과입니다.

장점은 테스트가 일반 영어로 설명되어 있으며 소프트웨어 전체가 기능을 완벽하게 완료한다는 것입니다. 단점은 테스트 피라미드를 한 단계 위로 올렸다는 것입니다. 승인 테스트는 코드의 산들과 접촉하므로 오류를 추적하는 것은 까다로울 수 있습니다.

또한 민첩한 소프트웨어 개발에서 사용자 승인 테스트에는 개발 과정에서 소프트웨어 고객이 작성하거나 소프트웨어 고객에 대해 작성된 사용자 스토리를 반영하는 테스트 작성이 포함됩니다. 테스트가 통과되면 소프트웨어가 고객의 요구 사항을 충족해야하며 스토리가 완료된 것으로 간주 될 수 있음을 의미합니다. 수용 테스트 스위트는 기본적으로 시스템 사용자가 사용하는 언어로 테스트를 설명하는 도메인 특정 언어로 작성된 실행 사양입니다.

결론

그것들은 모두 보완 적입니다. 때로는 한 가지 유형에 집중하거나 완전히 배제하는 것이 유리합니다. 저에게 가장 큰 차이점은 일부 테스트는 프로그래머의 관점에서 사물을 보는 반면 다른 테스트는 고객 / 최종 사용자 포커스를 사용한다는 것입니다.


19
+1. @Mark Simpson 기능 및 수용 테스트를 "시스템 테스트"로 요약 할 수 있습니까? 엔드 투 엔드 테스트는 어디에 적합합니까? (내 취향에 따라 너무 다른 어휘)
Torsten Engelbrecht

3
@Franz 저는 코드 단위를 분리하고 테스트하여 위험을 줄일 수있는 기능과 용이성에 대해 이야기 했습니다. 테스트에서 코드에 버그가 없음을 증명할 수 없기 때문에 내가 사용한 언어가 약간 느슨했습니다.
마크 심슨

15
공개 투표에도 불구하고, 이것은 완전히 잘못되었습니다. 단위 테스트는 "사소한"협력자조차 테스트하지 않습니다. 주입 된 종속성은 조롱해야합니다. 기능 테스트는 "동작"을 테스트하지 않습니다. "function"만 테스트합니다. 즉 "f (A)는 B를 반환합니다." 부작용이 중요한 경우 "행동 적"입니다. 여기에 시스템 호출이 포함 된 경우 "동작 시스템 테스트"와 같이 "시스템"테스트이기도합니다. (아래의 testerab @ 참조) "수락"테스트는 전체 스택을 다루는 "행동 시스템 테스트"의 하위 세트입니다. "통합"은 실제 사용을 시뮬레이션하여 상향 테스트합니다. 모든 종속성이 실제로 통합 될 수 있는지 테스트합니다.
cdunn2001

7
@ cdunn2001 : 걱정하지 마십시오. 건설적인 비판은 항상 좋습니다 :) 귀하의 의견은 제가 모르고 몇 가지 용어를 정리했습니다. 나는 항상 테스트에 관심이있는 개발자들로부터 새로운 것을 배우고 싶어합니다. 나는 Miško Hevery의 블로그를 발견 처음을 기억 - 그것은 :) 매장물 같았다
마크 심슨

11
@ MarkSimpson 귀하의 답변은 매우 좋지만 기능 테스트에 관한 좀 더 자세한 내용을 원합니다. 나는 당신의 대답에서 기능 테스트와 단위 테스트를 구별하기가 어렵습니다. 나는 당신이 이것에 대한 시간이 있기를 바랍니다, 위대한 일을 계속!
Andrei Sandulescu

90

중요한 것은 그 용어가 동료에게 어떤 의미인지 아는 것입니다. 예를 들어, 서로 다른 그룹은 "완전한 엔드 투 엔드"테스트를 할 때 의미가 약간 다르게 정의됩니다.

최근에 테스트를 위해 Google의 이름 지정 시스템을 발견했으며 선호합니다. Small, Medium 및 Large를 사용하여 인수를 우회합니다. 테스트에 적합한 범주를 결정하기 위해 몇 가지 요소를 검토합니다. 실행하는 데 걸리는 시간, 네트워크, 데이터베이스, 파일 시스템, 외부 시스템 등에 액세스하는 등의 요소가 있습니다.

http://googletesting.blogspot.com/2010/12/test-sizes.html

현재 직장에 대한 Small, Medium 및 Large의 차이점이 Google과 다를 수 있다고 생각합니다.

그러나 그것은 단지 범위에 관한 것이 아니라 목적에 관한 것입니다. 프로그래머와 고객 / 최종 사용자 등 테스트에 대한 다양한 관점에 대한 Mark의 요점은 정말 중요합니다.


6
Google 테스트 이름 지정에 +1하면 다양한 조직 / 사람이 테스트에 대해 다른 정의를 갖는 이유에 대해 약간의 관점을 제공 할 수 있습니다.
Mark Simpson

이 글은 또한 다른 레벨의 테스트를 사용하는 이유와 그 결과에서 나오는 훌륭한 기사입니다. kentcdodds.com/blog/unit-vs-integration-vs-e2e-tests
testerab

63

http://martinfowler.com/articles/microservice-testing/

Martin Fowler의 블로그 게시물은 코드를 테스트하는 전략 (특히 마이크로 서비스 아키텍처)에 대해 설명하지만 대부분의 응용 프로그램에 적용됩니다.

그의 요약 슬라이드에서 인용하겠습니다.

  • 단위 테스트-응용 프로그램에서 테스트 가능한 가장 작은 소프트웨어를 시험하여 예상대로 작동하는지 확인합니다.
  • 통합 테스트-인터페이스 결함을 감지하기 위해 구성 요소 간의 통신 경로 및 상호 작용을 확인하십시오.
  • 구성 요소 테스트-테스트 된 시스템의 범위를 테스트중인 시스템의 일부로 제한하고 내부 코드 인터페이스를 통해 시스템을 조작하고 테스트 더블을 사용하여 테스트중인 코드를 다른 구성 요소와 격리시킵니다.
  • 계약 테스트-외부 서비스의 경계에서 상호 작용이 소비 서비스에 의해 예상되는 계약을 충족하는지 확인합니다.
  • 엔드 투 엔드 테스트-시스템이 외부 요구 사항을 충족하고 목표를 달성하여 전체 시스템을 엔드 투 엔드로 테스트하는지 확인합니다.

그건 그렇고 좋은 기사입니다. 그러나 계약 테스트가 무엇인지 완전히 이해하지 못합니다. 컴포넌트 및 통합 테스트에 비추어 볼 때 중복되지 않습니까?
wheleph

Fowler가 사용하는 일부 언어에서는 void IMyInterface.MyMethod ()와 같은 클래스의 표준 정의를 사용할 때 노출되지 않는 인터페이스를 구현할 수 있습니다. 논리적으로 자체 테스트를 수행합니다. 그 시점에서 당신은 BDD로 향하고 있습니다. 아이러니하게도 파울러 씨는 땅을 가졌습니다.
Skarsnik

2
그것은 Fowler 기사 btw가 아니며 방금 게시했습니다. 계약 테스트는 클라이언트가 서비스를 사용하기 시작한 후에 수행되는 테스트입니다. 그런 다음 특정 클라이언트에 대해 무언가를 위반하지 않았는지 확인하는 테스트 (예 : 서비스 API 변경)를 작성합니다.
Rafał Łużyński

@wheleph 장치, 통합 및 구성 요소 테스트는 대부분 개발자가 제어 할 수있는 소프트웨어 내부를 말합니다. 처음 세 가지 문제는 소스를 변경하여 문제를 해결하는 것을 의미합니다. -계약 테스트는 기능상 약속 된 사항을 다루지 만 결함이있을 경우 직접 변경하지 못할 수 있습니다. 이를 위해서는 결함을 수정하는 대신 가능한 문제를 해결하기 위해 지원 코드를 추가해야합니다. 따라서 계약 사양에 특정 구조가 있다고 말한 경우에도 잘못된 json을 제공하는 웹 서비스를 사용하는 것이 좋습니다.
Yemi Bedu

31

단위 테스트 -이름에서 알 수 있듯이이 방법은 개체 수준에서 테스트합니다. 개별 소프트웨어 구성 요소는 오류가 있는지 테스트합니다. 이 테스트에는 프로그램에 대한 지식이 필요하며 소프트웨어가 의도 한대로 동작하는지 확인하기 위해 테스트 코드가 작성됩니다.

기능 테스트 -시스템의 내부 작동에 대한 지식없이 수행됩니다. 테스터는 다른 입력을 제공하고 생성 된 출력을 테스트하여 요구 사항에 따라 시스템을 사용하려고합니다. 이 테스트는 폐쇄 상자 테스트 또는 블랙 박스라고도합니다.

승인 테스트 -소프트웨어가 클라이언트에게 전달되기 전에 수행되는 마지막 테스트입니다. 개발 된 소프트웨어가 모든 고객 요구 사항을 충족하는지 확인하기 위해 수행됩니다. 내부 승인 테스트 (알파 테스트)라고하는 개발 팀 구성원이 수행하는 승인 테스트와 고객 또는 최종 사용자 (베타 테스트)가 수행하는 승인 테스트의 두 가지 유형이 있습니다.

통합 테스트 – 이미 유닛 테스트를 거친 개별 모듈은 서로 통합되어 있습니다. 일반적으로 두 가지 접근 방식을 따릅니다.

1) 하향식
2) 상향식


하향식과 상향식이란 무엇입니까? 통합 테스트가 엔드 투 엔드 테스트와 동일합니까?
tamj0rd2

18

이것은 매우 간단합니다.

  1. 단위 테스트 : 코딩 지식이있는 개발자가 실제로 수행하는 테스트입니다. 이 테스트는 코딩 단계에서 수행되며 화이트 박스 테스트의 일부입니다. 소프트웨어가 개발 용으로 제공되면 소프트웨어는 단위라고하는 코드 조각 또는 코드 조각으로 개발됩니다. 그리고 이러한 단위에 대한 개별 테스트는 개발자가 문장 적용 범위 누락 등과 같은 사람의 실수를 찾기 위해 수행 한 단위 테스트라고합니다.

  2. 기능 테스트 :이 테스트는 테스트 (QA) 단계에서 수행되며 블랙 박스 테스트의 일부입니다. 이전에 작성된 테스트 사례의 실제 실행 이 테스트는 실제로 테스터가 수행하며 사이트에서 기능의 실제 결과를 찾고이 결과를 예상 결과와 비교합니다. 그들이 불일치를 발견하면 이것은 버그입니다.

  3. 수락 테스트 : UAT라고합니다. 그리고 실제로 테스터와 개발자, 관리 팀, 저자, 작가 및이 프로젝트에 참여한 모든 사람이 수행했습니다. 버그가없는 상태로 프로젝트를 최종 제공 할 수 있도록합니다.

  4. 통합 테스트 : 코드 단위 (1 지점에서 설명)는 서로 통합되어 프로젝트를 완료합니다. 이 코드 단위는 다른 코딩 기술로 작성되거나 다른 버전 일 수 있으므로 개발자는 코드의 모든 단위가 다른 코드 단위와 호환되고 통합 문제가 없는지 확인하기 위해이 테스트를 수행합니다.


1
@OlegTsyba는 질문에 대한 답변이 4 년 후에 나왔습니다.
bentesha

1
"이것은 매우 간단합니다"로 답을 시작해서는 안됩니다. 특히 주제와 같은 복잡한 주제 일 경우 더욱 그렇습니다.
milosmns 2016 년

6

코드 테스트가 처음입니다. 단위 테스트는 대부분 시간 낭비처럼 보입니다. 나는 단위 테스트를하고 있다고 생각했지만 통합 테스트를하고 있었고 단위 테스트에 대해 읽었으며 경험이 거의없는 사람들에게는 어리석은 것처럼 보입니까? 내가 어떤 종류의 요점을 놓칠 가능성이 있습니다.
PixMach

단위 가 광범위하게 정의 되면 올바르게 단위 테스트를 수행 한 것입니다. 테스트 구현 세부 사항에 반대합니다. 개인 수업은 "단위 테스트"해서는 안됩니다. 그러나 공개 클래스가 여러 개인 경우 다른 클래스를 테스트하면서 다른 클래스를 조롱하려는 유혹을받을 수 있습니다. 그것은 실제 토론입니다. 는 IS 단위 (a)는 전체 라이브러리는? (b) 도서관 내의 각 공과 반? 또는 (c) 각 수업 내 각 공개 방법? 주어진 라이브러리를 통합 구성 요소로 테스트하지만 외부 종속성을 조롱하거나 위조하는 것이 좋습니다 (빠르고 신뢰할 수없는 경우 제외). 그래서 난 당신과 함께 생각합니다.
cdunn2001

1
@ PixMach : 실제로 다른 방법입니다. (좋은) 단위 테스트를 실시하지 않으면 나중에 (또는 다른 사람이) 해당 코드를 변경 해야하는 경우 많은 시간을 낭비합니다. 단위 테스트 유무에 관계없이 코드를 유지 관리 한 경험이 있다면 차이점을 알게 될 것입니다. 아이디어는 단위 테스트가 중단되면 코드의 어느 부분을 수정해야하는지 정확히 알아야한다는 것입니다. 실패한 대규모 승인 / 통합 테스트는 종종 사용자에게만 알려줍니다. 작동하지 않습니다. 그리고 당신은 구식 디버깅을 시작해야합니다 ...
Goodsquirrel

@Goodsquirrel, 그것은 당신이 "단위"라고 부르는 것에 달려 있습니다. 그것이 문제이다. 리팩토링 중에 잘못된 테스트가 삭제됩니다. 좋은 테스트는 여전히 도움이 될 것입니다. 나쁜 테스트는 가치를 더하지 못하고 방해가됩니다. 좋은 시험은 자체 문서화되며 대단히 감사합니다. 구체적으로합시다. 다른 값이 True이면 기본값을 반환하는 개인 메서드가 있습니다. (레거시 코드) 해당 방법을 테스트해야합니까? 난 반대 야. 다른 개인용 메소드는 n 번째 피보나치 수를 리턴합니다. 테스트해야합니까? 나는 찬성.
cdunn2001

1
가장 작은 노출 된 코드입니다. 큰 차이.
cdunn2001

5

나는 이론적 인 것없이 실제적인 예를 가지고 이것을 설명 할 것이다 :

개발자가 코드를 작성합니다. 아직 GUI가 구현되지 않았습니다. 이 레벨의 테스트는 기능이 올바르게 작동하고 데이터 유형이 올바른지 검증합니다. 이 단계의 테스트를 단위 테스트라고합니다.

GUI가 개발되고 응용 프로그램이 테스터에게 할당되면 클라이언트와 함께 비즈니스 요구 사항을 확인하고 다양한 시나리오를 실행합니다. 이것을 기능 테스트라고합니다. 여기에서는 클라이언트 요구 사항을 응용 프로그램 흐름과 매핑합니다.

통합 테스트 : 애플리케이션에 HR 및 재무라는 두 가지 모듈이 있다고 가정 해 봅시다. HR 모듈은 이전에 제공 및 테스트되었습니다. 이제 재무가 개발되어 테스트 할 수 있습니다. 이제 상호 종속 기능도 사용할 수 있으므로이 단계에서는 두 지점 간의 통신 지점을 테스트하고 요구 사항에 따라 요청한대로 작동하는지 확인합니다.

회귀 테스트는 새로운 개발 또는 버그 수정 후에 수행되는 또 다른 중요한 단계입니다. 그 목적은 이전에 작동 한 기능을 확인하는 것입니다.


1
"개발자가 코드를 작성합니다. 아직 GUI가 구현되지 않았습니다.이 레벨의 테스트는 기능이 올바르게 작동하고 데이터 유형이 올바른지 검증합니다.이 테스트 단계를 단위 테스트라고합니다."사실이 아닙니다. GUI는 실제로 "플러그인"입니다. API 출력에 E2E 테스트를 이미 작성할 수 있습니다. (또는 생성 한 응답 객체)
user3790897

4

단위 테스트 : 응용 프로그램에서 개별 모듈 또는 독립 구성 요소의 테스트는 단위 테스트로 알려져 있으며 단위 테스트는 개발자가 수행합니다.

통합 테스트 : 모든 모듈을 결합하고 응용 프로그램을 테스트하여 통신 및 모듈 간의 데이터 흐름이 제대로 작동하는지 확인합니다.이 테스트는 개발자도 수행합니다.

funcional 테스트 애플리케이션의 개별 기능 검사는 기능 시험 수 평균 인

승인 테스트이 테스트는 최종 사용자 또는 고객이 빌드 응용 프로그램이 고객 요구 사항을 따르는 지 여부와 고객 사양에 따라 수행되며, 고객 사양은 승인 테스트라고합니다.

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