[Java] JUnit과 TestNG


Answers

두 가지 모두 사용했지만 저스틴 스탠다드에 동의해야만 기존 테스트를 새로운 형식으로 다시 작성하는 것을 고려하면 안됩니다. 결정에 관계없이, 둘 다 실행하는 것은 꽤 사소한 일입니다. TestNG는 JUnit보다 훨씬 더 구성 가능하도록 노력하지만 결국에는 둘 다 똑같이 잘 작동합니다.

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

높은 구성을 요구하는 모든 주장에 대해, 나는 몇 주 전에 내가하고 싶은 일을 할 수없는 코너 케이스에 들어갔다. 나는 그것이 무엇인지 기억하고 싶지만 그것을 가지고 싶었다. 그래서 완벽하지는 않습니다.

TestNG가 가지고있는 가장 큰 장점은 어쨌든 JUnit이 버전 4에 추가 한 주석입니다.

Question

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

오래된 검사는 그들이 일을 제대로 마쳤으므로 다시 쓰지 않습니다. 새로운 테스트에서 볼 수있는 것은 테스트를 작성하고 자연스런 단정, 그룹화 및 테스트 실행을 쉽게 분산 할 수있는 방법의 유연성입니다.




TestNG의 가장 큰 드로어 카드는 지원 테스트 그룹과 더 중요한 것은 테스트 그룹 의존성입니다 (그룹에 의존적 인 것으로 테스트를 표시하면 종속 그룹 실패시 테스트가 단순히 건너 뛰게됩니다).

TestNG의 다른 큰 드로 카드에는 테스트 매개 변수, 데이터 공급자, 주석 변압기 등 활발하고 반응이 빠른 사용자 커뮤니티가 포함됩니다.

표면적으로 위의 TestNGs 기능이 모두 필요하지 않을 수도 있지만, 일단 유연성을 테스트 해보면 JUnit에 어떻게 대처할 수 있었는지 궁금 할 것입니다.

면책 조항 - 나는 JUnit 4.x를 전혀 사용하지 않았으므로 진보 또는 새로운 기능에 대해서는 언급 할 수 없다.




먼저 최신 유행에 맞게 모든 테스트를 다시 작성하지 말라. Junit3은 완벽하게 작동하며 4에서 주석을 도입해도 사용자를별로 사지는 못합니다 (제 의견으로는). 여러분이 테스트를 작성 하는 것이 훨씬 더 중요합니다.

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

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




마이크 스톤 (Mike Stone)의 대답에 대한 몇 가지 추가 사항 :

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

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

JUnit에서 TestNG로 마이그레이션하는 방법에 대한 정보는 herehere .




약 1 년 전, 우리도 똑같은 문제가있었습니다. 언젠가 어떤 움직임이 더 좋았는지를 생각하면서 언젠가는 TestNG에 '킬러 기능'이 없다는 사실을 깨달았습니다. JUnit 4에는없는 기능이 있지만 필요하지 않습니다.
우리는 사람들이 테스트를 많이 쓰고 싶었 기 때문에 TestNG를 알게되는 동안 불편한 필기 테스트를 느끼기를 원하지 않았습니다.
또한 JUnit은 Java 세계에서 사실상 표준입니다. 상자에서 지원하지 않는 괜찮은 도구는 없으며 웹에서 많은 도움을 얻을 수 있으며 지난 해에 많은 기능을 추가하여 생생함을 보여줍니다.

우리는 JUnit을 계속 사용하기로 결심했습니다.




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




위의 모든 것에 건배. 개인적으로 내가 TestNG에서 더 좋아하는 것을 찾았습니다.

  1. TestNG의 @BeforeClass 는 클래스 생성 후에 발생하므로 클래스의 정적 메서드 만 호출 할 수 있으므로 제약을받지 않습니다.

  2. 평행 및 매개 변수화 된 테스트, 어쩌면 나는 삶이 충분하지 않을 수도 있지만, 단지 한 세트의 셀렌 테스트를 작성하고 드라이버 이름을 매개 변수로 받아들이는 킥을 얻습니다. 그런 다음 IE, FF 및 Chrome 드라이버에 대해 각각 1 개의 병렬 테스트 그룹을 정의하고 경주를 확인하십시오! 나는 원래 4 번을했지만, 너무 많은 페이지 중 하나가 HtmlUnit 드라이버를 깨뜨린 이유가 있습니다.

그래, 아마 그 삶을 찾아야 해. ;)




귀하의 질문은 두 가지로 나에게 접혀있는 것 같습니다. 하나는 두 개의 테스트 프레임 워크를 비교하고 싶지만, 다른 한편으로는 테스트를 쉽게 구현하고 자연스런 주장을하고 싶습니다.

Ok, first JUnit은 기능 측면에서 TestNG를 따라 잡았으며, v4와 어떤 차이점을 메워 왔지만, 제 생각에는 충분하지 않았습니다. 주석 및 데이터 제공자와 같은 것들은 TestNG에서 여전히 훨씬 뛰어납니다. 또한 TestNG는 테스트 종속성, 그룹화 및 순서가 있으므로 테스트 실행면에서보다 유연합니다.

JUnit은 정적 인 before / after 특정 메서드가 필요합니다.이 메서드는 테스트를 실행하기 전에 수행 할 수있는 작업을 제한합니다. TestNG에는이 문제가 없습니다.

TBH는 통합 / 자동화 테스팅에 집중하지 않는 한 대부분 두 프레임 워크의 차이점이 많지는 않습니다. 제 경험에서 얻은 JUnit은 처음부터 단위 테스트를 위해 만들어졌으며 현재 IMO는 더 높은 수준의 테스트를 위해 노력하고 있습니다. TestNG는 단위 테스트에 적합하며 견고한 데이터 패키징 및 뛰어난 테스트 실행 능력으로 인해 통합 / 자동화 테스트 수준에서 훨씬 뛰어납니다.

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

거의 잊어 버렸고, 또한 Test Data 빌더 패턴을 사용하십시오. 이것은 TestNG의 dataprovider 주석과 결합되어 매우 유용합니다.




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

나는 또한 두 프레임 워크를 모두 사용했다. 하지만 나는 주장에 hamcrest를 사용합니다. Hamcrest는 자신 만의 assert 메서드를 쉽게 작성할 수 있습니다. 그래서 대신

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

당신은 쓸 수 있습니다

assertThat(operation, isActive());

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




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

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

TestNG는 기능적으로 높은 수준의 테스트와 복잡한 통합 테스트를위한 것입니다. 유연성은 대규모 테스트 스위트에서 특히 유용합니다.

또한 TestNG는 핵심 JUnit4 기능 전체를 포괄합니다 . 더 이상 JUnit을 사용하지 않아도됩니다.

In simple terms, TestNG = JUnit + lot more...So, Why debate ? go and grab TestNG :-)

here 더 자세한 비교를 볼 수 here .




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.



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

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

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

    i) 키 값 매핑이 필요한 간단한 경우의 @ 매개 변수 (데이터는 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 대 JUnit : 차이점은 무엇입니까?




저는 Guice와 TestNG의 깔끔하고 쉬운 통합을 좋아합니다.