JUnit 대 TestNG [닫기]


125

직장에서 우리는 현재 테스트를 실행하기 위해 JUnit 3을 사용하고 있습니다. 우리는 새로운 테스트를 작성 하기 위해 JUnit 4로 전환하는 것을 고려 하고 있었지만 지금은 TestNG를 주시하고 있습니다. 모두 JUnit 4 또는 TestNG에 대해 어떤 경험을했으며, 매우 많은 수의 테스트에서 더 잘 작동하는 것 같습니까? 기능 테스트는 광범위한 측면을 다루고 결과를 얻기 위해 다양한 방식으로 작성되어야하기 때문에 테스트 작성에 유연성을 갖는 것도 중요합니다.

이전 테스트는 작업을 잘 수행하므로 다시 작성되지 않습니다. 새로운 테스트에서보고 싶은 것은 테스트 작성 방식의 유연성, 자연스러운 어설 션, 그룹화 및 쉽게 분산 된 테스트 실행입니다.


10
08에서 지금까지 변경된 사항이 있습니까 ????
some_other_guy

그냥 사용하십시오 TestNG. Junit이 가지고있는 모든 것, 그리고 훨씬 더 많이 있습니다!
Eric Wang

답변:


67

두 가지를 모두 사용했지만 기존 테스트를 새로운 형식으로 다시 작성하는 것을 고려해서는 안된다는 Justin Standard에 동의해야합니다. 결정에 관계없이 둘 다 실행하는 것은 매우 간단합니다. TestNG는 JUnit보다 훨씬 더 구성 가능하도록 노력하지만 결국 둘 다 똑같이 잘 작동합니다.

TestNG에는 테스트를 특정 그룹으로 표시 한 다음 특정 그룹의 모든 테스트를 쉽게 실행하거나 특정 그룹의 테스트를 제외 할 수있는 깔끔한 기능이 있습니다. 따라서 느리게 실행되는 테스트를 "느린"그룹으로 표시 한 다음 빠른 결과를 원하면 무시할 수 있습니다. 그들의 문서에서 제안하는 것은 새 파일을 체크인 할 때마다 실행해야하는 "체크인"테스트로 일부 하위 집합을 표시하는 것입니다. JUnit에서 이러한 기능을 본 적이 없지만 다시는없는 경우에는 그렇지 않습니다. t 정말 그것을 놓친다.

높은 구성에 대한 모든 주장에 대해 몇 주 전에 내가하고 싶은 일을 할 수 없었던 코너 케이스에 부딪 쳤습니다 ... 나는 그것이 무엇인지 기억할 수 있었으면 좋겠지 만, 그것을 제기하고 싶었습니다. 그래서 당신은 그것이 완벽하지 않다는 것을 알고 있습니다.

TestNG의 가장 큰 장점은 JUnit이 버전 4에 추가 한 주석입니다.


14
JUnit은 테스트 스위트를 정의한 다음 원하는 그룹의 테스트를 해당 스위트에 추가하여 이야기하고있는 그룹화 작업을 수행 할 수 있습니다. 그런 다음 해당 제품군 만 실행하는 ant 스크립트에서 대상을 설정하고 체크인시 해당 대상을 실행하도록 소스 제어를 설정할 수 있습니다.
Justin Standard

8
TestNG가 JUnit에 비해 가장 큰 장점은 매개 변수화 된 테스트를위한 테스트 데이터를 동적으로 생성 할 수 있다는 것입니다. 각 테스트 데이터 요소는 서로 다른 "테스트"이므로 데이터 기반 테스트를 만드는 것이 정말 쉽습니다. testng.org/doc/documentation-main.html#parameters
davetron5000

6
새로운 버전의 Junit에 통합 된 Theories로 매개 변수화 된 테스트를 쉽게 수행 할 수 있습니다 (현재 실험 중임).
Mnementh

9
TestNG 그룹은 JUnit 4.8에서 Categories : kentbeck.github.com/junit/doc/ReleaseNotes4.8.html 로 수행 할 수 있습니다 .
Kaitsu

