복잡한 정규식에 대한 단위 테스트가 있어야합니까?


34

응용 프로그램에서 복잡한 정규식에 대한 단위 테스트를 작성해야합니까?

  • 한편으로는 입력 및 출력 형식이 종종 간단하고 잘 정의되어 있기 때문에 테스트하기가 쉽고, 종종 너무 복잡 해져서 테스트가 특히 중요합니다.
  • 다른 한편으로 : 그들 자체는 일부 단위의 인터페이스의 일부가 아니다. 인터페이스 만 테스트하고 정규식을 암시 적으로 테스트하는 방식으로 인터페이스를 테스트하는 것이 좋습니다.

편집하다:

나는 그의 의견 에 이것이 내부 구성 요소단위 테스트의 특별한 경우라고 언급 한 Doc Brown에 동의한다 .

그러나 내부 구성 요소 정규 표현식에는 몇 가지 특별한 특성이 있습니다.

  1. 단일 라인 정규식은 실제로 별도의 모듈없이 복잡 할 수 있습니다.
  2. 정규 표현식은 부작용없이 입력에 대한 출력을 매핑하므로 실제로 테스트하기가 쉽습니다.

12
"그들 자체는 일부 유닛의 인터페이스의 일부가 아니다" -수업에 인터페이스 아래에 흥미로운 코드가 묻혀 있으면 수업을 해체하십시오. 이것은 tess에 대한 생각이 어떻게 디자인을 향상시킬 수 있는지에 대한 예입니다.
Nathan Cooper

3
보다 일반적인 방식으로 같은 질문 : 어떤 내부 구성 요소를 단위 테스트해야합니까? programmers.stackexchange.com/questions/16732/…
Doc Brown

정렬과 관련하여 Regex101을 참조하십시오. 정규식에 대한 단위 테스트를 작성하는 섹션이 있습니다. 예 : regex101.com/r/tR3mJ2/2
복원 Monica Monica

3
면책 조항-이 의견은 겸손한 의견입니다 : 1 복잡한 정규 표현식 이 순수한 악이라고 생각합니다-또한 blog.codinghorror.com/ 을 참조하십시오. 대형 표현식의 실제 데이터베이스를 통해 테스트 할 때 이러한 표현식을 테스트하는 2 가지 진정한 가치 data blog.codinghorror.com/testing-with-the-force 3 이 테스트들이 단위 테스트 가 아니라는 이상한 느낌이
듭니다

답변:


101

도그 테스트를 제외하고 실제 질문은 복잡한 정규 표현식을 단위 테스트에 가치를 제공하는지 여부입니다. 정규식이 충분히 복잡하면 버그를 찾아서 재생산하고 회귀를 막을 수 있기 때문에 정규식이 공용 인터페이스의 일부인지 여부에 관계없이 값을 제공한다는 것이 분명합니다.


25
+1, 정규 표현식이이 문제가 있음을 복잡 충분한 경우, 다음 아마 (적절한 방법과 "래퍼"단위로 이동하는 것이 합리적이지만 isValid, parse, tryParse가 사용되고 방법을 정확하게 따라, 또는 기타 등등) 때문에, 클라이언트 코드는 현재 정규식을 사용하여 구현되었음을 알 필요가 없습니다. 래퍼 유닛은 상세한 테스트를 수행 할 것이며, 다시 현재 구현을 알 필요가 없습니다. 물론 이러한 테스트는 실제로 정규 표현식을 테스트하지만 구현과 무관하게 수행됩니다.
ruakh

1
정규식은 전문적이고 매우 간결한 언어이지만 프로그램입니다. 따라서 테스트는 사소한 표현식에 적합합니다. 그리고 확실히 표현식을 호출하는 코드를 테스트해야합니다.
keshlam

6
@ruakh 잘 말했다. 정규식에 대한 래퍼 클래스의 이점은 필요한 경우 일반 코드로 깔끔하게 바꿀 수 있다는 것입니다. 복잡한 입력 / 출력을 가진 코드는 항상 단위 테스트를 수행해야합니다. 코드의 효과를 이해하기 위해 문서를 참조해야하는 경우 단위 테스트가 필요합니다. 타입 변환과 같은 빠른 1 : 1 매핑이라면 아무런 문제가 없습니다. 정규 표현식은 문서를 매우 빠르게 요구하는 시점을지나갑니다.
Aaron3468

