단위 테스트와 기능 테스트


답변:


254

단위 테스트-클래스의 메소드 (함수)와 같은 개별 단위를 테스트하여 모든 종속성을 조롱합니다.

기능 테스트-AKA 통합 테스트. 시스템의 기능 조각을 테스트합니다. 이것은 많은 방법을 테스트하고 데이터베이스 또는 웹 서비스와 같은 종속성과 상호 작용할 수 있습니다.


170
"AKA 통합 테스트"에 동의하지 않습니다. 통합 테스트는 코드에서 둘 이상의 시스템 / 하위 시스템 간의 통합을 확인합니다. 예를 들어, ORM을 통해 SQL 쿼리를 확인하면 ORM과 데이터베이스가 함께 작동하는지 확인합니다. 기능 테스트 AKA 종단 간 IMHO.
graffic

7
@graffic Functional Test에 동의합니다. = 통합 테스트 지속 상태 등과 같이 서로 다른 시스템의 하위 구성 요소를 "통합"해야합니다. 그러나 일반적으로 통합 테스트의 범위는 훨씬 넓습니다.
nabster

4
아니, 아무것도 혼란스럽지 않았습니다.
bpapa

3
통합 테스트 IS-A 기능 테스트. 그러나 그 반대는 아닙니다. Google은 "기능 및 비 기능 테스트"를 수행하고 "이미지"를 확인하십시오.
Andrejs

4
이 답변은 단순히 잘못되었습니다! 기능 테스트는 통합 테스트에 가깝지 않습니다.
sotn

517

단위 테스트는 개발자에게 코드가 올바르게 작동하고 있음을 알려줍니다. 기능 테스트는 개발자에게 코드가 올바른 작업을 수행하고 있음을 알려줍니다 .

단위 테스트와 기능 테스트 에서 더 많은 내용을 읽을 수 있습니다


단위 테스트 및 기능 테스트에 대한 실생활 비유를 잘 설명하면 다음과 같이 설명 할 수 있습니다.

많은 경우 시스템 개발은 집을 짓는 것과 비슷합니다. 이 비유는 정확하지 않지만 단위 테스트와 기능 테스트의 차이점을 이해하기 위해 확장 할 수 있습니다.

단위 테스트는 주택 건설 현장을 방문하는 건물 관리자와 유사합니다. 그는 집안의 다양한 내부 시스템, 기초, 프레임, 전기, 배관 등에 중점을 둡니다. 그는 집안의 일부가 정확하고 안전하게 작동하는지, 즉 건축법을 준수하는지 확인합니다.

이 시나리오의 기능 테스트는 동일한 건설 현장을 방문하는 주택 소유자와 유사합니다. 그는 내부 시스템이 적절하게 작동하고 건물 관리자가 자신의 작업을 수행한다고 가정합니다. 주택 소유자는이 집에서 살게 될 것에 초점을 맞 춥니 다. 그는 집의 외모에 관심이 있으며, 다양한 방이 편안한 크기이며, 집이 가족의 요구에 적합합니까, 아침 햇살을 잡기 좋은 곳의 창문입니다.

주택 소유자가 집에서 기능 테스트를 수행하고 있습니다. 그는 사용자의 관점을 가지고 있습니다.

건물 관리자가 집에서 단위 테스트를 수행하고 있습니다. 그는 건축업자의 관점을 가지고 있습니다.


요약하면

단위 테스트는 프로그래머의 관점 에서 작성되었습니다 . 클래스 의 특정 메소드 (또는 단위 )가 특정 태스크 세트를 수행하도록하기 위해 작성됩니다.

기능 테스트는 사용자의 관점 에서 작성되었습니다 . 사용자가 원하는대로 시스템이 작동 하는지 확인합니다 .


18
인용구는 개념을 처음 접하는 사람에게는 약간 모호합니다.

2
@ fig-gnuton, 나는 설명을 모호하게 표현하지 않기 위해 정교하게 노력했습니다. 링크 내에서 좋은 예를 제공하므로 OP에 도움이 될 것이라고 생각되면 따옴표로 답변을 업데이트 할 수 있습니다.
Anthony Forloney

147
아마도 "단위 테스트는 프로그래머가 원하는 코드를 수행하는지, 기능 테스트는 프로그래머가 고객이 원하는 것을 수행하는지 확인하십시오"라고 말하는 또 다른 방법일까요?
JS.

