2011-12-23 6 views
2

학습 목적으로, 나는 단위 테스트 분야로 뛰어 들었다. 나는 QT를 사용하여이 문제에 관한 몇 가지 튜토리얼을 읽고, 다음 내놓았다했습니다 단위 테스트의 목적은 무엇입니까?

class QMyUnitTest : public QObject 
{ 
    Q_OBJECT 
private: 
    bool isPrime(unsigned int ui); 
private Q_SLOTS: 
    void myTest(); 
}; 

bool QMyUnitTest::isPrime(unsigned int n) { 
    typedef std::map<unsigned int, bool> Filter; 
    Filter filter; 

    for(unsigned int ui = 2; ui <= n; ui++) { 
     filter[ui] = true; 
    } 
    unsigned int ui = filter.begin()->first; 
    for(Filter::iterator it = filter.begin(); 
     it != filter.end(); it++) { 
     if(it->second) { 
      for(unsigned int uj = ui * ui; uj <= n; uj += ui) { 
       filter[uj] = false; 
      } 
     } 
     ui++; 
    } 
    return filter[n]; 
} 

void QMyUnitTest::myTest() { 
} 

QTEST_MAIN(QMyUnitTest) 
#include "tst_myunittest.moc" 

내가 내 주요 찾기 알고리즘은 비효율적이고, 특히 결함이 알고; 그것은이 방법을 의미합니다. 이제는 철저히 테스트하고 싶지만 다음과 같은 질문이 생깁니다.

무엇이 잘못 될지에 대한 정확한 아이디어는 필요하지 않습니까? 내가 처음 1000 개 개의 소수를 통해 실행하고 그들이 true 또는 1000 프라임하지 번호를 나와서 그들이 false을 나와 있는지 확인하지만 예를 들어 알고리즘에서 결함을 (잡을 수 있는지 확인 할 수 물론

: return filter[n];filter[n]이 존재하지 않을 수 있으므로 분명히 끔찍합니다. n<2 인 경우).

내 기능의 잠재적 인 문제점을 이미 알아야 할 경우 단위 테스트가 무엇입니까?

내가 잘못하고 있니? 테스트 할 수있는 더 좋은 방법이 있습니까?

+0

질문을 설명하는 데 사용 된 태그 이외의 다른 문자가 포함되도록 머리글을 수정하십시오. 예를 들어, "단위 테스트의 목적은 무엇입니까?" –

+0

조언을 주셔서 감사합니다, 나는 그것을 바 꾸었습니다. – nijansen

답변

14

단위 테스트의 목적은 작성한 코드가 실제로 수행 한 작업을 수행하는지 확인하는 것입니다.

정확하고 완전한 테스트를 작성하려면 코드에서 수행해야 할 작업을 정확하게 알아야합니다. 그런 다음 확인하기 위해 테스트를 작성 :

  • 정상 상태를 (겨우 사양 내에 즉 입력)
  • 경계 조건
  • 실패 조건 (즉, "보통"입력이 예상되는 출력을 "정상"생산) (즉, 입력이 유효하지 않은 경우 코드가 올바르게 실패하는지 확인합니다).

숫자가 아닌 isPrime 루틴의 동작을 테스트하는 것이 좋습니다. 구현을 알지 못하면 0, 1, 2 및 음수 값이 isPrime 루틴의 좋은 테스트 케이스가됩니다. 알고리즘을 구현할 때 고려하지 않을 수도있는 값이므로 중요한 테스트입니다.

정상적인 조건을 확인하는 것이 반드시 가장 쉬운 부분은 아니라는 점에 유의하십시오. 이 경우와 마찬가지로 알고리즘이 완벽하다는 것을 확인하려면 수학적 분석이 필요하고 코드가 올바르게 구현하는지 확인해야하며 때로는 어렵습니다. 수백 개의 알려진 값을 검사하는 것만으로는 충분하지 않습니다 (101 번째 값에서 실패 할 수도 있음).

내 기능의 잠재적 인 문제점을 이미 알고 있다면 단위 테스트가 무엇입니까?

역순으로 처리했습니다. 구현 코드를 염두에두고 유닛 테스트를 작성하지 마십시오. 명세 사항을 염두에두고 작성하십시오. 코드가 사양에 맞아야하고 테스트에서 가능한 한 많이 테스트해야합니다. (코드 커버리지 도구는 대량 테스트가 완료되면 경계 조건을 찾는 데 도움이됩니다.)

+0

음수는'unsigned int'에 대한 좋은 인스턴스가 아닐 것입니다. –

+0

+1 내가 일하고있는 문장과 정확히 똑같은 문장을 쓰려면 : "당신은 그 반대가됩니다." –

+0

예 아니오. 서명되지 않은 변환 (또는 서명 된/서명되지 않은 비교)은 과거에 C (또는 C++) 개발자 한 명 이상을 물었지만 조만간 변경 될 것으로 보지는 않습니다. (이 특별한 경우,'-1'은 단지 컴파일러 경고가 무시되었다고 가정하면서 완료 될 것입니다. – Mat

9

그냥 싶어 매트가 이미 목록에 무엇을 추가

  • 단위 테스트는 미래에 코드 작업을 다른 사람이 실수로 코드의 동작을 변경하지 않도록합니다.

  • 정확하게 쓰여진 경우 단위 테스트를 통해 코드의 동작을 문서화 할 수 있습니다.

+1

+1, 매우 중요합니다! –

+1

이 중요한 점에 대한 약간의 확장 : 코드는 처음 쓰기 작업 도중 이해되지 않습니다. 단위 테스트는 자동으로 테스트 가능한 방식으로 예상 코드 동작에 대한 지식을 기록하는 방법입니다. 따라서,이 단위 테스트는 잘못된 유지 보수 또는 정상 작동으로 예상되는 유지 보수 담당자에게 보내는 메시지입니다. – thiton

+1

예. 테스트를 가능한 한 빨리 작성하십시오. 이상적으로 * 구현 코드가 전달되기 전에 테스트를 작성하십시오. –

관련 문제