4
@Lii : 정규식은 특별한 대우를받을 자격이 없습니다. 이 경우 정규식이 단위이므로 단위 테스트를 수행합니다.
JacquesB

1
@ruakh 나는 그 효과에 대한 답을 쓰려고했습니다. 정규식을 사용하는 것이 구현 세부 사항이라는 데 동의합니다. 중요한 것은 상황이 예상되는 시점에 유효성을 검사하고 예상 시점에 유효성을 검증하지 못하는 것입니다. FooValidator입력 및 출력을 테스트 한 후 수행 방식에 대해 걱정할 필요가 없습니다 . ++
RubberDuck

21

정규식은 강력한 도구 일 수 있지만 복잡한 정규식을 약간만 변경해도 여전히 작동한다고 믿을 수있는 도구는 아닙니다.

따라서 다루어야 할 사례를 문서화하는 많은 테스트를 작성하십시오. 검증에 사용되는 경우 실패해야하는 경우를 문서화하는 많은 테스트를 작성하십시오.

정규식을 변경해야 할 때마다 새로운 사례를 테스트로 추가하고 정규식을 수정하여 최선을 다하십시오.

내가 일반적으로 단위 테스트를 사용하지 않는 조직에 있었다면, 우리가 사용할 정규식을 테스트하는 테스트 프로그램을 작성합니다. 내가해야한다면 내 자신의 시간에 그것을 할 것입니다, 내 머리카락은 더 이상 색을 잃을 필요가 없습니다.


3

정규식은 나머지 응용 프로그램과 함께 코드입니다. 코드 전체가 예상대로 작동하는지 테스트해야합니다. 이것은 몇 가지 목적이 있습니다 :

  • 테스트는 실행 가능한 문서입니다. 코드가 필요한 것을 명확하게 보여줍니다. 그것이 테스트되면 중요합니다.
  • 미래의 유지 보수 담당자는이를 수정하면 테스트에서 동작이 변경되지 않았는지 확인할 수 있습니다.

다른 언어로 된 코드를 포함하여 극복해야 할 추가 장애물이 있으므로 유지 관리의 이점을 위해이 추가주의를 기울여야합니다.


1

즉, 신청 기간을 테스트해야합니다. 더 큰 블랙 박스의 일부로 독립 실행되는 자동 테스트로 정규식을 테스트하든 직접 손으로 바이올린을 사용하든 작동하는지 확인하는 것이 중요합니다.

단위 테스트의 주요 장점은 시간을 절약한다는 것입니다. 그들은 당신이 현재 또는 미래에 원하는만큼 여러 번 테스트 할 수있게합니다. 정규식이 언제든지 리팩토링, 조정, 더 많은 제약 조건 등을 얻는다고 믿을만한 이유가 있다면, 아마도 회귀 테스트를 원하거나 변경 할 때 갈 것입니다. 모든 엣지 케이스를 한 시간 동안 생각할 수 있으므로 중단하지 마십시오. 또는 코드가 무서워서 생활하는 법을 배우고 절대로 변경하지 마십시오.


3
내가 경험 한 경험 법칙; 코드를 작성하고 검사하기 위해 문서가 필요한 경우 단위 테스트가 필요합니다. 그들은 나에게 많은 골칫거리, 널 포인터 잡기, 유형 없음 및 잘못된 출력을 저장했습니다. 또한 최종 사용자는 필연적으로 중단 될 때 최소한의 노력으로 사양에 맞게 코드를 복구 할 수 있습니다.
Aaron3468

-1

다른 한편으로 : 그들 자체는 일부 단위의 인터페이스의 일부가 아니다. 인터페이스 만 테스트하고 정규식을 암시 적으로 테스트하는 방식으로 인터페이스를 테스트하는 것이 좋습니다.

나는 이것으로 당신이 스스로 대답했다고 생각합니다. 단위의 정규 표현식은 구현 세부 정보 일 가능성이 높습니다.

