단위 테스트 생성 자동화


11

단위 테스트 사례 작성을 자동화하는 데 사용할 수있는 몇 가지 전략은 무엇입니까? 적어도 괜찮은 테스트 사례 스켈레톤을 생성하려면 각 클래스에서 어떤 측면을 살펴 봐야합니까?

포괄적 인 자동 솔루션이 실용적이지 않다는 것을 알고 있지만 최소한 골격을 만들어서 테스트 생성 속도를 높이고 싶습니다. 코드 예제를 찾고 있지 않습니다. 어떻게 시작 해야하는지에 대한 제안이나 이와 같은 작업이 수행 된 위치에 대한 예제를 통해 코드 접근 방식과 가능한 방법을 알 수 있습니다.

특히 PHP에서 단위 테스트 스켈레톤을 만드는 방법에 관심이 있습니다 . 예를 들어 완전한 유형 힌트 와 같이 다른 언어가 제공하는 모든 도구를 제공하지는 않습니다 .


최신 Visual Studio 만 있으면됩니다.
Job

답변:


5

전략과 골격은 사소하게, 어떤 종류의 테스트를 생성하고자하는지, 어떤 종류의 커버리지를 찾고 있는지, 그리고 사용중인 언어 / 환경에 달려 있습니다.

C 또는 Java와 같은 언어의 경우 클래스 서명을 읽고 표준 코너 사례에 대한 테스트를 자동으로 생성하는 테스트 생성기를 작성하는 것이 매우 간단합니다 (0, 2 개의 임의 값, MAX_INT, MIN_INT를 정수 인수로 전달, 널 입력 가능 널을 널로 전달 함). 등). 그런 다음 생성 된 테스트를 실행하고 각 테스트에 대한 결과를 기록한 다음 수동으로 필터링하여 관련이없는 테스트를 제거하고 통과 한 테스트에 대해 허용 가능한 결과를 승인하고 (그러면 자동으로 통과 할 수 있음) 실패한 테스트로 표시 할 수 있습니다. .

클래스에 태그 / 코멘트 / 리팩토링을 사용하여이 기능을 보강하여 생성기에 추가 힌트를 제공 할 수 있습니다. 메소드 호출로 발생 가능한 모든 예외를 나열하거나 정수 인수에 대해 유효한 정수 범위를 줄이는 태그가있을 수 있습니다. 테스트를 직접 작성해야하는 속기라고 생각하십시오.

다음은 살펴볼 구성 요소입니다.

  • 소스 코드 / 함수 서명 / 수동 주석을 자동으로 구문 분석하고 표준 테스트 사례를 생성하거나 입력이 완료되기를 기다리는 테스트 사례에 대한 개요 / 서명을 자동으로 분석하는 구성 요소입니다.
  • 자동화 된 테스트 빌더에 대한 힌트를 나타내는 모든 수준의 세분성 (메소드 / 클래스 / 서명 / 루프 루프 등)으로 이동할 수있는 태그 / 주석 / 코멘트의 언어가 지속적으로 성장 / 변경됩니다. 이상적으로는 프레임 워크 또는 덩어리를 다시 코딩하지 않고도이 언어로 재생할 수 있어야합니다
  • 새로운 / 이전 테스트를 식별하고 각 테스트에 대해 "허용 가능한"답변에 대해 기록 / 테스트 할 수있는 기능을 갖춘 자동화 된 테스트 러너. 이상적으로이 러너는 테스트 실행 데이터베이스, 수락 / 거부 된 결과 및 각 테스트에 대해 현재 허용 가능한 결과를 구축합니다.
  • 클래스 이름 및 이름-> 값의 맵이 주어지면 클래스를 모방하는 객체를 생성하여 함수 호출, 접근 자, 공개 데이터 슬롯 등에 대한 사용자 정의 가능한 데이터를 반환 할 수있는 자동화 된 "개체 가짜"

다양한 언어와 플랫폼을 위해이 기능을 이미 포함하고있는 많은 테스트 프레임 워크가 있습니다. 이 작업을 직접 시작하고 유기적으로 사내에서 이런 종류의 프레임 워크를 성장시키는 것은 상당히 쉬운 일이지만, 기존 작업을 복제 할 수있는 끝없는 장기 프로젝트이기도합니다. 먼저 사용할 수있는 것을 살펴본 다음 다이빙 할 가치가 있는지 결정하는 것이 좋습니다.


5

아직 크기 나 복잡성이 높은 응용 프로그램에서 사용할 수는 없었지만 Google의 CodePro AnalytiX를 포함하여 Java 응용 프로그램의 단위 테스트 생성자동화하는 도구가 있습니다 . 또한 C ++ 단위 테스트를 생성 할 수있는 상용 제품인 Parasoft 's C ++ Test 도 발견했습니다.

