각 메소드에는 별도의 JUnit 테스트 클래스가 있어야합니까?


14

수업에 JUnit 단위 테스트를 작성하고 있습니다.

각 메소드마다 별도의 클래스를 두거나 실제 클래스마다 하나의 테스트 클래스를 갖는 것이 더 낫습니까?

답변:


19

테스트를 구성하는 방법은 테스트의 중요성에 비해 중요하지 않습니다.

좋은 테스트 스위트를위한 가장 중요한 것은 모든 기능을 포함한다는 것입니다. 회귀 결함이 발생할 때마다 즉시 알 수 있습니다. 각 메소드에 대해 하나의 테스트를 작성할지, 메소드의 각 입력 값 조합에 대해 하나의 테스트를 수행 할 것인지, 해당 메소드 내에서 가능한 각 코드 경로에 대해 하나의 테스트를 수행 할 것인지는 덜 중요합니다. 이러한 테스트를 몇 개 또는 여러 개의 테스트 클래스로 구성할지 여부는 훨씬 덜 중요합니다. 테스트 스위트는 항상 완전히 성공해야하므로 17 개 테스트 중 3 개 또는 2 개 중 하나에 실패하는지 여부는 중요하지 않습니다. 결정된.

물론 테스트 코드도 코드이므로 유지 관리 가능, 모듈화 등을위한 일반적인 모범 사례를 따라야합니다. 그러나 테스트 클래스 자체가 얼마나 잘 유지 관리 될 수 있는지에 따라 결정되어야합니다. 그들이 시험하는 수업. 언급 한 두 가지 정책 모두 일관되게 따라 가면 찾을 수있는 위치를 기억하는 데 도움이 될 수 있지만, 정책 선택보다 일관성이 더 중요합니다.


9

특정 질문에 대해 JUnit 규칙 은 애플리케이션 클래스 ( Foo1.java, Foo2.java)와 JUnit 테스트 클래스 ( Foo1Test.java, Foo2Test.java) 사이에 1 : 1 대응 관계를 유지하는 것 입니다.

즉, 사용 가능한 조직 구성표보다 단위 테스트 정신 / 목표의 중요성에 대한 Kilian의 강조에 전적으로 동의합니다. 컨벤션이 필요할 때 컨벤션에 예외를 허용하면서 컨벤션을 선택하여 대부분 고수하십시오.


4

각 메소드마다 별도의 클래스를 두거나 실제 클래스마다 하나의 테스트 클래스를 갖는 것이 더 낫습니까?

한 클래스의 메소드에 대해 별도의 테스트 클래스를 작성해야하는 경우 설계가 잘못되었습니다. 방법은 작고 읽기 쉽고 테스트하기 쉽고 변경하기 쉬워야합니다. 테스트 데이터 구성, 조롱 등으로 인해 테스트가 원래 코드보다 약간 길 수 있지만 크게 길지 않아야합니다. 만약 그렇다면, 테스트중인 수업이 너무 복잡하고 한 가지 이상의 책임을 져야합니다 ( 단일 책임 원칙 ) : 디자인 작업.


2

"메소드 당 하나의 테스트 클래스"와 "클래스 당 하나의 테스트 클래스"는 모두 너무 극단적이라고 생각합니다.

일반적으로 테스트 방법 / 단위 테스트 당 하나의 검사를 원합니다. 예를 들어, 이것들은 a list.isEmpty = true및 을 확인하기위한 다중 어설 션일 수 있으므로 list.Length = 0동작 당 하나의 테스트 방법 / 단위 테스트입니다.

이를 통해 동작을 설명하는 테스트 메소드 이름을 쉽게 찾을 수 있습니다. 테스트 메소드를 테스트 클래스로 그룹화하려고하므로를 읽으면 test classname.test method의미가 있습니다. 일반적으로 공유 설정 코드가 있으며 테스트 설정 / 픽스처에 쉽게 넣을 수 있습니다. 테스트중인 클래스에 따라 전체 클래스에 대해 하나의 테스트 클래스가 될 수 있으며 하나의 메소드에 대해 하나의 테스트 클래스가 될 수도 있습니다. 그러나 보통은 중간에있을 것입니다.

일반 코드와 마찬가지로 테스트를 가능한 한 읽기 쉽게하려고합니다. 나에게 도움이되는 것은 테스트 코드를 구성 할 때 BDD를 따르는 경우 또는 어 트랙트 동작 방식입니다. 테스트 클래스는 설정이 가능합니다. 그런 다음 해당 클래스의 모든 테스트 메소드는 주어진 (또는 그 일부) 메소드를 사용하며 한 번에 하나씩 있습니다.

단위 테스트는 테스트중인 클래스의 기능을 사용하는 방법에 대한 문서로 생각하십시오. 좋은 단위 테스트를 통해 테스트를 읽고 사용하려는 클래스의 기능을 사용하는 방법과 그 효과가 정확히 무엇인지 알 수 있습니다.

무언가가 깨지고 단위 테스트가 실패하면 가능한 한 쉽게 깨지기를 원합니다. 테스트 당 하나의 주장이 여기에 많은 도움이됩니다. 한 테스트에 여러 어설 션이있는 경우 첫 번째 어설 션 만 실패한 다음 메서드가 종료되므로 첫 번째 어설 션이 실패한 문제를 해결할 때까지 다음 테스트에서 테스트 된 다른 동작도 중단되는지 알 수 없습니다. 한 번의 주장으로 다른 모든 테스트 방법이 여전히 실행되며 실패의 깊이를 이해하는 것이 훨씬 빠릅니다.

물론 Kilian Foth에 동의합니다. 실제로 작업중인 코드에 대해 몇 가지 단위 테스트를 수행하는 것이 운이 좋을 수 있습니다. 소규모의 현지화 된 테스트는 전혀 테스트하지 않는 것보다 낫거나 빌드 서버에서 실행되는 대규모 통합 테스트 만 수행하는 데 많은 시간이 걸리고 일반적으로 현지화되지 않은 경우가 많습니다 (오류의 위치를 ​​신속하게 알려주지 않음) 조금 작업해야합니다).


좋은 점 : "testclass를 테스트 클래스로 그룹화하고 싶은 경우 testclassname.testmethod를 읽을 때 의미가 있습니다."
MAChitgarha

1

각 수업마다 테스트 수업이있는 것이 맞습니다. 아이디어는 대상 클래스와 관련된 모든 단위 테스트를 단일 테스트 클래스로 중앙 집중화하는 것입니다. 예를 들어 MyClass.java테스트 클래스는이라고 MyClassTest.java합니다.


0

회사에서 테스트하는 방법에 대한 문서가 있는지 또는 그들이 따르는 방식이 무엇인지 동료에게 문의하는 것이 좋습니다. 지침을 따르면 다른 사람이 테스트를 더 잘 읽을 수 있습니다.

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