source

왜 JUnit을 테스트에 사용하는가?

manycodes 2022. 10. 27. 23:04
반응형

왜 JUnit을 테스트에 사용하는가?

초보자 질문인지 을 사용하는 상황을 잘 모르겠습니다.

간단한 어플리케이션 작성이든 큰 어플리케이션 작성이든System.out진술서, 그리고 그것은 나에게 꽤 쉽게 바느질된다.

JUnit을 사용하여 테스트 클래스를 만들고 동일한 메서드를 호출해야 하며 반환되는 항목을 확인하고 모든 항목에 주석을 달아야 하는 오버헤드를 감수해야 하는 이유는 무엇입니까?

왜 수업을 써서 한번에 테스트하지 않는가?System.out테스트 클래스는 작성하지 않으시겠습니까?

추신. 저는 막 배우고 있는 큰 프로젝트를 해 본 적이 없습니다.

그럼 목적이 뭐죠?

이는 테스트가 아니라 "수동으로 출력 보기"입니다(비즈에서는 LMAO로 알려져 있습니다).더 공식적으로 "수동으로 비정상적인 출력을 찾습니다"(LMFAO)라고 합니다.(See note below)

코드를 변경할 때마다 이러한 변경의 영향을 받는 모든 코드에 대해 앱 및 LMFAO를 실행해야 합니다.소규모 프로젝트에서도 이는 문제가 되고 오류가 발생하기 쉽습니다.

이제 코드를 변경할 때마다 50k, 250k, 1m LOC 이상, LMFAO까지 확장할 수 있습니다.불쾌할 뿐만 아니라 불가능하기도 합니다.입력, 출력, 플래그, 조건의 조합이 확대되어 모든 가능한 분기를 실행하는 것은 어렵습니다.

LMFAO란 웹 어플리케이션 페이지 방문, 보고서 실행, 수십 개의 파일 및 머신에 걸친 수백만 개의 로그 행 검토, 생성 및 전달된 이메일 읽기, 문자 메시지 확인, 로봇 경로 확인, 탄산음료 병 채우기, 100개의 웹 서비스로부터의 데이터 수집, fina 감사 내역 확인을 의미합니다.nial 트랜잭션...감이 잡히실 겁니다"출력"은 몇 줄의 텍스트를 의미하는 것이 아니라 "출력"은 집계된 시스템 동작을 의미합니다.

마지막으로 유닛 및 동작 테스트는 시스템 동작을 정의합니다.테스트는 연속적인 통합 서버에서 실행하여 정확성을 확인할 수 있습니다.네, 할 수 있어요System.out하지만 CI 서버는 이들 중 하나가 잘못되었는지 여부를 인식하지 못합니다. 잘못되었을 경우 유닛 테스트이므로 프레임워크를 사용하는 것이 좋습니다.

아무리 우수하다고 생각하더라도 인간은 유닛 테스트 프레임워크나 CI 서버가 아닙니다.


주의: LMAO는 테스트 중이지만 매우 제한적입니다.프로젝트 전체 또는 프로세스의 일부로 의미 있는 방식으로 반복할 수 없습니다.이는 리플리케이션에서 점진적으로 발전하는 것과 비슷하지만, 이러한 증분 테스트를 공식화하지는 않습니다.

프로그램 동작의 정확성을 검증하기 위해 테스트를 작성합니다.

출력문의 내용을 으로 검사하여 프로그램 동작의 정확성을 확인하는 것은 수동, 구체적으로는 시각적 프로세스입니다.

라고 주장할 수 있다.

육안 검사는 기능합니다.이러한 시나리오에서는 코드가 본래의 기능을 하고 있는 것을 확인합니다.정확한 것을 알 수 있으면 바로 사용할 수 있습니다.

우선, 코드가 올바르게 동작하고 있는지 어떤지에 관심이 있는 것은 매우 좋은 일입니다.그거 좋은 일이네요.넌 앞서가고 있어!안타깝게도, 접근법으로는 문제가 있습니다.

육안 검사의 첫 번째 문제는 코드 정확성을 다시 확인할 수 없는 불량 용접 사고라는 것입니다.