이러한 응용 프로그램은 휴리스틱을 사용하여 테스트 사례를 생성했습니다. 골격을 만드는 데 사용할 수있는 단일 프레임 워크가 있는지 확실하지 않지만 찾을 수있는 구문이 있습니다. 루프, 조건문 ( if블록, switch/ case문) 및 예외 에 중점을두고 다른 실행 경로를 강제로 실행하는 테스트 케이스를 작성 하는 경향이 있습니다.

스켈레톤 또는 템플릿을 만들려고 시도하는 대신 테스트 작성 속도를 높이는 것이 아니라 사양 및 / 또는 구현 분석을 개선하고 고품질 테스트를 작성하는 데 중점을 둡니다. 어떤 테스트가 조기에 가장 큰 가치를 더하는지 파악하고 작성한 다음 나중에 구멍을 채우면 생산성과 품질에 더 큰 영향을 미칩니다.


더 많은 홍보를 제공하기 위해 Falcon 은 프로젝트에서 CodePro를 사용해 보았고 그의 경험에 대해 약간의 글을 썼습니다 .


구글의 CodePro Analytix는 흥미롭게 들린다. 그러나 "Quis custodiet ipsos custodes?" 누가 테스트를 테스트합니까? 이것은 단위 테스트를 통해 기존 프로젝트를 백업하는 데만 사용할 수 있으며 실패를 감지하지 못할 것이며 결함이 올바른 것으로 가정합니다.
팔콘

@Falcon 맹목적으로 어떤 도구도 신뢰할 수 없습니다. 그렇게하면 두통이 더 커질 것입니다. 실용 프로그래머의 팁 "귀하의 기술에 대한 관리"가 여기에 적용된다고 생각합니다. CodePro에는 테스트 편집기가 포함되어있어 전달되는 값과 예상 결과가 무엇인지 확인한 다음 변경을 수행하고 생성 된 테스트 코드를 업데이트하여 이러한 변경 사항을 반영합니다.
Thomas Owens

이 경우 인간이나 기계에서 더 안정적인 것이 무엇인지 궁금합니다. 이러한 생성 된 테스트는 수동으로 작성된 테스트보다 더 많은 두통을 유발할 것으로 생각합니다. 어쨌든 테스트는 먼저 작성해야합니다. 그러나 나는 그것을 시도 할 것입니다. 공식적인 요구 사항과 시스템을 인터페이스하기위한 메타 데이터 접착제를 기반으로 테스트를 생성 할 수있는 도구를보고 싶습니다.
팔콘

@Falcon 예, 이상적으로는 일부 테스트를 먼저 작성해야하지만 구현이 있고 화이트 박스 테스트를 수행 할 수있을 때까지 구현 한 후에 볼 수있는 다른 모든 경우를 반드시 볼 필요는 없습니다. CodePro의 테스트 생성 기능을 사용할 기회가 있다면 생각을 어딘가에 게시하고 어떻게 든 링크를 얻을 수 있습니까? 나는 그것이 잘 작동하고 다른 사람들의 경험에 관심이 있습니다.
Thomas Owens

다음 주에는 정말 엄격한 비즈니스 규칙을 통합하고 여기에서 내 경험에 대해 알려주는 중간 크기의 J2EE 애플리케이션 (120 kloc)으로 테스트 할 것입니다.
팔콘

1

몇 년 전에 .NET 프로젝트의 단위 테스트 속도를 높이기 위해 생성기를 작성했습니다. 단위 테스트가없는 큰 코드베이스가 있었고 기본 범위를 빠르게 늘리는 것이 목표였습니다. 도움이 될만한 몇 가지 참고 사항은 다음과 같습니다.

  • 프로젝트가 개발 된 핵심 프레임 워크가 표준 운영 및 클래스 명명을 제공했을 가능성이 있습니다. 직접 작성하려고 생각하는 경우 이와 같은 표준 구조가 크게 도움이됩니다.
  • data-driven testing코드베이스가 허용하는 경우 사용 하면 많은 도움이됩니다. 테스트 프레임 워크는 테스트 데이터를 저장하기 위해 각 단위 테스트에 대한 데이터베이스 테이블을 작성하여 해당 테이블의 각 행이 별도의 테스트였으며 추가 코드가 필요하지 않았습니다 ( Rule of Representation ). 이 시점부터 실제 테스트를 자동으로 쉽게 만들거나 수동으로 입력 할 수 있습니다.
  • 결과적인 단위 테스트는 간단하지만 smoke test적어도 s의 역할을했습니다 . 위험도가 높은 영역에 대해서는 추가 수동 테스트를 작성했습니다.

요약하면, 나는 일반적인 해결책이 실용적이지 않다는 것에 동의합니다 (가능한 경우). 코드베이스가 테스트 생성에 적합하고 테스트 프레임 워크가 그 구조를 활용할 수 있다면 기회가 더 낫다고 생각합니다.

(부수적으로 Pex 는 있지만 .NET 용입니다.)

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