문제

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

이전 테스트는 제대로 작동하므로 다시 작성되지 않습니다.하지만 새로운 테스트에서 제가 보고 싶은 것은 테스트 작성 방식의 유연성, 자연스러운 주장, 그룹화, 쉽게 분산된 테스트 실행입니다.

도움이 되었습니까?

해결책

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

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

높은 구성에 대한 모든 주장에도 불구하고 저는 몇 주 전에 제가 하고 싶은 일을 할 수 없는 코너 케이스에 부딪혔습니다...그것이 무엇인지 기억할 수 있으면 좋겠지만 그것이 완벽하지 않다는 것을 여러분이 알 수 있도록 언급하고 싶었습니다.

TestNG의 가장 큰 장점은 주석입니다.어쨌든 JUnit은 버전 4에 추가했습니다.

다른 팁

먼저, 최신 유행에 맞춰 모든 테스트를 다시 작성하지 마세요.Junit3은 완벽하게 잘 작동하며, 4에 주석을 도입한다고 해서 그다지 마음에 들지는 않습니다(제 생각에는).훨씬 더 중요해요 여러분 쓰다 테스트를 해보면 그렇게 들리는 것 같습니다.

가장 자연스럽고 작업을 완료하는 데 도움이 되는 것을 사용하세요.

나는 그것을 사용하지 않았기 때문에 TestNG에 대해 언급할 수 없습니다.하지만 나는 추천하고 싶다 단위, 어떤 경로를 선택하든 JUnit/TestNG/DBUnit/EasyMock을 위한 훌륭한 래퍼입니다.(위에서 언급한 모든 맛을 지원합니다)

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

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

TestNG의 가장 큰 매력은 지원 테스트 그룹과 더 중요한 것은 테스트 그룹 종속성입니다(테스트를 그룹에 종속된 것으로 표시하면 종속 그룹이 실패할 때 테스트 실행을 건너뛰게 됩니다).

나에게 있어 TestNG의 또 다른 큰 매력은 테스트 매개변수, 데이터 제공자, 주석 변환기, 그리고 무엇보다도 활기차고 반응이 빠른 사용자 커뮤니티입니다.

표면적으로는 위의 TestNG 기능이 모두 필요하지 않을 수 있다고 생각하지 않을 수도 있지만, 일단 테스트에 제공되는 유연성을 이해하기 시작하면 JUnit에 어떻게 대처했는지 궁금할 것입니다.

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

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

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

  2. 병렬 및 매개변수화된 테스트, 아마도 인생이 충분하지 않은 것 같습니다...하지만 저는 드라이버 이름을 매개변수로 받아 Selenium 테스트 세트를 작성하는 데 흥미를 느꼈습니다.그런 다음 IE, FF 및 Chrome 드라이버에 대해 각각 하나씩 3개의 병렬 테스트 그룹을 정의하고 경주를 관찰합니다!원래는 4개를 했는데 작업한 페이지 중 너무 많은 페이지가 깨졌습니다. HtmlUnit 어떤 이유로든 운전자.

응, 아마 그 삶을 찾아야 할 것 같아.;)

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

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

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

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

당신은 쓸 수 있습니다

assertThat(operation, isActive());

이는 테스트에서 더 높은 수준의 추상화를 사용할 수 있는 기회를 제공합니다.그리고 이는 테스트를 더욱 강력하게 만듭니다.

Mike Stone의 답변에 몇 가지 추가 사항이 있습니다.

1) 제가 TestNG 그룹을 가장 자주 사용하는 이유는 테스트 스위트에서 단일 테스트 메소드를 실행하려고 할 때입니다.나는 단순히 이 테스트를 "phil" 그룹에 추가한 다음 이 그룹을 실행합니다.JUnit 3을 사용할 때 "suite" 메서드에서 실행하려는 항목을 제외한 모든 메서드에 대한 항목을 주석 처리했지만 체크인하기 전에 해당 항목의 주석 처리를 제거하는 것을 일반적으로 잊어버렸습니다.그룹을 사용하면 더 이상 이 문제가 발생하지 않습니다.

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

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

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 :-)

좀 더 자세한 비교를 보실 수 있습니다 여기.

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

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

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

JUnit에서는 특정 이전/이후 메소드가 정적이어야 하므로 테스트 실행 전에 수행할 수 있는 작업이 제한되므로 TestNG에는 이 문제가 발생하지 않습니다.

TBH, 통합/자동화 테스트에 중점을 두지 않는 한 두 프레임워크 간의 차이점은 대부분 큰 의미가 없습니다.내 경험에 비추어 볼 때 JUnit은 처음부터 단위 테스트를 위해 구축되었으며 현재는 더 높은 수준의 테스트를 향해 추진되고 있으므로 IMO에서는 JUnit을 해당 작업에 잘못된 도구로 만듭니다.TestNG는 단위 테스트에 효과적이며 강력한 데이터 제공 및 뛰어난 테스트 실행 능력으로 인해 통합/자동화 테스트 수준에서 더욱 잘 작동합니다.

이제 제가 생각하는 것은 잘 구조화되고 읽기 쉽고 유지 관리가 가능한 테스트를 작성하는 방법에 대한 별도의 문제입니다.이것의 대부분은 당신이 알고 있다고 확신합니다. 그러나 다음과 같은 것들은 팩토리 패턴, 명령 패턴 그리고 PageObject (테스트 웹 사이트가 중요한 경우) 테스트(SUT)와 실제 테스트(비즈니스 논리 어설션) 사이에 추상화 계층을 갖는 것이 매우 중요합니다.훨씬 더 좋은 주장을 가지기 위해 다음을 사용할 수 있습니다. 햄크레스트.반복을 줄이고 공통성을 강화하려면 Java 상속/인터페이스를 활용하세요.

거의 잊어버렸는데도 사용하세요 테스트 데이터 빌더 패턴, 이는 TestNG의 dataprovider 주석과 결합되어 매우 유용합니다.

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 주석.

    나) @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(dependentOnMethods = { "dependentOnSomething" })

이 기능은 JUnit에 존재하지 않습니다.

  1. 보고:

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

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

리소스 링크:

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

이 튜토리얼에는 좋은 차이점이 나란히 나와 있습니다. TestNG 대 JUnit:차이점이 뭐야?

둘 다 거의 똑같습니다.TestNG에는 테스트 슈트 및 종속성과 같은 몇 가지 추가 기능이 있습니다.전체 비교를 보려면 첨부된 스크린샷을 찾으세요. 전체 Juni5와 TestNG 비교

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top