두 번째 문제는 사용된 한 쌍의 눈이 주인의 뇌와 밀접하게 연결되어 있다는 것이다.코드 작성자가 육안 검사 과정에 사용되는 눈도 소유하고 있는 경우, 정확성을 확인하는 과정은 육안 검사자의 뇌에 내재된 프로그램에 대한 지식에 의존합니다.

새로운 한 쌍의 눈이 들어와서 원래의 코더의 두뇌와 제휴하지 않았다는 이유만으로 코드의 정확성을 확인하는 것은 어렵다.두 번째 눈의 소유자는 문제의 코드를 완전히 이해하기 위해 코드의 원저작자와 대화해야 합니다.지식을 공유하는 수단으로서의 대화는 믿을 수 없는 것으로 악명 높다.원본 코더를 새 쌍으로 사용할 수 없는 경우 사용할 수 없는 지점입니다.이 경우 새 눈은 원래 코드를 읽어야 합니다.

유닛 테스트의 대상이 되지 않는 다른 사람의 코드를 읽는 것은 유닛 테스트와 관련된 코드를 읽는 것보다 어렵습니다.기껏해야 다른 사람들의 코드를 읽는 것은 까다로운 작업이고, 최악의 경우 이것은 소프트웨어 엔지니어링에서 가장 어려운 작업입니다.고용주가 구인광고를 낼 때 프로젝트가 미개척(또는 완전히 새로운) 프로젝트라고 강조하는 데는 이유가 있습니다.코드를 처음부터 작성하는 것이 기존 코드를 수정하는 것보다 쉬우므로 광고된 작업이 잠재적인 직원에게 더 매력적으로 보일 수 있습니다.

유닛 테스트에서는 코드를 컴포넌트 부품으로 나눕니다.그런 다음 각 컴포넌트에 대해 프로그램의 동작을 나타내는 스톨을 개시합니다.각 유닛 테스트는 특정 시나리오에서 프로그램의 해당 부분이 어떻게 동작해야 하는지에 대한 내용을 보여줍니다.각 단위 테스트는 클라이언트 코드의 관점에서 어떤 일이 일어나야 하는지를 기술하는 계약의 조항과 같습니다.

이는 새로운 한 쌍의 눈이 문제의 코드에 대해 두 가닥의 생생하고 정확한 문서를 가지고 있음을 의미합니다.

첫 번째는 코드 자체, 구현 방식, 번째는 원래 코더가 이 코드가 어떻게 동작해야 하는지를 설명하는 일련의 공식 스테이트먼트에서 설명한 모든 지식을 가지고 있습니다.

유닛 테스트는 원래 작성자가 클래스를 구현할 때 가지고 있던 지식을 캡처하여 정식으로 기술합니다.클라이언트에 의해 사용되는 클래스의 동작에 대한 설명을 제공합니다.

유닛 테스트의 유용성에 의문을 제기하는 것은 당연합니다.그것은, 쓸모없는 유닛 테스트를 기술하는 것, 문제의 모든 코드를 커버하는 것은 아니고, 오래된 것이거나, 오래된 것이 되는 것 등입니다.지식 있고 양심적인 작성자가 실행 시 코드의 출력문을 육안으로 검사하는 프로세스를 유닛 테스트가 모방할 뿐만 아니라 개선되도록 하려면 어떻게 해야 합니까?먼저 단위 테스트를 작성한 후 해당 테스트를 통과하기 위한 코드를 작성합니다.작업을 마치면 컴퓨터가 테스트를 실행하도록 합니다.컴퓨터는 고속으로 반복 작업을 수행할 수 있어 업무에 매우 적합합니다.

코드를 터치할 때마다 테스트 품질을 확인하고 각 빌드에 대해 테스트를 실행합니다.테스트가 실패하면 즉시 수정하십시오.

