4

일반적으로 적당히 작고 잘 정의 된 입력 집합을 사용하면 올바른 동작을 쉽게 정의한 코드에 대해 단위 테스트를 사용하려고합니다. 이것은 버그 잡기에 아주 잘 작동하며 제 개인적인 제네릭 함수 라이브러리에서 항상 그렇게합니다.정확도가 잘못 정의 된 테스트?

그러나 많은 코드는 기본적으로 큰 데이터 세트에서 중요한 패턴을 찾는 데이터 마이닝 코드입니다. 이 경우의 올바른 행동은 종종 잘 정의되지 않고 인간이 예측하기 쉽지 않은 방식으로 많은 다른 입력에 의존합니다 (예 : 수학이 손으로 합리적으로 수행 될 수 없으므로 컴퓨터가 먼저 문제를 해결하기 위해). 합리적인 테스트 사례를 제시하는 것이 거의 불가능할 정도로 이러한 입력은 매우 복잡 할 수 있습니다. 테스트 할 가치가있는 가장자리 사례를 확인하는 것은 매우 어렵습니다. 알고리즘이 결정적이지 않은 경우도 있습니다.

보통 나는 온전한 검사를 위해 어설 션을 사용하고 알려진 패턴의 작은 장난감 테스트 케이스를 작성하고 객관적으로 정확하지 않으면 서 적어도 "합리적인 것처럼 보입니다"라는 대답을 비공식적으로 보는 것으로 가능한 최선을 다합니다. 이런 종류의 사례를 테스트하는 더 좋은 방법이 있습니까?

답변

-2

궁극적으로, 프로그램에서 수행해야 할 작업을 결정한 다음이를 테스트해야합니다.

+0

-1 그는 시험하는 법을 물었고, 시험을하라고했습니다. 아마도 당신은 정교 할 수 있습니다. – DevinB

3

난 당신이 코드를 정확히 원하는대로하고 있는지 확인합니다 작은 데이터 집합을 기반으로 단위 테스트를 작성해야 할 것 같아요. 합리적인 데이터 마이닝 알고리즘을 제공한다면 별도의 문제이므로 단위 테스트를 통해 문제를 해결할 수 있다고 생각하지 않습니다.

  1. 정확하게 주어진 데이터 마이닝 알고리즘 구현 귀하의 코드 (이 일을 당신이해야 단위 테스트)
  2. 당신이 구현 데이터 마이닝 알고리즘은 "올바른"입니다 : 코드의 정확성이 "수준"이 있습니다 - 비즈니스 문제를 해결합니다. 이것은 매우 열려있는 질문입니다. 아마도 알고리즘의 일부 매개 변수와 실제 데이터 (다른 알고리즘이 서로 다른 유형의 데이터에서 작동 함)에 따라 달라질 수 있습니다.
1

글쎄, 몇 가지 대답이 있습니다. 먼저, 언급 한대로 소규모 사례 연구를 수작업으로 수행하십시오. 알고리즘을 작성 했으므로 알고리즘이 무엇을해야하는지 알기 때문에 제한된 경우에 수행 할 수 있습니다.

다른 하나는 프로그램의 모든 구성 요소를 테스트 할 수있는 부분으로 분해하는 것입니다. A 호출 B가 C 호출 D를 호출하고 A, B, C, D가 모두 올바른 대답을하고 A-> B, B-> C 및 C-> D를 테스트하면 다음을 수행 할 수 있습니다. A-> D가 정확한 응답을 제공하고 있다고 합리적으로 확신하십시오.

또한, 찾고있는 것을 수행하는 다른 프로그램이 있다면 해당 데이터 세트를 시도해보십시오. 또는 테스트 데이터를 사용할 수있는 오픈 소스 프로젝트와 응용 프로그램이 유사한 결과를 제공하는지 확인하십시오.

데이터 마이닝 코드를 테스트하는 또 다른 방법은 테스트 세트를 가져 와서 찾고자하는 유형의 패턴을 도입 한 다음 다시 테스트하여 이전 패턴과 새 패턴을 분리할지 여부를 확인하는 것입니다 .

그리고 시도해 본 자신의 코드를 손으로 직접 살펴보고 코드가 의미하는 바를 수행하는지 확인하십시오.

3

이렇게 대면하는 경우 실제 데이터의 적절한 기본 복잡성을 반영하는 하나 이상의 스터브 데이터 세트를 작성하는 경향이 있습니다.나는 고객과 함께이 작업을 수행하여 복잡한 문제의 핵심을 포착합니다.

다음은 매우 특정한 단위 테스트를 만들기위한 기초로 사용할 수있는 하나 이상의 데이터 세트로 정리할 수 있습니다. (때로는 스텁 데이터를 사용하는 통합 테스트와 비슷하지만 중요한 구분이라고 생각하지 않습니다.). 따라서 알고리즘에 "일반"데이터 세트에 대한 "퍼지"결과가있을 수 있지만 이러한 알고리즘에는 거의 항상 특정 데이터 세트에 대해 하나의 정답이 있습니다.

