테스트를 테스트하는 방법? 당면한 과제를 잘못 이해했을 때의 논리적 오류와

우리는 코드가 더 정확하도록 (실제로 부정확하지 않도록) 테스트합니다 . 그러나 테스트는 코드이기도하며 오류가 포함될 수도 있습니다. 그리고 테스트가 버그가 있다면 코드를 개선하기가 어렵습니다.

테스트에서 세 가지 가능한 유형의 오류를 생각할 수 있습니다.

  1. 프로그래머가 당면한 과제를 잘못 이해했을 때의 논리적 오류와 테스트는 그가해야 할 것으로 생각하는 것을 수행합니다.

  2. 기본 테스트 프레임 워크의 오류 (예 : 누출 모의 추상화)

  3. 테스트의 버그 : 테스트는 프로그래머가 생각하는 것과 약간 다릅니다.

타입 (1) 오류는 예방하기가 불가능한 것 같습니다 (프로그래머가 그냥 똑똑하지 않으면). 그러나 (2)와 (3)은 다루기 쉬울 수 있습니다. 이러한 유형의 오류를 어떻게 처리합니까? 이를 피하기위한 특별한 전략이 있습니까? 예를 들어, 테스트 작성자의 전제 조건 만 확인하는 특별한 “빈”테스트를 작성하십니까? 또한 깨진 테스트 사례를 어떻게 디버깅합니까?



답변

테스트는 이미 테스트되었습니다. 테스트는 코드와 기대치의 차이 만 감지하기 때문에 설계는 버그로부터 보호됩니다. 문제가 있으면 오류가 있습니다. 코드에 오류가 있거나 테스트에서 같은 확률로 오류가 발생할 수 있습니다.

  1. 코드와 테스트에서 동일한 버그를 추가하지 못하게하는 몇 가지 기술이 있습니다.

    1. 클라이언트는 구현 자와 다른 사람이어야합니다.
    2. 먼저 테스트를 작성한 다음 코드를 작성하십시오 (Test Driven Development에서와 같이).
  2. 기본 플랫폼을 테스트 할 필요는 없습니다. 테스트는 사용자가 작성한 코드를 실행할뿐 아니라 플랫폼에서도 코드를 실행합니다. 테스트 플랫폼에서 버그를 잡을 필요는 없지만 플랫폼에서 항상 버그를 숨기는 코드 및 테스트를 작성하는 것은 매우 어렵습니다. 즉, 테스트 / 코드 및 플랫폼에서 사용자가 생성 할 때마다 확률이 낮아집니다. 이 작업을 시도하더라도 매우 어려운 작업이됩니다.

  3. 테스트에는 버그가있을 수 있지만 일반적으로 테스트는 개발 된 코드에 의해 테스트되기 때문에 쉽게 발견됩니다. 코드와 테스트 사이에는 자체 시행 피드백이 있습니다. 둘 다 인터페이스의 특정 호출이 어떻게 동작해야하는지 예측합니다. 응답이 다르면 코드에 버그가 없어도됩니다. 테스트에도 버그가있을 수 있습니다.


답변

개별 테스트를 가능한 한 작게 (짧게) 만들어보십시오.

이렇게하면 처음에 버그가 발생할 가능성이 줄어 듭니다. 하나를 만들더라도 더 쉽게 찾을 수 있습니다. 단위 테스트는 작고 구체적이어야하며 실패 및 편차에 대한 내성이 낮습니다.

결국, 그것은 아마도 경험의 문제 일 것입니다. 더 많은 테스트를 작성할수록 더 나은 결과를 얻을 수 있습니다.


답변

한 가지 전술은 테스트하는 코드 전에 테스트를 작성하고 올바른 이유로 테스트가 먼저 실패하는지 확인하는 것입니다. TDD 를 사용하는 경우 최소한이 수준의 테스트 테스트를 받아야합니다.

테스트 스위트의 품질을 테스트하는 더 철저한 방법은 돌연변이 테스트 를 사용하는 것 입니다.


답변

# 1 및 # 3의 경우 : 단위 테스트에는 논리가 포함되어 있지 않아야합니다.이 경우 단위 테스트에서 둘 이상의 항목을 테스트하는 것입니다. 단위 테스트의 한 가지 모범 사례는 단위 테스트 당 하나의 테스트 만하는 것입니다.

Roy Osherove의이 비디오 를보고 단위 테스트를 작성하는 방법에 대해 자세히 알아보십시오.


답변

# 1의 관점에서-나는이 측면에 대해 리뷰 / 쌍을 이루는 것이 좋은 생각이라고 생각합니다. 전치사를 쉽게 만들거나 잘못 이해하는 것은 쉽지만 테스트가 수행하는 작업, 요점을 설명해야하는 경우 잘못된 대상을 목표로 삼을 경우 더 많이 선택할 수 있습니다.


답변

단위 테스트를 중단해야 할 시점이 있어야합니다. 선을 그릴 때 알아야합니다. 테스트 사례를 테스트하기 위해 테스트 사례를 작성해야합니까? 테스트 케이스를 테스트하기 위해 작성된 새로운 테스트 케이스는 어떻습니까? 우리는 그들을 어떻게 테스트 할 것입니까?

if (0 > printf("Hello, world\n")) {
  printf("Printing \"Hello, world\" failed\n");
}

편집 : 의견에서 제안한 설명으로 업데이트되었습니다.


답변

야.
당신은 응용 프로그램에해야합니다 :

  • 당신의 제품
  • 해당 제품에 대한 테스트.

제품에 대해 테스트를 실행하는 경우 실제로 테스트 자체가 아니라 제품과 테스트 사이의 상호 작용영향 을받습니다. 테스트가 실패하면 응용 프로그램에 버그가 있다고 말하는 것은 아닙니다. 그것은 제품과 테스트 사이의 상호 작용이 성공하지 못했다고 말합니다 . 이제 무엇이 잘못되었는지 확인하는 것이 당신의 일입니다. 다음 중 하나 일 수 있습니다.

  • 응용 프로그램이 예상대로 작동하지 않습니다 (이 기대치는 테스트에 표시됨)
  • 응용 프로그램이 올바르게 동작하고 있습니다. 테스트에서이 동작을 올바르게 문서화하지 않았습니다.

나에게 실패한 테스트는 단순한 피드백이 아니며 이것이 잘못되었다는 것이다 . 불일치가 있음을 나타내는 지표이며, 원하는 것이 잘못되었는지 확인하기 위해 둘 다 검사해야합니다. 결국, 나는 응용 프로그램이 올바른지 확인해야 할 책임이 있습니다. 테스트는 검사 할 가치가있는 영역을 강조하는 도구 일뿐입니다.

테스트는 응용 프로그램의 일부만 확인합니다. 응용 프로그램을 테스트하고 테스트를 테스트합니다.