단위 테스트라고하는 기능 테스트보다 적절한 단위 테스트의 실질적인 이점은 무엇입니까?


9

내가 작업중 인 프로젝트에는 제대로 조롱되지 않은 많은 레거시 테스트가 있습니다. 이 때문에 정적, 인수가있는 생성자 등을 지원하지 않는 EasyMock만이 유일한 종속성입니다. 테스트는 대신 데이터베이스 연결에 의존하여 테스트를 "실행"합니다. 이러한 경우를 처리하기 위해 Powermock을 추가하는 것은 기존 프로젝트를 지원하기 위해 업그레이드해야 할 필요성으로 인해 비용이 엄청나게 줄어 들었습니다 (또 다른 논의).

제 질문은, 적절한 단위 테스트의 실제 세계 유형 혜택 중 어떤 것을 되돌려 놓을 수 있습니까? 거기 아무도 없나요? 나쁜 단위 테스트 (작동하더라도)가 나쁘다는 말로 고집하는 사람입니까? 코드 적용 범위가 효과적입니까?


3
아마도 여러분이 작성하는 코드는 좀 더 테스트 가능하도록 구조적 변경을 통해 이점을 얻을 수 있습니다. 우리는 조롱 프레임 워크 없이 시설에서 단위 테스트를 광범위하게 사용하며 우리 에게는 꽤 잘 작동하는 것 같습니다.
Robert Harvey

와우, 제 3 자 JAR 통합으로 이것을 관리하는 방법에 관심이 있습니다. 예나 링크가 있습니까?
Jackie

1
우리는 써드 파티 JAR 통합을 사용하지 않습니다. :) 그러나 필요에 따라 스텁을 만듭니다. 조롱 프레임 워크는 동일한 것을 달성하기위한 편의 일뿐입니다. 그러나 그 과정이 너무 힘들면 코딩 방식을 다시 생각해야합니다.
Robert Harvey

답변:


8
  • 자원

    테스트를 실행하려면 테스트 데이터베이스가 필요합니다. 데이터베이스를 실행하는 하드웨어는 powermock을 사용하는 것보다 비쌉니다. 데이터베이스에 대한 단위 테스트에 사용 된 리소스를 해제하면 회사에서 서버를 빨리 업그레이드 할 필요가 없습니다.

  • 신뢰할 수 있음

    데이터베이스가 다운되었거나 불일치 상태이므로 테스트에 실패 할 수 있습니다. DBA가 낮 동안 dev 서버를 업그레이드하여 일부 업그레이드를 수행했기 때문에 빌드가 실패한 것을 추측하십시오 (이제 개발자는 코드가 아닌 경우 코드에서 무엇이 잘못되었는지 파악하려고합니다).

  • 추가 유지 보수

    테스트는 어떤 순서로든 실행할 수 있습니다. 테스트를 추가하거나 제거하면 테스트 스위트가 실패하지 않아야합니다. 데이터베이스에 대해 실행하면 (데이터베이스에) 어딘가에 상태가 있음을 의미합니다. 일반적으로 이러한 테스트는 데이터베이스가 다음 테스트 실행을 위해 적절한 상태를 유지하도록 추가 유지 관리가 필요합니다.

  • 동시성

    두 명의 개발자가 동시에 단위 테스트를 실행합니다. 데이터베이스가 있으면 테스트가 데이터베이스에서 충돌 할 수 있습니다. 이에 대한 해결책은 실행되는 각 테스트마다 데이터베이스를 복제하는 것이며, 이는 실제 데이터베이스에서 금지됩니다. 고려해야 할 다른 옵션이 있습니다.

사용중인 데이터베이스의 방언과 함께 HSQLDB 를 사용하는 것도 고려하십시오 . 이 방법으로 각 테스트마다 메모리 데이터베이스를 작성할 수 있습니다. 단위 테스트가 실행되고 필요한 데이터베이스를 구성하며 데이터를로드하며 코드의 데이터베이스 연결이 HSQLDB에 연결되어 테스트 데이터에 대해 실행됩니다.


4

제 질문은, 적절한 단위 테스트의 실제 세계 유형 혜택 중 어떤 것을 되돌려 놓을 수 있습니까?

좋은 단위 테스트는 다음과 같습니다 (깨끗한 코드 및 기타).

  • 빠른
  • 독립적 인
  • 반복 가능
  • 자체 검증
  • 시기 적절한