테스트 실행 프로세스를 자동화하여 프로젝트를 빌드할 때마다 테스트가 실행됩니다.또, 테스트에 의해서 커버되고 행사되는 코드의 비율을 상술한 코드 커버리지 리포트의 생성을 자동화합니다.우리는 높은 비율을 위해 노력한다.일부 기업에서는 코드의 동작 변화를 기술할 수 있는 충분한 유닛테스트가 작성되지 않은 경우 코드 변경이 소스 코드 제어에 체크인되지 않도록 합니다.일반적으로 두 번째 눈은 변경 사항의 작성자와 함께 코드 변경을 검토합니다.심사자는 변경 내용을 이해할 수 있고 테스트에 충분히 포함되었는지 확인합니다.따라서 검토 프로세스는 수동이지만 테스트(유닛 및 통합 테스트, 사용자 수용 테스트)가 이 수동 검토 프로세스를 통과하면는 자동 빌드 프로세스의 일부가 됩니다.변경사항이 체크인될 때마다 실행됩니다. 통합 서버는 빌드 프로세스의 일부로 이 작업을 수행합니다.

자동으로 실행되는 테스트는 코드 동작의 무결성을 유지하며 향후 코드 베이스의 변경으로 코드가 파손되는 것을 방지합니다.

마지막으로, 테스트를 제공하면 기존 테스트를 중단하지 않는 빅 코드를 안전하게 개선할 수 있기 때문에 적극적으로 코드를 재팩터화할 수 있습니다.

테스트 중심 개발에는 주의 사항이 있습니다. 테스트 가능하려면 코드를 작성해야 합니다.여기에는 인터페이스에 대한 코딩과 의존성 주입 등의 기술을 사용하여 협업 개체를 인스턴스화하는 작업이 포함됩니다.TDD를 잘 설명하는 Kent Beck의 작품을 확인해 보세요.인터페이스에 대한 코딩 검색 및 설계 연구

시스템 같은 것을 사용하여 테스트하는 경우.즉, 가능한 사용 사례의 일부만 테스트하는 것입니다.이것은, 거의 무한대에 가까운 다양한 입력을 수신할 수 있는 시스템을 취급하고 있는 경우는, 그다지 철저하지 않습니다.

유닛 테스트는 매우 크고 다양한 데이터 입력 세트를 사용하여 응용 프로그램에서 신속하게 테스트를 실행할 수 있도록 설계되었습니다.또한 최적의 단위 테스트는 유효하다고 간주되는 가장자리에 있는 데이터 입력과 같은 경계 사례도 고려합니다.

인간이 이러한 모든 다른 입력을 테스트하는 데는 몇 주가 걸릴 수 있지만 기계에는 몇 분이 걸릴 수 있습니다.

이렇게 생각해 보세요.또, 정적인 것을 「테스트」하고 있는 것도 아닙니다.어플리케이션이 계속 변경되고 있을 가능성이 높습니다.따라서 이러한 유닛테스트는 컴파일 또는 전개 사이클의 다른 시점에서 실행되도록 설계되어 있습니다.가장 큰 장점은 다음과 같습니다.

코드에 오류가 있는 경우 배포 후가 아니라 QA 테스터가 버그를 발견했을 때나 클라이언트가 취소했을 때 알 수 없습니다.또, 문제의 코드의 일부를 망가뜨린 것은, 전회의 컴파일 후에 일어났을 가능성이 높기 때문에, 곧바로 문제를 해결할 가능성이 높아집니다.따라서 문제를 해결하기 위해 필요한 조사 작업의 양이 크게 줄어듭니다.