언급되지 않은 사항 : TestNG의 가장 큰 장점은 각 테스트 방법에 전달한 것과 동일한 매개 변수를 테스트 전 / 후 구성 방법에 전달할 수 있다는 것입니다. 이것은 설정 및 해체에 큰 도움이됩니다. IMHO는 매우 강력합니다. 그것을 이해하지 못한다면 필요하지 않다고 생각할 수도 있습니다. 또한 코드에서 테스트 스위트를 정의하는 방법이 마음에 듭니다.
djangofan

20

먼저 최신 유행에 맞추기 위해 모든 테스트를 다시 작성하지 마십시오. Junit3는 완벽하게 잘 작동하며, 4에 주석을 추가해도 (제 생각에는) 그다지 구매하지 않습니다. 여러분이 테스트를 작성 하는 것이 훨씬 더 중요하며 여러분 처럼 들립니다.

가장 자연스러운 것을 사용하고 작업을 완료하는 데 도움이됩니다.

나는 그것을 사용하지 않은 TestNG b / c에 대해 언급 할 수 없습니다. 그러나 어떤 경로를 선택하든 JUnit / TestNG / DBUnit / EasyMock의 훌륭한 래퍼 인 unitils를 권장 합니다. (위에 언급 된 모든 맛을 지원합니다)


1
Unitils는 한동안 업데이트 된 것처럼 보이지 않습니다. 최신 버전의 JUnit / TestNG에서 작동합니까?
Chinasaur

2011 년에이 답변을 찾은 사람을 위해 확인한 결과 최신 unitils 버전 (3.2)의 출시 날짜는 2011-09-29입니다. 그래서이 되어 적극적으로 유지되고.
Ogre Psalm33

18

나를 위해 TestNG의 가장 큰 드로우 카드에는 지원 테스트 그룹이 포함되며 더 중요한 것은 테스트 그룹 종속성입니다 (테스트를 그룹에 종속 된 것으로 표시하면 종속 그룹이 실패 할 때 테스트 실행을 건너 뛰게됩니다).

나를위한 TestNG의 다른 빅 드로 카드에는 테스트 매개 변수, 데이터 공급자, 주석 변환기 및 그 무엇보다도 활기차고 반응이 빠른 사용자 커뮤니티가 포함됩니다.

표면적으로는 위의 모든 TestNG 기능이 필요하지 않다고 생각할 수 있지만 테스트에 가져다주는 유연성을 이해하기 시작하면 JUnit을 어떻게 처리했는지 궁금 할 것입니다.

(면책 조항-저는 JUnit 4.x를 전혀 사용하지 않았기 때문에 여기에서 발전된 기능이나 새로운 기능에 대해 실제로 언급 할 수 없습니다).


3
JUnit4와 TestNG를 모두 사용하고 있으며 TestNG는 봄 봄 테스트 통합을 더 잘 지원합니다. 스프링 기반 애플리케이션을 훨씬 쉽게 테스트 할 수 있습니다.
hidralisk

18

약 1 년 전에 우리는 같은 문제를 겪었습니다. 나는 어느 정도의 움직임이 더 나은지 고려하는 데 시간을 보냈고 결국 TestNG에는 '킬러 기능'이 없다는 것을 깨달았습니다. 훌륭하고 JUnit 4에는없는 몇 가지 기능이 있지만 필요하지는 않습니다.
우리는 사람들이 많은 테스트를 계속 작성하기를 원했기 때문에 TestNG를 알면서 테스트를 작성하는 것이 불편 함을 느끼기를 원하지 않았습니다.
또한 JUnit은 Java 세계에서 사실상 거의 표준입니다. 상자에서 그것을 지원하지 않는 괜찮은 도구는 없습니다. 웹에서 많은 도움을 찾을 수 있으며 작년에 많은 새로운 기능을 추가하여 그것이 살아 있음을 보여줍니다.

우리는 JUnit을 고수하기로 결정했고 결코 뒤돌아 보지 않았습니다.


IMHO, TestNG의 킬러 기능은 Before 및 After 설정 방법을 통해 컨텍스트 인수를 전달하는 기능입니다. Junit이 할 수없는 멋진 마술을 많이 할 수 있습니다. 95 %의 사람들이 TestNG를 잘 배우지 못하고 무지합니다. 또한 TestNG에는 DataProvider를 통한 깔끔한 스레딩 방법이 있지만이를 활용하는 경우에만 가능합니다. 또한 testng.xml은 Beanshell을 포함 할 수 있습니다.
djangofan 19