실제 단위 테스트가 없으면 처음 세 개 (및 일반적으로 마지막 하나)를 위반합니다. 이로 인해 몇 가지 중요한 문제가 발생합니다.

  1. 테스트 속도가 느립니다. 느린 테스트는 자주 실행되지 않습니다. 실행되지 않은 테스트는 거의 쓸모가 없습니다.
  2. 테스트중인 코드와 관련이없는 이유로 테스트가 실패 할 수 있습니다. 이로 인해 테스트가 실패한 이유를 찾기가 더 어려워지고 시간을 낭비하고 사람들이 코드가 아닌 환경을 비난하도록 이끌었습니다.
  3. 데이터베이스가 변경되면 결과가 변경됩니다. 테스트를 위해 일관성 있고 유지 관리가 잘되는 상태로 데이터베이스를 얻는 것은 번거롭고 성가 시며 오류가 발생하기 쉽습니다.

일반적으로 단위 테스트에서 분리가 이루어지지 않으면 테스트 시간이 길어지고 작성 시간이 오래 걸리고 조사 시간이 오래 걸리며 코드베이스에 대한 신뢰도가 떨어집니다. 결과적으로 사람들은 적은 테스트를 작성하거나 혼란을 초래하는 하향 나선형 인 테스트를 더 무시합니다.


2

단위 테스트는 개발자가 안정적인 코드를 제공하는 데 도움이되는 도구입니다. 당신의 상사가 생각하는 것처럼 생각한다면, 당신이 제안한 것이 말이되는지 그를 설득 할 수있을 것입니다. 그러나 밴드 왜건에 전도자로 제시하면 자원이 할당되지 않습니다. 단위 테스트를 개조하는 데 시간과 리소스를 사용하여 레거시 응용 프로그램에 어떤 이점이 있는지 설명해야합니다.

레거시 코드를 암시하는 레거시 테스트를 언급했습니다. 불행히도, 단위 테스트 용으로 설계되지 않은 코드에 단위 테스트를 맞추는 것은 어렵고 시간이 많이 걸리며 비용이 많이 드는 프로세스입니다. 유용한 결과를 제공하는 테스트가 있으면 비즈니스 사례가 더욱 어려워지고 비즈니스 결과 POV에서 동일한 결과를 제공하는 대체 테스트 만 수행하면됩니다. 당신은 비용 (시간) 절약에 집중해야합니다 .....

내 생각에 당신은 보스가 없기 때문에 상사에게 강력한 비즈니스 사례를 제시 할 수 없을 것입니다.


나는 당신이 여기에서 오는 곳을 확실히 알 수 있지만,이 사업 사례를 만드는 방법을 더 찾고있었습니다. 마진에서 품질에 대한 걱정은 비용이 엄청납니다.
Jackie

1

당신이 묘사 한 것에서 테스트 프레임 워크 A를 좋아하지 않고 테스트 프레임 워크 B로 전환하고 싶은 것처럼 들립니다. 그것을 빨아 들여서 기존의 것과 작동하는 것을 사용하고, 바퀴를 재발 명하는 더 많은 작업을 만들지 않으므로 선호하는 테스트 프레임 워크를 사용할 수 있습니다.

기존 작업 코드를 버리고 사용자에게 실질적으로 제로의 이익을 위해 막대한 시간과 돈을 소비하는 것을 정당화하기 위해 최신 달 프레임 워크를 사용하는 것보다 더 많은 시간이 필요합니다.


정확하게 이것들은 프레임 워크의 문제가 아니며 테스트가 다른 리소스에 액세스하도록 허용하는 문제가 아닙니다. 따라서 본질적으로 단위 테스트 대신 기능 테스트가 수행됩니다. "frameworks"는 JUnit과 EasyMock (이전 버전 임)입니다. 새로운 종속 프레임 워크를 추가하는 것이 좋습니다.
Jackie

1

좋은 단위 테스트는 현지화를 제공합니다. 기능 테스트에서 "사용자 추가 기능이 손상되었습니다"라는 메시지가 표시 될 수 있지만, 데이터베이스의 USER.LAST_NAME 필드가 널이 아닌 것으로 변경되었으므로 단위 테스트를 잘 수행하면 오류가 발생했음을 알 수 있습니다. 복잡한 테스트 환경 (일부 테스트를 위해 다시 초기화하거나 제거해야 할 수도 있음)이 필요하지 않고 작은 변경 사항을 직접 테스트 할 수도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.