I added some other System.out can NOT do:

  • Make each test cases independent (It's important)

    JUnit can do it: each time new test case instance will be created and @Before is called.

  • Separate testing code from source

    JUnit can do it.

  • Integration with CI

    JUnit can do it with Ant and Maven.

  • Arrange and combine test cases easily

    JUnit can do @Ignore and test suite.

  • Easy to check result

    JUnit offers many Assert methods (assertEquals, assertSame...)

  • Mock and stub make you focus on the test module.

    JUnit can do: Using mock and stub make you setup correct fixture, and focus on the test module logic.

Unit tests ensure that code works as intended. They are also very helpful to ensure that the code still works as intended in case you have to change it later to build new functionalities to fix a bug. Having a high test coverage of your code allows you to continue developing features without having to perform lots of manual tests.

Your manual approach by System.out is good but not the best one.This is one time testing that you perform. In real world, requirements keep on changing and most of the time you make a lot of modificaiotns to existing functions and classes. So… not every time you test the already written piece of code.

there are also some more advanced features are in JUnit like like

Assert statements

JUnit provides methods to test for certain conditions, these methods typically start with asserts and allow you to specify the error message, the expected and the actual result

Some of these methods are

  1. fail([message]) - Lets the test fail. Might be used to check that a certain part of the code is not reached. Or to have failing test before the test code is implemented.
  2. assertTrue(true) / assertTrue(false) - Will always be true / false. Can be used to predefine a test result, if the test is not yet implemented.
  3. assertTrue([message,] condition) - Checks that the boolean condition is true.
  4. assertEquals([message,] expected, actual) - Tests whether two values are equal (according to the equals method if implemented, otherwise using == reference comparison). Note: For arrays, it is the reference that is checked, and not the contents, use assertArrayEquals([message,] expected, actual) for that.
  5. assertEquals([message,] expected, actual, delta) - Tests whether two float or double values are in a certain distance from each other, controlled by the delta가치.
  6. assertNull([message,] object)- 객체가 null인지 확인합니다.

기타 등등.모든 예는 여기를 참조하십시오.

스위트

테스트 스위트를 사용하면 여러 테스트 클래스를 하나의 단위로 결합하여 한 번에 실행할 수 있습니다.간단한 예제, 테스트 클래스 결합MyClassTest그리고.MySecondClassTest라고 하는1개의 Suite로AllTests:

import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)
@SuiteClasses({ MyClassTest.class, MySecondClassTest.class })
public class AllTests { } 

JUnit의 주요 장점은 인쇄물을 수동으로 확인할 필요 없이 자동화된다는 것입니다.작성한 각 테스트는 시스템에 남습니다.즉, 예기치 않은 부작용이 있는 변경을 할 경우 매번 변경 후 모든 것을 수동으로 테스트해야 하는 것이 아니라 테스트를 통과하지 못하고 불합격하게 됩니다.

JUnit은 Java Programming Language의 유닛 테스트 프레임워크입니다.테스트 주도형 개발에서 중요하며, 집합적으로 xUnit으로 알려진 유닛 테스트 프레임워크 패밀리 중 하나입니다.

JUnit은 "첫 번째 테스트 후 코딩"이라는 아이디어를 홍보합니다.이 아이디어에서는 먼저 테스트한 후 구현할 수 있는 코드 조각에 대한 테스트 데이터를 설정하는 데 중점을 두고 있습니다.이 접근방식은 "테스트 조금, 코드 조금, 테스트 조금, 코드 조금"과 같습니다.프로그래머의 생산성과 프로그램 코드의 안정성을 높여 프로그래머의 스트레스 및 디버깅 시간을 줄입니다.

기능 JUnit은 쓰기 및 테스트 실행에 사용되는 오픈 소스 프레임워크입니다.

테스트 방법을 식별하기 위한 주석을 제공합니다.

예상 결과를 테스트하기 위한 어설션을 제공합니다.

테스트 실행 시 테스트 주자를 제공합니다.

JUnit 테스트를 통해 코드를 보다 빠르게 쓸 수 있으며 품질 향상

JUnit은 우아하게 심플합니다.복잡함도 적고 시간도 적게 소요됩니다.

JUnit 테스트는 자동으로 실행되며 자체 결과를 확인하고 즉각적인 피드백을 제공합니다.테스트 결과 보고서를 수동으로 훑어볼 필요가 없습니다.

JUnit 테스트는 테스트 케이스 및 기타 테스트 스위트를 포함하는 테스트 스위트로 구성할 수 있습니다.

Junit은 테스트 진행 상황을 녹색 막대로 표시하고 테스트가 실패하면 빨간색으로 바꿉니다.

나는 JUnit가 왜 필요한지 약간 다른 관점을 가지고 있다.

모든 테스트 케이스를 직접 작성할 수 있지만 번거롭습니다.문제는 다음과 같습니다.

  1. 대신System.out추가할 수 있다if(value1.equals(value2))0 또는 -1 또는 오류 메시지를 반환합니다.이 경우, 이러한 모든 방법을 실행하고 결과를 확인하고 실패한 테스트 사례와 통과한 테스트 사례를 유지하는 "메인" 테스트 클래스가 필요합니다.

  2. 몇 가지 테스트를 더 추가하려면 이 "기본" 테스트 클래스에도 추가해야 합니다.기존 코드로 변경합니다.테스트 클래스에서 테스트 사례를 자동으로 탐지하려면 반사를 사용해야 합니다.

  3. 테스트를 실행하기 위한 모든 테스트 및 기본 클래스는 일식에 의해 탐지되지 않으므로 이러한 테스트를 실행하려면 사용자 정의 디버깅/실행 구성을 작성해야 합니다.녹색/빨간색으로 표시된 출력은 아직 보이지 않습니다.