17

위의 모든 것을 응원합니다. 내가 개인적으로 TestNG에서 더 좋아하는 몇 가지 사항은 다음과 같습니다.

  1. @BeforeClass당신 만이 당신의 클래스의 정적 메서드를 호출 할 수있는 제약되지 않도록 TestNG를위한, 클래스 생성 한 후 발생합니다.

  2. 병렬 및 매개 변수화 된 테스트, 어쩌면 나는 삶이 충분하지 않을 수도 있습니다 ...하지만 드라이버 이름을 매개 변수로 받아들이는 한 세트의 Selenium 테스트를 작성하는 것이 좋습니다. 그런 다음 IE, FF 및 Chrome 드라이버에 대해 각각 하나씩 3 개의 병렬 테스트 그룹을 정의하고 레이스를 지켜 봅니다! 나는 원래 4 개를했지만 내가 작업 한 페이지 중 너무 많은 페이지가 HtmlUnit어떤 이유로 든 드라이버를 깨뜨렸다.

네, 그 삶을 찾아야 할 것 같습니다. ;)


마지막으로 결국 어떤 고기의 의견은 그들이 모두 동일한 .. 그리고 awwhing 있습니다 음, 어디
user2412398

예, TestNG 규칙 : TestNG DataProvider의 테스트 인수를 통해 드라이버 인스턴스도로드합니다. 내가 그것을 어떻게 여기에 있습니다 : github.com/djangofan/yet-another-selenium-framework/blob/master/...
djangofan

10

오늘 만난 것을 공유하고 싶었습니다. 내장 된 Parameterized runner는 TestNG와 비교할 때 Junit4에서 상당히 조잡하다는 것을 알았습니다 (각 프레임 워크에는 강점이 있지만 여전히 여전히 있음). Junit4 주석 @parameters는 한 세트의 매개 변수로 제한됩니다. 동일한 테스트 클래스의 기능에 대해 유효하고 잘못된 동작을 테스트하는 동안이 문제가 발생했습니다. 따라서 찾은 첫 번째 공개 정적 주석 메소드가 사용되지만 순서에 관계없이 찾을 수 있습니다. 이로 인해 불필요하게 다른 클래스를 작성하게됩니다. 그러나 TestNG는 모든 방법에 대해 서로 다른 종류의 데이터 공급자를 제공하는 깨끗한 방법을 제공합니다. 따라서 유효한 / 유효하지 않은 데이터를 별도로 두는 동일한 테스트 클래스에서 유효하고 잘못된 방식으로 동일한 코드 단위를 테스트 할 수 있습니다. 나는 TestNG와 함께 갈 것입니다.


7

또한 TestNG의 또 다른 장점은 병렬 테스트를 지원한다는 것입니다. 우리의 멀티 코어 시대에서는 이것이 중요하다고 생각합니다.

또한 두 프레임 워크를 모두 사용했습니다. 그러나 나는 단언을 위해 hamcrest를 사용합니다. Hamcrest를 사용하면 자신 만의 assert 메서드를 쉽게 작성할 수 있습니다. 그래서 대신

assertEquals(operation.getStatus(), Operation.Status.Active);

당신은 쓸 수 있습니다

assertThat(operation, isActive());

이를 통해 테스트에서 더 높은 수준의 추상화를 사용할 수 있습니다. 그리고 이것은 테스트를 더욱 강력하게 만듭니다.


7

JUnit 4 Vs TestNG – mkyong.com의 비교 (2013 년 업데이트).

결론 : TestNG는 매개 변수화 테스트, 종속성 테스트 및 스위트 테스트 (그룹화 개념)에서 발전 했기 때문에 Java 프로젝트의 핵심 단위 테스트 프레임 워크로 TestNG를 사용하는 것이 좋습니다 .

TestNG는 기능, 고수준 테스트 및 복잡한 통합 테스트를위한 것입니다. 유연성은 대규모 테스트 스위트에서 특히 유용합니다.

또한 TestNG는 전체 핵심 JUnit4 기능도 포함합니다 . 더 이상 JUnit을 사용할 이유가 없습니다.