SQL 테스트에 필요한 것은 아마도 정규 표현식에도 해당됩니다. SQL을 변경하면 일부 SQL 클라이언트를 통해 SQL을 실행하여 예상 한 결과를 얻을 수 있는지 확인할 수 있습니다. 정규식을 변경할 때도 마찬가지입니다. 일부 샘플 입력과 함께 정규식 도구를 사용하여 예상대로 작동하는지 확인하십시오.

내가 유용하다고 생각하는 것은 정규 표현식 근처에 일치하는 텍스트 샘플이있는 주석입니다.


" SQL 조각을 변경하면 SQL 클라이언트를 손으로 직접 실행하여 원하는 결과를 얻을 수 있는지 확인할 수 있습니다. "그러나 이런 종류의 질문은 다른 방법으로 질문에 대답합니다. 정규식을 손으로 테스트 한 다음 대신 단위 테스트를 수행해야합니다. 정확히 이것이 결정하기 까다로운 이유입니다!
Lii

정말 달려 있습니다. 단위 테스트를 원하는 것은 변경하는 기능입니다. 특정 정규 표현식을 얼마나 자주 변경합니까? 대답이 종종 있다면 반드시 테스트를 작성하십시오.
Christiaan

8
다른 모든 것들이 동일하다면 "손으로 테스트"보다 자동 테스트를하는 것이 좋습니다.
Robert Harvey

1
자동화를 사용하여 정규식을 테스트하지 않는 이유는 무엇입니까?
Tony Ennis 2016 년

1
그것은 방법의 일부이며 이미 말한 것은 그 방법을 이미 테스트했다면 정규식을 구체적으로 테스트 할 필요가 없다는 것입니다. 그러나 그렇게하면 정규식을 독립적으로 테스트하는 별도의 함수로 추출하는 것이 좋습니다.
Christiaan

-5

물어봐야한다면 대답은 '예'입니다.

일부 FNG가 와서 그가 정규식을 "개선"할 수 있다고 생각한다고 가정 해보십시오. 이제 그는 FNG이므로 자동으로 바보입니다. 어떤 상황에서도 귀중한 코드를 건드리지 말아야 할 사람 ! 그러나 그는 PHB 또는 무언가 와 관련이 있기 때문에 당신이 할 수있는 일은 없습니다.

당신이 PHB가 당신을 쫓아 내고 다시 비명을 지르고 있다는 것을 제외하고는 모든 것이 나빠질 때 "이 엉망진창을 어떻게 만들 었는지 남자에게 알려줄 수 있습니다." 따라서 아름다운 표현력의 걸작품을 만들 때 신중하게 고려한 모든 사례를 기록 하십시오.

그리고 당신이 그것들을 모두 작성 했으므로, 당신은 일련의 테스트 케이스를 갖는 방법의 3 분의 2입니다. 왜냐하면-정규식 테스트 케이스는 프레임 워크가 구축되면 실행하기가 쉽지 않기 때문입니다.

이제 에지 조건, 대안 및 예상 결과가 있습니다. 그리고 갑자기 테스트 사례는 모든 Agile 블로그 게시물에서 약속 한대로 문서화 됩니다. 당신은 그의 "개선"이 기존의 테스트 사례를 통과하지 못한다면 FNG에게 그다지 개선 된 것은 아니라고 지적합니다. 그리고 원래 코드의 문제를 보여주는 그의 제안 된 새로운 테스트 사례는 어디에 있으며, 작동하기 때문에 수정 할 필요가 없습니다!


3
FNG 란 무엇입니까? 이것은 나에게 나쁜 대답은 아니지만 FNG에 대한 정의가 누락되었습니다 (구글 린은 관련이없는 결과를 제공하기 때문에이 답변은 FNG로 인해
다운 투표

1
Google이 귀하를 올바른 위치로 안내했다고 생각합니다. ;-) ( en.wikipedia.org/wiki/FNG_syndrome )
Austin Hastings

당신이 절대적인 프로그래밍 천재가 아니라면, 당신이 새로운 사람을 보는 것처럼 당신이하는 일을 고려하는 더 숙련 된 프로그래머가있을 것입니다. 더 겸손 해지는 것을 고려할 수도 있습니다.
Thorbjørn Ravn Andersen 님이
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.