각 단위 테스트를 다른 테스트와 독립적으로 실행할 수 있어야합니까?


24

클래스의 두 가지 메소드에 대한 테스트가 있다고 가정하십시오. 첫 번째 방법은 다른 계층에서 데이터를 수집하여 런타임 (예 : SQL 테이블)과 독립적으로 일종의 스토리지에 저장하므로이 테스트에서 처리하는 모든 데이터는 테스트에 하드 코딩됩니다. 두 번째 방법은 첫 번째 방법이 남은 위치에서 데이터를 가져 와서 어떤 방식 으로든 변환 (계산, 특정 부분 이동 등)을 담당합니다.

이제이 두 번째 방법은 첫 번째 방법과 같이 하드 코딩 된 입력을 가질 수 있거나 두 테스트가 순차적으로 실행되고 첫 번째 테스트에서 실제로 저장된 데이터를 가져 와서 첫 번째 테스트가 중단 된 위치에서 선택할 수 있다고 가정 할 수 있습니다.

두 번째 옵션을 사용하면 두 가지 방법이 잘 작동한다는 사실을 잘 알고 있지만 첫 번째 테스트가 실패하면 모든 테스트가 실패하고 버그를 더 빨리 격리하는 데 도움이되는 테스트 이점을 제거합니다.

첫 번째 옵션을 사용하면 각 방법이 독립적으로 격리되고 테스트되지만 실제로 제대로 작동 할 수 있다는 것을 절대 알 수 없습니다.

여기서 더 좋은 옵션은 무엇입니까? 하드 코딩을 사용하여 분리 된 각 방법에 대해 단일 테스트를 수행 한 다음 두 방법을 모두 포함하는 더 큰 테스트와 같은 대안이 있습니까?


2
실제로 단위 테스트가 실행될 때마다 순서를 쉽게 무작위로 지정할 수 있기를 바랍니다. 현재는 비교적 고정 된 순서이지만 알려지지 않은 상태로 실행됩니다.
Job

답변:


11

첫 번째 옵션을 사용하면 각 방법이 독립적으로 격리되고 테스트되지만 실제로 제대로 작동 할 수 있다는 것을 절대 알 수 없습니다.

당신의 방법이 정말로 독립적이라면 이것은 중요하지 않습니다. 두 번째 방법은 :

a) 유효한 데이터가 제시되면 올바르게 작동합니다.

b) 유효하지 않은 데이터가 제시 될 때 현명하고 일관되게 실패합니다.

마찬가지로 첫 번째 방법도 동일하게 수행해야합니다. 따라서 오류 사례를 처리하는 한 제대로 작동합니다.

메소드가 올바르게 작동하는지 테스트하려면 단위 테스트가 아니라 통합 테스트입니다.


27

테스트를 독립적으로 실행할 수 없으면 단위 테스트가 아닙니다.

단위 테스트는 데이터베이스 테이블의 내용과 같은 외부 상태에 의존해서는 안됩니다. 하나의 코드 단위를 단독으로 테스트해야합니다.

특정 상태를 변경하거나 요구하는 테스트는 유효하며, 예를 들어 통합 테스트의 일부를 구성 할 수 있으며, 이러한 경우 적절한 설정을 수행하는 것이 중요하지만 단위 테스트는 아닙니다. 이 경우에도 한 테스트에서 다른 테스트를 실행해야한다고 권장하지 않습니다. 이 경우 별도의 설정 방법에 필요한 코드를 제외해야합니다. 예를 들어 설정 코드를 호출하고 예외가 발생하지 않는지 확인하는 테스트가 하나있을 수 있습니다. 그런 다음 설정 메소드에서 설정된 데이터를 적극적으로 사용하는 다른 테스트가 있습니다.


이 예제에서 @Steve는 방법 1에 대한 하나의 테스트, 방법 2에 대한 하나의 테스트 및 동일한 테스트에서 1과 2를 실행하는 하나의 테스트입니까?
Morgan Herlocker

2
예. 처음 두 개는 단위 테스트이고 세 번째는 통합 테스트와 같습니다.
Steve

고객 모듈 및 주문 모듈이 있으면 고객과 관계없이 주문을 만들 수 없습니다. 고객 모듈과 독립적으로 테스트하는 방법 : sql을 사용하여 데이터베이스에 고객 레코드를 작성하거나 (고객에 삽입) Customer.createCustomer ()를 사용하십시오. IMHO는 두 번째 로직을 사용하는 것이 좋습니다. 테스트에서 로직을 필요로하지 않기 때문에 고객 생성 테스트가 통과 한 경우에만 작동합니다.
Dainius

@Dainius. 단위 테스트 시나리오에서는 일반적으로 모의 객체를 사용하므로 모의 고객을 주문 모듈로 전달합니다. 이 경우 sql을 사용하지 않으려는 것이 맞습니다.
Steve

방법 B가 방법 A에 의존하는 모든 시나리오에서 거의 항상 A를 호출 한 다음 B를 호출하는 방법 C가있을 것입니다.이 경우 A, B 및 C를 독립적으로 테스트 할 수 있습니다.
Morgan Herlocker

9

단위 테스트 B가 남긴 상태에 따라 단위 테스트 B를 사용하는 것이 지금 당연하다고 생각합니다. 그러나 수천 단위 테스트를 거친 지금부터 1 년을 고려하십시오. 변경해야 할 때마다 전체 테스트 스위트가 완료 될 때까지 10 분 동안 기다리기를 원하십니까?

물론 개발 스타일에 따라 다르지만 기능을 개발할 때 개별 테스트를 여러 번 실행할 수있는 괜찮은 테스트 중심 개발에 대한 희망이 있으면 각 테스트에 독립적 인 기능을 제공하는 것이 좋습니다.


1
+1 Raskolnikov, 나는 나중에 "모든 테스트를 실행"했을 때이 시간이 엄청나다는 사실을 고려하지 않았습니다.
Morgan Herlocker

3

테스트 설정에 대해 이야기하는 것처럼 들리며 여러 가지 방법으로 수행 할 수 있습니다. 각 테스트에 대해 테스트 데이터 (픽스처라고도 함)의 깨끗한 사본을 원하므로 각각 서로 의존해서는 안됩니다.

이러한 유형의 테스트를 허용하는 몇 가지 프레임 워크와 DBUnit과 같은 도구를 사용하여 테스트 및 테스트 스위트의 시작과 끝에서 데이터 구조를 신속하게 구축 및 분해 할 수 있습니다.

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