3
나는 그것을 좋아하지만 그것을 조정할 것입니다. 기능 테스트는 반드시 응용 프로그램은 사용자가 작업을 수행 할 수 있습니다. 단위 테스트 확인 방법 코드 동작하는 프로그래머 예상하는한다.
Adam

2
프로그래머가 원하는 것이 최종 사용자가 원하는 것을 지키지 않습니까? 고객이 기대하는 것에 맞지 않는 테스트를 작성하는 이유는 무엇입니까?
O.Badr

140
  • 단위 테스트는 독립적 인 행동 단위를 테스트합니다 . 행동의 단위는 무엇입니까? 독립적으로 단위 테스트를 수행 할 수있는 가장 작은 시스템입니다. (이 정의는 실제로 원형입니다. IOW 는 전혀 정의 아니지만 실제로 직관적으로 이해할 수 있기 때문에 실제로 잘 작동하는 것 같습니다.)

  • 기능 테스트는 독립적 인 기능을 테스트합니다.


  • 행동 단위는 매우 작습니다. 저는이 어리석은 "방법 당 하나의 단위 테스트"만트라를 절대 싫어하지만, 크기 관점에서 보면 그것은 옳습니다. 행동 단위는 방법의 일부와 몇 가지 방법 사이에있는 것입니다. 기껏해야 하나 이상의 개체가 아닙니다.

  • 기능은 대개 여러 가지 방법으로 구성되며 여러 객체를 가로 질러 여러 아키텍처 레이어를 통해 잘라냅니다.


  • 단위 테스트는 다음과 같습니다. validate_country_code()함수를 호출 하고 국가 코드를 전달하면 'ZZ'반환해야합니다 false.

  • 기능 테스트는 다음과 같습니다. 국가 코드로 배송 양식을 작성 ZZ하면 메뉴에서 국가 코드를 선택할 수있는 도움말 페이지로 리디렉션되어야합니다.


  • 단위 테스트는 개발자의 관점에서 개발자를 위해 개발자가 작성합니다.

  • 기능 테스트는 사용자를 대상으로 할 수 있으며,이 경우 사용자 관점에서 사용자와 함께 (또는 사용자가 직접 올바른 도구 및 올바른 사용자를 사용하여) 개발자가 작성합니다. 또는 개발자가 직면 할 수도 있습니다 (예 : 사용자가 신경 쓰지 않는 일부 내부 기능을 설명 할 때). 개발자의 경우 개발자가 작성하지만 여전히 사용자의 관점에서 작성됩니다.


  • 전자의 경우, 기능 테스트는 수용 테스트 및 기능 요구 사항 또는 기능 사양의 실행 가능한 인코딩으로도 사용될 수 있으며, 후자의 경우 통합 테스트로도 사용될 수 있습니다.

  • 단위 테스트는 자주 변경되며 기능 테스트는 주요 릴리스 내에서 변경되지 않아야합니다.



훌륭한 답변! 한 가지- "주요 릴리스에서 기능 테스트가 절대 바뀌지 않아야합니다"가 왜 그런가?
Lazer

5
@Lazer, @cdeszaq : 많은 프로젝트에서 주 버전 번호의 변경은 이전 버전과의 비 호환성을 나타 내기 위해 사용되며 주 버전이 변경 되지 않으면 OTOH 는 하위 버전과의 호환성을 보장 합니다. "뒤로 호환성"이란 무엇입니까? "사용자가 볼 수있는 동작을 변경하지 않음"을 의미합니다. 기능 테스트는 사용자가 볼 수있는 동작 사양의 실행 가능한 인코딩입니다. 따라서 주 번호가 변경되지 않으면 기능 테스트가 변경 될 수 없으며 반대로 기능 기능 변경되면 주 번호도 변경 되어야합니다 .
Jörg W Mittag

2
참고 : 기능 테스트 추가 에 대해서는 아무 말도하지 않았습니다 ! 이전에 없었던 기능 추가가 이전 버전과 호환되지 않는 변경을 구성하는지 여부는 프로젝트에 따라 다릅니다. 최종 사용자 소프트웨어의 경우에는 그렇지 않습니다. 그러나 프로그래밍 언어의 경우? 예를 들어, 새 키워드를 도입하면 해당 키워드를 변수 이름으로 사용하는 현재 작동하는 프로그램이 유효하지 않게되어 이전 버전과 호환되지 않는 변경 사항 일 수 있습니다.
Jörg W Mittag