간단히 말해서 TestNG = JUnit + 훨씬 더. 그래서, 왜 논쟁? 가서 TestNG 잡아 :-)

여기에서 더 자세한 비교를 확인할 수 있습니다 .


5

Mike Stone의 답변에 대한 몇 가지 추가 사항 :

1) TestNG의 그룹을 가장 자주 사용하는 것은 테스트 스위트에서 단일 테스트 방법을 실행하려는 경우입니다. 이 테스트를 "phil"그룹에 추가 한 다음이 그룹을 실행하기 만하면됩니다. JUnit 3을 사용할 때 "suite"메소드에서 실행하고 싶은 메소드를 제외한 모든 메소드에 대한 항목을 주석 처리했지만 일반적으로 체크인 전에 주석을 제거하는 것을 잊었습니다. 그룹에서는 더 이상이 문제가 없습니다.

2) 테스트의 복잡성에 따라 JUnit3에서 TestNG로 테스트를 마이그레이션하는 것은 sed를 사용하여 다소 자동으로 수행 될 수 있으며 모든 TestNG assert 메서드를 정적으로 가져 오는 TestCase를 대체하는 기본 클래스를 생성 할 수 있습니다.

여기여기에 JUnit에서 TestNG 로의 마이그레이션에 대한 정보가 있습니다 .


의도하지 않은 변경 사항을 체크인하는 문제는 실제로 체크인 한 내용을 검토해야하기 때문입니다. 그리고 큰 체크인을했다면 그것은 변명이 아닙니다. 그것은 또 다른 문제입니다. 작은 체크인을 많이해야한다는 것입니다.
hidralisk

5

JUnit 대신 TestNG를 사용하는 이유는 무엇입니까?

  1. @BeforeClass@AfterClass메소드 의 선언은 JUnit에서 정적이어야하는 반면, 메소드 선언에서 TestNG에는 더 많은 유연성이 있지만 이러한 제약 조건이 없습니다.

  2. TestNG에서는 두 가지 방법을 사용하여 테스트를 매개 변수화 할 수 있습니다 . @Parameter 또는 @DataProvider 주석.

    i) 키 값 매핑이 필요한 간단한 경우의 @Parameter (xml 파일을 통해 데이터 제공)

    ii) 복잡한 경우의 @DataProvider . 2 차원 배열을 사용하여 데이터를 제공 할 수 있습니다.

  3. TestNG에서는 @DataProvider 메서드가 정적 일 필요가 없기 때문에 동일한 테스트 클래스에서 여러 데이터 공급자 메서드를 사용할 수 있습니다.

  4. 종속성 테스트 : TestNG에서 초기 테스트가 실패하면 모든 후속 종속 테스트를 건너 뛰고 실패한 것으로 표시하지 않습니다. 그러나 JUnit은 실패로 표시했습니다.

  5. 그룹화 : 단일 테스트는 여러 그룹에 속한 다음 다른 컨텍스트 (예 : 느리거나 빠른 테스트)에서 실행될 수 있습니다. 유사한 기능이 JUnit 카테고리에 있지만 테스트를 초기화 / 해체 할 수있는 @BeforeGroups / @AfterGroups TestNG 주석이 없습니다.

  6. 병렬 : 여러 스레드에서 동시에 병렬 테스트를 실행하려는 경우, TestNG를 JUnit을이 상자 밖으로 그렇게 할 수있는 간단한 방법을 제공하지 않습니다 동안 사용 주석에 대한 간단한 덮여있다.

  7. TestNG @DataProvider는 데이터, CSV 또는 일반 텍스트 파일을 제공하기 위해 XML을 지원할 수도 있습니다.

  8. TestNG를 사용하면 테스트 간의 종속성을 선언하고 종속성 테스트가 통과하지 못한 경우이를 건너 뛸 수 있습니다.

@Test (dependsOnMethods = { "dependOnSomething"})

이 기능은 JUnit에 없습니다.

  1. 보고 :

TestNG 보고서는 기본적으로 모든 테스트 데이터, 통과 / 실패 / 건너 뛰기, 실행 시간, 사용 된 입력 및 전체 테스트 로그가 포함 된 HTML 보고서를 포함하는 테스트 출력 폴더에 생성됩니다. 또한 자체 보고서 템플릿을 구성하는 데 사용할 수있는 XML 파일로 모든 것을 내 보냅니다.