0

실제적으로 도전 과제는 다음과 같습니다. 응용 프로그램이 퍼지면서 결정적이지 않은 종류의 작업을 현명한 방법으로 수행하기 때문에 응용 프로그램이 인간보다 낫다는 것을 목표로합니다. 이러한 패턴을 발견. 그것은 훌륭하고 강력하며 시원합니다 ... 그러나 당신이 그것을 떼어 내면 모든 인간은 "이 경우 대답은 X 여야합니다."라고 말하는 것은 매우 어려워집니다.

실제로 컴퓨터는 "실제로는 아닙니다. 왜 그렇게 생각하는지 알 겠지만이 4.2 테라 바이트의 정보는 여기를 고려하십시오. 아직 읽었습니까? Z 여야합니다. "

원래 목표에 실제로 성공했다면 최종 사용자는 "Zowie, 맞습니다. 그게 더 좋은 대답입니다. 우리가 돈을 벌 수있는 패턴을 발견했습니다. (또는 우리 돈, 또는 뭐든간에). "

그런 일은 결코 일어나지 않을 수 있습니다. 그렇다면 왜 컴퓨터에 이런 종류의 패턴을 감지하도록 요청합니까?

제가 생각할 수있는 가장 좋은 점은 실생활이 테스트 시나리오 목록을 작성하도록 도와주는 것입니다. 이전에 발견 된 패턴이 귀중한 것으로 밝혀진 경우 유사한 데이터가 제공 될 때 시스템이이를 발견하면 "단위 테스트"를 작성하십시오. 통합 테스트와 같을 수 있기 때문에 "단위 테스트"를 따옴표로 사용하지만 NUnit 또는 VS.Net 또는 RSpec 또는 사용중인 단위 테스트 도구를 사용하도록 선택할 수 있습니다.

이러한 테스트 중 일부에서는 4.2 테라 바이트의 데이터를 "모의"하려고합니다. 실제로 데이터를 조롱하지는 않지만 일부 높은 수준에서는 데이터에서 도달 한 결론을 조롱하게됩니다.). 다른 사람들을 위해, 당신은 어떤 데이터가있는 "테스트 데이터베이스"를 가지고있을 것입니다.이 데이터로부터 당신은 일련의 패턴을 탐지 할 것으로 기대합니다.

또한 시스템에서 감지 할 수있는 패턴 뒤에 "추론을 설명 할 수있는"기능이 있으면 좋을 것입니다. 이를 통해 비즈니스 사용자는 애플리케이션의 적합성 여부에 대한 의문을 제기 할 수 있습니다.

0

이것은 까다 롭습니다. 이것은 텍스트 검색 엔진에 대한 테스트 작성과 비슷합니다. 당신이 어려움을 겪고 계속하는 경우, 당신이 뭔가를 알아낼 수 있습니다 : 단순화 된, 작지만 합리적 대표적인 데이터 샘플

  • 시작을하고 기본 동작을 테스트이
  • 보다는 출력이 정확히 어떤 대답이라고 주장, 때로는 중요한 점이 무엇인지 파악하는 것이 좋습니다. 예를 들어 검색 엔진의 경우 세 가지 핵심 항목이 첫 번째 결과 페이지에있는 한 문서의 나열 순서와 관련이 없습니다.
  • 작고 점진적인 변화를 만들면서 그 본질이 무엇인지 파악하고 그에 대한 테스트를 작성하십시오. 전반적인 계산에는 많은 입력이 필요하지만 코드베이스에 대한 개별 변경은 격리 가능해야합니다. 예를 들어 일부 핵심 단어에 하이픈이 있기 때문에 특정 문서가 표시되지 않는 것으로 나타났습니다. 우리는 이것이 우리가 예상했던대로 행동하고 있음을 테스트하는 테스트를 만들었습니다.
  • 휘트니스 (Fitness)와 같은 도구를 보면 코드 조각에 많은 수의 데이터 세트를 던져 결과에 대한 것들을 주장 할 수 있습니다. 이것은 전통적인 단위 테스트보다 이해하기 쉽습니다.
  • 제품 소유자에게 "이 방법이 어떻게 작동하는지 이해할 수 없습니다. 우리는 그것이 올바른지 어떻게 알 수 있습니까?"라고 말했습니다. 어쩌면 막연하게 정의 된 문제의 본질을 표현할 수 있습니다. 이것은 많은 시간 나를 위해 을 정말로 잘 일했고, 나는 그들이 설명 될 수 없기 때문에 사람들을 기능들과 이야기했습니다.
  • 창의력을 발휘하십시오!
관련 문제