다른 테스트의 하위 집합 인 단위 테스트를 작성하는 데 가치가 있습니까?


15

약간 고안된 예를 들어, 함수가 두 개의 숫자를 반환하고 첫 번째 숫자가 두 번째 숫자보다 작은 지 테스트하고 싶다고 가정 해 봅시다.

def test_length():
    result = my_function()
    assert len(result) == 2

def test_order()
    a, b = my_function()
    assert a < b

여기서 test_length실패 하면 실패합니다 test_order. 쓰거나 test_length건너 뛰는 것이 가장 좋은 방법 입니까?

편집 :이 상황에서 두 테스트는 대부분 서로 독립적이며, 각 테스트는 독립적으로 실행되거나 역순으로 실행될 수 있습니다. 이것은 중요하지 않습니다. 따라서 이전의 질문 중 어느 것도

위의 복제본입니다.



2
@ GlenH7-이것은 다른 질문처럼 보입니다. 다른 하나는 " A호출 B하고 동일한 결과를 반환하는 함수가있는 경우 AB"를 모두 테스트해야합니다 . 이것은 테스트 중인 함수보다는 테스트 가 겹치는 것에 관한 것입니다. (현재 이름이 바뀌므로 혼란 스럽습니다).
Telastyn


1
엄밀히 말하면 이러한 테스트는 실제로 중복되지 않습니다 (성공 의존성이 없음). 함수 lambda: type('', (), {'__len__': lambda self: 2})()는 첫 번째를 통과하지만 두 번째는 통과하지 않습니다.
liori

1
@ GlenH7 : FWIW, 난 정말 질문을 변경하지 않았다, 그냥 모기 안전하게 만들려고 ;-) (@gnat : 공격 없음, 그냥 농담!)
Doc Brown

답변:


28

가치가있을 수 있지만 이것은 약간의 냄새입니다. 테스트가 제대로 분리되지 않았 test_order거나 ( 실제로 두 가지를 테스트하기 때문에 ) 테스트에서 너무 독단적입니다 (두 테스트를 동일한 논리적 인 것으로 테스트).

이 예에서는 두 테스트를 병합합니다. 예, 여러 개의 어설 션이 있음을 의미합니다. 너무 나쁘다. 당신은 여전히 ​​함수의 결과 인 한 가지를 테스트하고 있습니다. 때로는 현실 세계에서 두 가지 검사를 수행하는 것을 의미합니다.


하나의 사소한 점이 누락되었지만 귀하의 답변을 찬성했습니다. 파이썬에서는 my_function어설 션없이 정확히 두 개의 값을 반환하지 않으면 두 번째 테스트도 실패 합니다. 할당으로 인해 예외가 발생하기 때문입니다. 따라서 실제로 동일한 것을 테스트하기 위해 여러 개의 어설 션과 두 개의 검사를 사용할 필요가 없습니다.
Doc Brown

@DocBrown-나는 많이 가정했지만 파이썬의 오류 메시지에 익숙하지 않아 유익한 이유로 무작위 예외 / 오류 대신 어설 션 오류가 발생할 수 있는지 알 수 없습니다.
Telastyn

나는 현재 상황에서 오류 메시지가 충분히 유익하다고 생각합니다. 그러나 일반적으로 그렇지 않을 수 있습니다. 그렇기 때문에 이와 같은 경우에 대한 일반적인 접근 방식은 두 가지 어설 션을 사용하여 "병합"을 생각하는 것입니다. 어설 션 중 하나를 생략하여 테스트를 더 단순화 할 수 있다는 것이 밝혀졌습니다.
Doc Brown

5
@DocBrown assert로 명시 적으로 검사하는 또 다른 값은 테스트 자체가 아니라 테스트중인 코드의 실패라는 테스트를 검사하는 사람에게 명확하다는 것입니다. 테스트에서 예기치 않은 예외가 발생하면 실제로 어느 것이 잘못되었는지 파악하는 데 항상 시간을 소비해야합니다.
Chris Hayes

@ChrisHayes : 나는 "값이 없다"가 아니라 "필요하지 않다"라고 썼다.
Doc Brown

5

테스트는 명시 적이어야합니다. text_length가 실패하면 test_order가 실패한다고 완전히 추론되지는 않았습니다.

나는 당신이 게시 한 파이썬에서 어떻게 진행되는지 잘 모르겠지만, len(result)3이면 첫 번째는 실패하지만 두 번째는 통과 할 수 있습니다 (파이썬이 아닌 경우 JavaScript와 같은 언어로).

말했듯이 함수가 두 개의 숫자를 반환하고 순서대로 있는지 테스트하려고합니다. 두 가지 테스트입니다.


1
It's not completely inferred that if text_length fails test_order fails-파이썬에서는 예외를 줄 것입니다.
Doc Brown