다음은 JUnit의 동작입니다.

  1. 정말 그랬어요.assertXXX()유용한 오류 메시지를 출력하고 결과를 "메인" 클래스에 전달하는 데 유용한 방법입니다.

  2. "main" 클래스는 JUnit에서 제공하는 Runner라고 하기 때문에 우리는 아무것도 쓰지 않아도 됩니다.그리고 반사에 의해 자동으로 테스트 방법을 검출합니다.를 사용하여 새 테스트를 추가하는 경우@Test그러면 주석이 자동으로 감지됩니다.

  3. JUnit은 통합과 메이븐/그레이드 통합도 갖추고 있기 때문에 테스트를 쉽게 실행할 수 있으며 커스텀 실행 구성을 작성할 필요가 없습니다.

저는 JUnit의 전문가가 아니기 때문에, 현시점에서는 그렇게 알고 있습니다.

테스트 프레임워크를 사용하지 않고 테스트 케이스를 작성할 수 없습니다.그렇지 않으면 테스트 케이스를 정의하기 위해 테스트 프레임웍을 작성해야 합니다.다음으로 TestNG Framework를 사용할 수 있는 것 외에 JUnit Framework에 대한 정보를 나타냅니다.

주니트가 뭐죠?

Junit은 Java Programming Language와 함께 테스트 프레임워크로 널리 사용됩니다.이 자동화 프레임워크는 장치 테스트와 UI 테스트 모두에 사용할 수 있습니다.다른 주석을 사용하여 코드의 실행 흐름을 정의하는 데 도움이 됩니다.Junit은 테스트 케이스의 생산성과 코드의 안정성을 높이는 데 도움이 되는 "처음 테스트 후 코딩"이라는 아이디어를 바탕으로 구축되었습니다.

Junit 테스트의 중요한 기능 -

  1. It is open source testing framework allowing users to write and run test cases effectively.
  2. Provides various types of annotations to identify test methods.
  3. Provides different Types of Assertions to verify the results of test case execution.
  4. It also gives test runners for running tests effectively.
  5. It is very simple and hence saves time.
  6. It provides ways to organize your test cases in form of test suits.
  7. It gives test case results in simple and elegant way.
  8. You can integrate jUnit with Eclipse, Android Studio, Maven & Ant, Gradle and Jenkins

JUNIT is the method that is usually accepted by java developer. Where they can provide similar expected input to the function and decide accordingly that written code is perfectly written or if test case fails then different approach may also need to implement. JUNIT will make development fast and will ensure the 0 defects in the function.

JUNIT : OBSERVE AND ADJUST

Here is my perspective of JUNIT.

JUNIT can be used to,
1)Observe a system behaviour when a new unit is added in that system.
2)Make adjustment in the system to welcome the "new" unit in the system.
What? Exactly.

Real life eg.

When your relative visits your college hostel room,
1) You will pretend to be more responsible.
2) You will keep all things where they should be, like shoes in shoe rack not on chair, clothes in cupboard not on chair.
3) You will get rid of all the contraband.
4) you will start cleanUp in every device you posses.

In programming terms

System: Your code
UNIT: new functionality.
As JUNIT framework is used for JAVA language so JUNIT = JAVA UNIT (May be).

Suppose a you already have a well bulletproof code, but a new requirement came and you have to add the new requirement in your code. This new requirement may break your code for some input(testcase).

Easy way to adapt this change is using unit testing (JUNIT).
For that you should write multiple testcases for your code when you are building your codebase. And whenever a new requirement comes you just run all the test cases to see if any test case fails. If No then you are a BadA** artist and you are ready to deploy the new code.
If any of the testcases fail then you change your code and again run testcases until you get the green status.

ReferenceURL : https://stackoverflow.com/questions/10858990/why-use-junit-for-testing

반응형