3
@ JörgWMittag는 다음과 같은 아이디어를 좋아합니다. '기능 테스트는 사용자가 볼 수있는 행동 사양의 실행 가능한 인코딩입니다 .'... 다른 수퍼 전문가가 실제로 동의하는지 여부는 원래 질문에 도움이됩니다. 'em "
마이크 설치류

1
"기능 테스트는 다음과 같습니다. 국가 코드가 ZZ 인 배송 양식을 작성하면 메뉴에서 국가 코드를 선택할 수있는 도움말 페이지로 리디렉션되어야합니다." 이것은 일종의 까다 롭지 만 "허용 테스트"라고 부릅니다. 기능 테스트는 배송 양식에 ZZ를 입력하면 사용자가 올바른 URL로 전달했거나 특정 예외 또는 오류가 발생했는지 테스트합니다.
Bob Ray

98

TLDR :

질문에 대답하기 위해 : 단위 테스트 기능 테스트 의 하위 유형 입니다.


기능비 기능 테스트 라는 두 가지 큰 그룹이 있습니다 . 내가 찾은 최고의 (완전하지 않은) 그림은 이것입니다 (source : www.inflectra.com ) :

여기에 이미지 설명을 입력하십시오

(1) 단위 테스트 : 작은 코드 조각 (기능 / 방법)의 테스트. (화이트 박스) 기능 테스트로 간주 될 수 있습니다.

함수가 결합되면 테스트 할 수있는 사용자 인터페이스 (모듈 테스트)를 사용하여 모듈 = 독립형을 만듭니다. 최소한 두 개의 별도 모듈이 있으면 서로 붙인 다음에옵니다.

(2) 통합 테스트 : 두 개 이상의 (서브) 모듈 또는 (서브) 시스템을 함께 모아서 잘 작동하는지 확인하십시오.

그런 다음 3 번째 모듈을 통합 한 다음 4 번째와 5 번째 순서를 자신이나 팀이 원하는 순서대로 통합하고 모든 퍼즐 조각을 한 번에 배치하면

(3) 시스템 테스트 : SW 전체를 테스트합니다. 이것은 거의 " 모든 조각 의 통합 테스트 "입니다.

괜찮 으면옵니다

(4) 수락 테스트 : 고객이 실제로 요청한 것을 구축 했습니까? 물론 승인 테스트는 고객이 스포츠카를 원했고 밴을 제작했음을 알 수있는 마지막 단계뿐만 아니라 수명주기 전체에서 수행해야합니다 .

여기에 이미지 설명을 입력하십시오


2
구글에서 "Unit test"를 일종의 "Functional test"라고 묘사 한 많은 사진들을 보았습니다. 그러나 여기서 다른 답변이 완전히 다른 개념을 설명하는 이유 무엇입니까? "기능 테스트"는 종단 간 테스트이고 단위 테스트 기능 테스트 가 아닙니다 . 나는 혼란 스러웠다. "기능 테스트"라는 용어를 다르게 정의하거나 정의하는 두 가지 다른 "종교"가 있습니까?
Ruslan Stelmachenko

답변 (심지어 높은 평가를받은 답변)도 잘못 될 수 있습니다.)
Andrejs

1
그림이 마음에 들지만 시스템 통합 테스트의 경우 퍼즐이 다른 부분을 연결할 수있는 위치가 없어도 "완전한"것으로 보입니다.
Jonathon Reinhart

4
@JonathonReinhart-반드시 그런 것은 아닙니다. 열린 모서리는 새로운 기능으로 시스템을 쉽게 확장 할 수 있으며 애자일과 같은 개발 방식을 사용할 때 특히 유용합니다.
Myles

위의 여러 상충되는 답변에서 분명히 Functional Test표준화 된 용어가 아니며 다른 사람들과 다른 의미를 가지고 있습니다.
Penghe Geng

12

"기능 테스트"는 코드에서 함수 (방법)를 테스트한다는 의미는 아닙니다. 일반적으로 시스템 기능을 테스트하고 있음을 의미 foo file.txt합니다. 명령 줄에서 실행 하면 줄 file.txt이 바뀔 수 있습니다. 대조적으로, 단일 단위 테스트는 일반적으로 단일 방법의 단일 사례에 적용됩니다. length("hello")5 length("hi")를 반환하고 2를 반환해야합니다.

단위 테스트와 기능 테스트 사이의 라인에 대한 IBM의 의견 도 참조하십시오 .