나는 실패가 실패를 test_length의미 하는 경우에 관한 문제라고 생각한다 test_order. Javascript로 작성된 유사한 테스트 쌍이 두 개의 Python 테스트와 동일하게 작동하지 않는다는 사실은 관련이 없습니다.
Dawood는 모니카

2
@DavidWallace : "test_length를 쓰거나 건너 뛰는 것이 가장 좋은 방법입니까?"라는 질문을 기억하십시오. Javascript에서는 두 테스트를 하나로 통합하지 않은 경우 문제를 놓치지 않도록 두 가지 테스트 모두 필요 합니다. 파이썬에서는 첫 번째 문장을 안전하게 생략 할 수 있습니다 (이 답변의 첫 번째 문장에서 거부되고 두 번째 문장에서 "잘 모르겠습니다"). 솔직히 좋은 답변은 다르게 보입니다. 그러나 실제로 JavaScript에 대한 언급이 있기 때문에이 답변을 공표하지 않았습니다.
Doc Brown

4
@DavidWallace : 우리는 여기에 stackoverflow.com이 아닌 programmers.com이므로 여러 언어에 적용될 수있는 답변을 제공하는 IMHO는 특정 언어에 대한 답변보다 낫습니다. 그러나 특정 언어를 언급 할 때는 언어에 대한 대답이 정확해야하며 일부 속성을 혼용해서는 안됩니다.
Doc Brown

1
문제는 "다른 시험의 일부인 시험을 쓸 가치가 있는가"이고,이 답변은 "일부 언어에서는 어떤 시험도 다른 시험의 일부가 아니다"라고 말하면서 두 시험이 따라서 필요합니다. "당신의 코드는 C ++에서 전혀 컴파일되지 않으며, C ++에서는 함수가 하나의 값만 반환 할 수 있으므로 테스트 할 필요가 없습니다. 2를 반환합니다." ;-)
Steve Jessop

2

여기에서 유일한 가치는 test_length모든 것이 통과되면 그 존재가 "길이"가 테스트되었음을 ​​나타냅니다.

따라서이 두 가지 테스트를 모두 수행 할 필요는 없습니다. test_order이름은 그대로 유지하고 이름을 바꾸십시오 test_length_and_order.

덧붙여서, 나는 test약간 서투른 것으로 시작하는 이름의 사용을 발견했습니다 . 나는 당신이 주장하는 조건을 실제로 묘사하는 테스트 이름을 강력히 옹호합니다.


1
test사마귀는 파이썬의 테스트 프레임 워크에 의미가있다. 물론 당신이 그것의 팬인지를 바꿀 필요는 없지만 그것을 사용하는 누군가를 막는 데 필요한 논쟁의 무게를 바꾸는 것은 무엇입니까?
Steve Jessop

@SteveJessop 그래, 나는 그것이 필요하다는 것을 잊어 버린다. 내가 파이썬 전에 잠시 테스트를 작성할 때, 나는 그들 모두를 시작하는 습관을 가지고 test_that_같은, test_that_return_values_are_in_order등등. 어쩌면 향후 버전의 테스트 프레임 워크에서이 요구 사항을 해결할 수있을 것입니다.
Dawood는 모니카 복원

@DavidWallace : 원하는 경우 접두사를 변경할있습니다 .
Lie Ryan

1

그것이 진화 한 방법이라면이 테스트들을 따로 두겠습니다. 예 , test_order실패 할 가능성이 test_length있지만 그 이유를 확실히 알고 있습니다.

나는 또한이 경우 동의 거라고 test_order첫 등장 당신이 검증 실패는 결과가 아니라 그 수표를 추가, 아마도 두 값이 아니라는 것을 알게되었다 assert과에 테스트 이름을 변경 test_length_and_order차종 감각.

반환 된 값의 유형이 정수인지 확인해야한다면이 "옴니버스"결과 테스트에 포함시킬 것입니다.

그러나 이제 결과에 대한 테스트 배터리가 있습니다 my_function(). 테스트 할 컨텍스트가 여러 개인 경우 (또는 매개 변수가 여러 개일 경우)의 모든 결과를 테스트하는 서브 루틴이 될 수 있습니다 my_function().

그러나 단위 테스트를 작성할 때 일반적으로 좋은 입력 및 일반 출력 (부분의 "단위"테스트는 종종 소형 통합 테스트이므로)과는 별도로 엣지와 나쁜 경우를 테스트하며, 종종 여러 개의 어설 션을 사용합니다. 디버깅하지 않고 더 많은 정보를 원한다는 방식으로 실패하면 별도의 테스트로 진행합니다.

아마 별도의 테스트를 시작하고 확장 할 수 있도록 test_lengthtest_length_and_types떠나 test_order후자를 가정하면, 별도의 "정상적인 처리"로 볼 수 있습니다.

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