JUnit 전면에서이 모든 데이터는 XML을 통해서도 사용할 수 있지만 즉시 사용 가능한 보고서는 없으며 플러그인에 의존해야합니다.

리소스 링크 :

  1. 빠른 JUnit과 TestNG 비교
  2. JUnit 대 TestNG : 어떤 테스트 프레임 워크를 선택해야합니까?

이 튜토리얼에서는 좋은 차이점이 있습니다. TestNG Vs JUnit : 차이점은 무엇입니까?


TestNG의 가장 뚜렷한 기능인 IHMO (컨텍스트 인수를 Before 및 After 메서드로 전달하는 기능)를 나열하지 않았습니다. DataProvider는 예를 들어 이러한 방식으로 작동합니다.
djangofan

3

귀하의 질문은 나에게 두 가지 접힌 것 같습니다. 하나는 두 개의 테스트 프레임 워크를 비교하고 싶고, 다른 한편으로는 테스트를 쉽게 구현하고 싶고, 자연스러운 어설 션을 갖고 싶었다는 것입니다.

좋아, 첫째로 JUnit은 기능 측면에서 TestNG를 따라 잡았고 v4와의 격차를 해소했지만 내 의견으로는 충분하지 않습니다. 주석 및 데이터 제공자와 같은 것들은 TestNG에서 여전히 훨씬 더 좋습니다. 또한 TestNG에는 테스트 종속성, 그룹화 및 순서가 있기 때문에 테스트 실행 측면에서 더 유연합니다.

JUnit은 여전히 ​​특정 이전 / 이후 메소드가 정적이어야하므로 테스트 실행 전에 수행 할 수있는 작업이 제한됩니다. TestNG에는이 문제가 없습니다.

TBH, 통합 / 자동화 테스트에 초점을 맞추지 않는 한 두 프레임 워크의 차이점은 그다지 의미가 없습니다. 내 경험에서 얻은 JUnit은 처음부터 단위 테스트를 위해 구축되었으며 이제 더 높은 수준의 테스트로 밀려 나고 있습니다. IMO는 작업에 잘못된 도구가됩니다. TestNG는 단위 테스트에서 잘 작동하며 강력한 데이터 제공 및 뛰어난 테스트 실행 능력으로 인해 통합 / 자동화 테스트 수준에서 훨씬 더 잘 작동합니다.

이제 내가 생각하는 것은 잘 구조화되고 읽기 쉽고 유지 관리 가능한 테스트를 작성하는 방법에 대한 별도의 문제입니다. 이것의 대부분은 당신이 알고 있다고 확신하지만 Factory Pattern , Command PatternPageObjects (테스트 웹 사이트의 경우)가 중요하므로 테스트 (SUT)와 실제 테스트 사이에 추상화 계층을 갖는 것이 매우 중요합니다. (비즈니스 로직의 주장)입니다. 훨씬 더 좋은 단언을하기 위해 Hamcrest 를 사용할 수 있습니다 . 자바 상속 / 인터페이스를 사용하여 반복을 줄이고 공통성을 강화하십시오.

거의 잊고, Test Data Builder Pattern을 사용하십시오 . 이것은 TestNG의 dataprovider 주석과 결합되어 매우 유용합니다.


3

TestNG를 훨씬 더 강력하게 만드는 이유에 대한 제 의견 :

1.  JUnit still requires the before/after class methods to be static, which limits
    what you can do prior to the running of tests, TestNG never has this issue.

2.  TestNG @Configuration methods can all take an optional argument to their 
    annotated methods in the form of a ITestResult, XmlTest, Method, or 
    ITestContext.  This allows you to pass things around that JUnit wouldn't 
    provide you.  JUnit only does this in listeners and it is limited in use.

3.  TestNG comes with some pre-made report generation classes that you can copy
     and edit and make into your own beautiful test output with very little 
     effort. Just copy the report class into your project and add a listener 
     to run it.  Also, ReportNG is available.

4.  TestNG has a handful of nice listeners that you can hook onto so you can do
     additional AOP style magic at certain phases during testing.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.