흥미롭지 만 흥미있는 링크는 다른 것을 의미합니다. 기능은 구현을 통해 수행하는 기능, 즉 사용자 관점에서의 테스트, 즉 사용자를위한 기능에 관한 것입니다.
Stefano Scarpanti 19 :

8

그러나 기본적인 차이점은 기능 테스트는 사용자 관점에서 외부에서 애플리케이션을 테스트한다는 것입니다. 단위 테스트는 프로그래머의 관점에서 애플리케이션을 내부에서 테스트합니다. 기능 테스트는 올바른 기능으로 응용 프로그램을 작성하는 데 도움이되며 실수로 응용 프로그램을 중단하지 않도록 보장해야합니다. 단위 테스트는 깨끗하고 버그가없는 코드를 작성하는 데 도움이됩니다.

Harry Percival의 "Python TDD"책에서 발췌


8

ISTQB에 따르면이 두 가지는 비교할 수 없습니다. 기능 테스트는 통합 테스트가 아닙니다.

단위 테스트는 테스트 수준 중 하나이며 기능 테스트는 테스트 유형입니다.

원래:

시스템 (또는 구성 요소)의 기능은 '무엇인가'입니다. 이는 일반적으로 요구 사항 사양, 기능 사양 또는 사용 사례에 설명되어 있습니다.

동안

단위, 모듈 및 프로그램 테스트라고도하는 구성 요소 테스트는 별도로 테스트 가능한 소프트웨어 (예 : 모듈, 프로그램, 객체, 클래스 등)의 결함을 검색하고 기능을 검증합니다.

ISTQB 구성 요소 / 단위 테스트에 따르면 기능적이거나 기능적이지 않을 수 있습니다.

구성 요소 테스트에는 기능 테스트 및 리소스 동작 (예 : 메모리 누수), 성능 또는 견고성 테스트, 구조 테스트 (예 : 의사 결정 범위)와 같은 특정 비 기능적 특성 테스트가 포함될 수 있습니다.

소프트웨어 테스팅 기초 에서 인용 -ISTQB 인증


나는 너무 많은 보풀에 동의하지만 어쨌든 그들은 가장 큰 선수 이며이 질문은 이론에 관한 것이기 때문에 ISTQB가 충분해야한다고 생각합니다.
Dominik

6

Rails에서 유닛 폴더는 모델에 대한 테스트를 보유하고, 기능 폴더는 컨트롤러에 대한 테스트를 보유하고, 통합 폴더는 다수의 컨트롤러가 상호 작용하는 테스트를 보유합니다. 비품은 테스트 데이터를 구성하는 방법입니다. 그것들은 조명기 폴더에 있습니다. test_helper.rb 파일에는 테스트의 기본 구성이 있습니다. 당신은 이것을 방문 할 수 있습니다 .


3

내가 생각하는 방식은 다음과 같습니다. 단위 테스트는 코드가 의도 한 코드를 수행한다는 것을 확립합니다 (예 : 매개 변수 a와 b를 추가하고 실제로 추가하고 빼지 않기를 원했습니다). 기능 테스트는 모든 코드가 함께 작동하여 올바른 결과를 얻을 수 있도록 테스트하므로 실제로 의도 한 코드가 시스템에서 올바른 결과를 얻습니다.


3

AFAIK, 단위 테스트는 기능 테스트가 아닙니다. 작은 예를 들어 설명하겠습니다. 전자 메일 웹앱의 로그인 기능이 사용자와 마찬가지로 작동하는지 테스트하려고합니다. 이를 위해 기능 테스트는 다음과 같아야합니다.

1- existing email, wrong password -> login page should show error "wrong password"!
2- non-existing email, any password -> login page should show error "no such email".
3- existing email, right password -> user should be taken to his inbox page.
4- no @symbol in email, right password -> login page should say "errors in form, please fix them!" 

기능 테스트에서 유효하지 않은 입력으로 로그인 할 수 있는지 확인해야합니까? 예 : 이메일에는 @ 기호가없고, username에는 하나 이상의 점이 있으며 (하나의 점만 허용됨), .com이 @ 등 앞에 나타납니다.? 일반적으로 아니요! 이러한 종류의 테스트는 단위 테스트로 진행됩니다.

아래 테스트와 같이 유닛 테스트 내에서 유효하지 않은 입력이 거부되는지 확인할 수 있습니다.

class LoginInputsValidator
  method validate_inputs_values(email, password)
    1-If email is not like string.string@myapp.com, then throw error.
    2-If email contains abusive words, then throw error.
    3-If password is less than 10 chars, throw error.

기능 테스트 4는 실제로 단위 테스트 1이 수행하는 작업을 수행합니다. 때로는 기능 테스트가 여러 가지 이유로 단위 테스트로 수행 된 일부 (전부는 아님) 테스트를 반복 할 수 있습니다. 이 예에서는 기능 테스트 4를 사용 하여 유효하지 않은 입력을 입력 할 때 특정 오류 메시지가 나타나는지 확인합니다 . 모든 잘못된 입력이 거부되는지 테스트하고 싶지 않습니다. 이것이 단위 테스트의 일입니다.


1
기능 테스트는 종종 단위 테스트보다 범위가 훨씬 좁습니다 (기능 테스트는 본질적으로 예상되는 기능을 입증하는 데 더 중점을 둡니다). 그러나 다른 차원 ( 단위 테스트의 구성) 을 설명 합니다. 기능 테스트에서의 목적 과 비교 ) 일부 단위 테스트는 기능 테스트이고 일부 기능 테스트는 단위 테스트이지만 겹치지 않는 많은 벤도 있습니다.
Myles

기능 테스트의 범위와 범위에없는 좋은 예.
마일스

2

단위 테스트

단위 테스트에는 일반적으로 함수 또는 메소드 인 최소 코드 단위의 테스트가 포함됩니다. 단위 테스트는 대부분 단위 / 방법 / 함수 개발자가 수행합니다. 왜냐하면 함수의 핵심을 이해하기 때문입니다. 개발자의 주요 목표는 단위 테스트로 코드를 다루는 것입니다.

일부 기능은 단위 테스트를 통해 테스트 할 수 없다는 제한이 있습니다. 모든 단위 테스트를 성공적으로 완료 한 후에도; 제품의 올바른 작동을 보증하지 않습니다. 단위 테스트는 한 번만 사용하도록 작성된 동안 시스템의 일부에서 동일한 기능을 사용할 수 있습니다.

기능 테스트

코드를 보지 않고 제품의 기능적 측면에서 테스트를 수행하는 블랙 박스 테스트 유형입니다. 기능 테스트는 대부분 전용 소프트웨어 테스터가 수행합니다. 여기에는 제품의 지정된 기능을 테스트하기 위해 표준화되지 않은 데이터를 사용하는 포지티브, 네거티브 및 BVA 기술이 포함됩니다. 테스트 범위는 단위 테스트보다 기능 테스트에 의해 개선 된 방식으로 수행됩니다. 테스트를 위해 응용 프로그램 GUI를 사용하므로 코드가 담당하는 기능을 결정하는 대신 인터페이스의 특정 부분이 정확히 무엇을 담당하는지 쉽게 판단 할 수 있습니다.



1

단위 테스트 :-단위 테스트는 특히 제품이 개발되는 동안 구성 요소별로 제품 구성 요소를 테스트하는 데 사용됩니다. Junit 및 Nunit 유형의 도구는 또한 단위별로 제품을 테스트하는 데 도움이됩니다. ** 통합 후 문제를 해결하는 대신 개발 초기에 문제를 쉽게 해결할 수 있습니다.

기능 테스트 :-테스트와 관련하여 테스트에는 두 가지 주요 유형의 테스트가 있습니다. 1. 기능 테스트 2. 비 기능 테스트.

비 기능 테스트 (Non-Functional Test)는 테스터가 테스트하는 테스트로, 제품은 고객이 언급하지 않은 품질 속성을 모두 수행하지만 해당 품질 속성이 있어야합니다. 같은 :-성능, 사용성, 보안,로드, 스트레스 등 기능 테스트에서 :-고객은 이미 자신의 요구 사항을 가지고 있으며 제대로 문서화되어 있습니다. 제안 된 시스템에. 이를 위해 테스터는 제안 된 시스템으로 구현 된 기능을 테스트해야합니다.


0

단위 테스트 는 일반적으로 개발자가 수행합니다. 동일한 작업의 목적은 코드가 올바르게 작동하는지 확인하는 것입니다. 일반적으로 단위 테스트를 사용하여 코드의 모든 경로를 처리해야합니다.

기능 테스트 : 이것은 좋은 참고 자료입니다. 기능 테스트 설명


6
가장 중요한 텍스트를 답변에 붙여 넣으십시오. 페이지가 언제 제거되어 링크를 무효화 할 수 있는지 알 수 없습니다.
Andrejs
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.